Конфигурация УТ для Украины 2.3 (доработанная много чем), платформа 8.3.8.1784.
И вот снова конфликт блокировки транзакций, где около 200 пользователей одновременно блокируют друг друга. Отложенное проведение по партиям уже не помагает, прижало до реализации управляемых блокировок.
На основе
необходимо зарегистрироваться для просмотра ссылки придумал реализовать блокировки по складу следующим образом:
1. Переводим саму конфигурацию на чисто управляемые блокировки.
2. Создаем подписку на событие "ОбработкаПроверкиЗаполнения", источник - ДокументОбъект.
3. Процедура подписки:
необходимо зарегистрироваться для просмотра ссылки Процедура УправляемыеБлокировкиОбработкаПроверкиЗаполнения(Источник, Отказ, ПроверяемыеРеквизиты) Экспорт
Если Отказ Тогда
Возврат;
КонецЕсли;
РежимБлокировки = РежимБлокировкиДанных.Исключительный;
Блокировка = Новый БлокировкаДанных();
//Определения имени пространства для "Документ"
Если Метаданные.Документы.Индекс(Источник.Метаданные()) <> - 1 Тогда
ИмяОбъектаПространстваБлокировок = "Документ." + Источник.Метаданные().Имя;
//Блокировка самого документа
ЭлементБлокировки = Блокировка.Добавить(ИмяОбъектаПространстваБлокировок);
ЭлементБлокировки.Режим = РежимБлокировки;
ЭлементБлокировки.УстановитьЗначение("Ссылка", Источник.Ссылка);
КонецЕсли;
//Определения имени пространства для "Последовательность"
Для Каждого ТекПоследовательность Из Последовательности Цикл
Если ТекПоследовательность.Принадлежит(Источник.Ссылка) Тогда
//Необходимо заблокировать последовательность
ЭлементБлокировки = Блокировка.Добавить("Последовательность." + Прав(Строка(ТекПоследовательность), СтрДлина(Строка(ТекПоследовательность)) - Найти(Строка(ТекПоследовательность), ".")) + ".НаборЗаписей");
ЭлементБлокировки.Режим = РежимБлокировки;
КонецЕсли;
КонецЦикла;
//Определения имени пространства для "Регистров"
КоллекцияДвижений = Источник.Метаданные().Движения;
Для Каждого ТекРегистрДвижения Из КоллекцияДвижений Цикл
ИмяРегистра = ТекРегистрДвижения.Имя;
ТипРегистра = "";
Если Метаданные.РегистрыНакопления.Найти(ИмяРегистра) <> Неопределено Тогда
ТипРегистра = "РегистрНакопления";
ИначеЕсли Метаданные.РегистрыБухгалтерии.Найти(ИмяРегистра) <> Неопределено Тогда
ТипРегистра = "РегистрБухгалтерии";
Иначе
ТипРегистра = "РегистрСведений";
КонецЕсли;
Если ТипРегистра <> "" Тогда
ЭлементБлокировки = Блокировка.Добавить(ТипРегистра + "." + ИмяРегистра + ".НаборЗаписей");
ЭлементБлокировки.Режим = РежимБлокировки;
Если ТекРегистрДвижения.Измерения.Найти("Склад") <> Неопределено Тогда
Если Источник.Метаданные().Реквизиты.Найти("СкладОрдер") <> Неопределено Тогда
ЭлементБлокировки.УстановитьЗначение("Склад", Источник.СкладОрдер);
ИначеЕсли Источник.Метаданные().Реквизиты.Найти("Склад") <> Неопределено Тогда
ЭлементБлокировки.УстановитьЗначение("Склад", Источник.Склад);
ИначеЕсли Источник.Метаданные().Реквизиты.Найти("СкладОтправитель") <> Неопределено Тогда
тз = Новый ТаблицаЗначений;
тз.Колонки.Добавить("Склад");
строка = тз.Добавить();
строка.Склад = Источник.СкладОтправитель;
строка = тз.Добавить();
строка.Склад = Источник.СкладПолучатель;
ЭлементБлокировки.ИсточникДанных = тз;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
//Установка блокировки
Попытка
Блокировка.Заблокировать();
Исключение
ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки(), Отказ, "Не удалось заблокировать объекты");
ВызватьИсключение "Операция не выполнена";
КонецПопытки;
КонецПроцедуры
Подписка на "ОбработкаПроверкиЗаполнения" выполняется раньше чем "ПередЗаписью" в модуле объекта. Блокировка работает так:
По умолчанию блокируется все без отбора. Но если регистр имеет измерение "Склад", а источник "Склад", "СкладОрдер", "СкладОтправитель" - то устанавливается отбор по складу. Теоретически такая блокировка должна увеличить параллельность. Кто что думает?
Сделал я вот это все. На тестовой базе зашел под двумя пользователями и одновременно запустил перепроведение всех реализаций и там и там, но первый пользователь - все реализации с одного склада "Склад1" второй - "Склад2". Теоретически взаимоблокировок не должно быть. Но постоянно вижу Конфликт блокировки транзакций по регистру партий. В месте где вызывается запрос по партиям и списанным товарам. В запросе по партиям есть отбор по складу, а вот списанные товары не блокируются....