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