Демонстрация старого и нового подхода к управляемым блокировкам в 1С. А также исключение избыточных блокировок.
По старым стандартам 1С управляемые блокировки делались таким образом:
Движения.ОстаткиНоменклатуры.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Свойство","Свойство"); Блокировка.Заблокировать(); ПроверитьОстатки(Отказ,Режим); Если Отказ=Истина Тогда Возврат; КонецЕсли; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Если ТекСтрокаСписокНоменклатуры.Номенклатура.ЭтоУслуга Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Свойство = ТекСтрокаСписокНоменклатуры.Свойство; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла;
По новым стандартам управляемые блокировки, нужно делать так:
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина; Движения.ОстаткиНоменклатуры.Очистить(); Движения.ОстаткиНоменклатуры.Записать(); //Набор пустой, нет значений полей пространства блокировки. нечего блокировать. Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Если ТекСтрокаСписокНоменклатуры.Номенклатура.ЭтоУслуга Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Свойство = ТекСтрокаСписокНоменклатуры.Свойство; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина; Движения.ОстаткиНоменклатуры.Записать(); ПроверитьОстатки(Отказ,Режим);
И есть варианты блокировок, когда новые стандарты не могут быть применены (это случаи если номенклатура может быть услугой), только благодаря этому режиму можно избежать избыточных блокировок таблицы:
БлокировкаДанных = Новый БлокировкаДанных; ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЗапросИсточник = Новый Запрос; ЗапросИсточник.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Свойство КАК Свойство |ИЗ | Документ.РасходнаяНакладнаяСтараяМетодикаБлокировкиЗапрос.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | И РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ЭтоУслуга = ЛОЖЬ"; ЗапросИсточник.УстановитьПараметр("Ссылка", Ссылка); ИсточникНоменклатуры = ЗапросИсточник.Выполнить(); ЭлементБлокировки.ИсточникДанных = ИсточникНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Свойство", "Свойство"); БлокировкаДанных.Заблокировать(); Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Если ТекСтрокаСписокНоменклатуры.Номенклатура.ЭтоУслуга Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Свойство = ТекСтрокаСписокНоменклатуры.Свойство; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; Движения.ОстаткиНоменклатуры.Записать(); ПроверитьОстатки(Отказ,Режим);
Демо-база содержит заполненный справочник номенклатура, свойства. А также несколько документов (приходная накладная, расходные накладные нескольких типов). Рекомендуется запуск с помощью отладчика и сразу несколько сеансов в режиме 1С предприятия, для тестирования режима блокировки.
Тестировалось на платформе: 1С:Предприятие 8.3 (8.3.12.1595).