CRM. Конфликт блокировок при выполнении транзакции
Внимание! Данный форум является модерируемым.
Для получения к нему доступа необходимо зарегистрироваться или авторизоваться на сайте.
Доступ к форуму партнерам «1C-Рарус» по дистрибуции предоставляется на сайте
rarus-soft.ru
Вероятно, проблема у нас была связана со следующим:
Для хранения значений некоторых групп событий были созданы константы.
На форму документа "Событие" было выведено поле, при выборе значения которого происходило создание нового "События". Группа создаваемого события зависела от группы исходного События (группа исходного события сравнивалась со значением константы). Все это происходило в транзакции. Код целиком не привожу, примерно так (чтобы смысл был понятен):
СоздаватьСобытие = Ложь;
Если тРезультатПереговоров = Перечисления.РезультатыПереговоров.ЗаключенКонтракт Тогда
СоздаватьСобытие = Истина;
ГруппаНовогоСобытия = Константы.ГруппаСобытийКонтракт.Получить();
ИначеЕсли тРезультатПереговоров = ... Тогда
...
КонецЕсли;
Если СоздаватьСобытие Тогда
НачатьТранзакцию();
Если Модифицированность Тогда
ТекстВопроса = "Для выполнения данной операции необходимо записать документ. Записать?";
Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Если Ответ <> КодВозвратаДиалога.Да Тогда
ОтменитьТранзакцию();
Возврат;
Иначе
Попытка
УспешноЗаписано = ЗаписатьВФорме();
Исключение
Сообщить(ОписаниеОшибки());
ОтменитьТранзакцию();
Возврат;
КонецПопытки;
КонецЕсли;
КонецЕсли;
Если Не УспешноЗаписано Тогда
ОтменитьТранзакцию();
Возврат;
КонецЕсли;
НовоеСобытие = Документы.Событие.СоздатьДокумент();
НовоеСобытие.Заполнить(Ссылка);
НовоеСобытие.ГруппаСобытия = ГруппаНовогоСобытия;
Форма = НовоеСобытие.ПолучитьФорму("CRM_ФормаДокумента");
Результат = Форма.ОткрытьМодально();
Если НЕ НовоеСобытие.Проведен Тогда
ОтменитьТранзакцию();
Иначе
РезультатПереговоров = тРезультатПереговоров;
ЗафиксироватьТранзакцию();
КонецЕсли;
КонецЕсли;
Сейчас транзакции при выполнении данной операции убрала и пока (с субботы) подобных ошибок больше не было.
НачатьТранзакцию();
СоздаватьСобытие = Ложь;
Если тРезультатПереговоров = Перечисления.РезультатыПереговоров.ЗаключенКонтракт Тогда
СоздаватьСобытие = Истина;
ГруппаНовогоСобытия = Константы.ГруппаСобытийКонтракт.Получить();
ИначеЕсли тРезультатПереговоров = ... Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
Если СоздаватьСобытие Тогда
Если Модифицированность Тогда
ТекстВопроса = "Для выполнения данной операции необходимо записать документ. Записать?";
Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Если Ответ <> КодВозвратаДиалога.Да Тогда
ОтменитьТранзакцию();
Возврат;
Иначе
Попытка
УспешноЗаписано = ЗаписатьВФорме();
Исключение
Сообщить(ОписаниеОшибки());
ОтменитьТранзакцию();
Возврат;
КонецПопытки;
КонецЕсли;
КонецЕсли;
Если Не УспешноЗаписано Тогда
ОтменитьТранзакцию();
Возврат;
КонецЕсли;
НовоеСобытие = Документы.Событие.СоздатьДокумент();
НовоеСобытие.Заполнить(Ссылка);
НовоеСобытие.ГруппаСобытия = ГруппаНовогоСобытия;
Форма = НовоеСобытие.ПолучитьФорму("CRM_ФормаДокумента");
Результат = Форма.ОткрытьМодально();
Если НЕ НовоеСобытие.Проведен Тогда
ОтменитьТранзакцию();
Иначе
РезультатПереговоров = тРезультатПереговоров;
ЗафиксироватьТранзакцию();
КонецЕсли;
КонецЕсли;
Надеюсь, эти константы не изменяются в процессе создания событий и т.п.?
таблица констант всегда блокируется полностью и константы нельзя перезаписывать при проведении и других операциях, в которых могут возникать конкурентные блокировки.
Лучше для этого использовать регистр сведений или хотя бы справочник с предопределенными элементами.
Результат = Форма.ОткрытьМодально();
То есть вы просто берете и блокируете работу до тех пор, пока форму не закроют и выполнение не пойдет далее, чтобы зафиксировать транзакцию!