Управляемые блокировки — для подготовки к экзамену Специалист 1С






Демо-база по управляемым блокировкам в 1С. Очень пригодится для тех, что хочет сдать экзамен «Специалист 1С»

Демонстрация старого и нового подхода к управляемым блокировкам в 1С. А также исключение избыточных блокировок.

По старым стандартам 1С управляемые блокировки делались таким образом:

Движения.ОстаткиНоменклатуры.Записывать = Истина;

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Свойство","Свойство");
Блокировка.Заблокировать();

ПроверитьОстатки(Отказ,Режим);
Если Отказ=Истина Тогда
Возврат;
КонецЕсли;

Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
Если ТекСтрокаСписокНоменклатуры.Номенклатура.ЭтоУслуга Тогда
Продолжить;
КонецЕсли;
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.Свойство = ТекСтрокаСписокНоменклатуры.Свойство;
Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
КонецЦикла;

 

По новым стандартам управляемые блокировки, нужно делать так:

Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Очистить();
Движения.ОстаткиНоменклатуры.Записать(); //Набор пустой, нет значений полей пространства блокировки. нечего блокировать.

Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
Если ТекСтрокаСписокНоменклатуры.Номенклатура.ЭтоУслуга Тогда
Продолжить;
КонецЕсли;

Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.Свойство = ТекСтрокаСписокНоменклатуры.Свойство;
Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
КонецЦикла;
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Записать();
ПроверитьОстатки(Отказ,Режим);

 

И есть варианты блокировок, когда новые стандарты не могут быть применены (это случаи если номенклатура может быть услугой), только благодаря этому режиму можно избежать избыточных блокировок таблицы:

 

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

Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
Если ТекСтрокаСписокНоменклатуры.Номенклатура.ЭтоУслуга Тогда
Продолжить;
КонецЕсли;

Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.Свойство = ТекСтрокаСписокНоменклатуры.Свойство;
Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
КонецЦикла;
Движения.ОстаткиНоменклатуры.Записать();
ПроверитьОстатки(Отказ,Режим);

Демо-база содержит заполненный справочник номенклатура, свойства. А также несколько документов (приходная накладная, расходные накладные нескольких типов). Рекомендуется запуск с помощью отладчика и сразу несколько сеансов в режиме 1С предприятия, для тестирования режима блокировки.

Тестировалось на платформе: 1С:Предприятие 8.3 (8.3.12.1595).

7 Comments

  1. dminrii.butorin

    А в чем преимущество нового метода перед старым?

    Reply ↓
  2. avbolshakov

    Вы пишите, что по старым стандартам делалось вот так, а по новым — вот так. Из статьи можно сделать вывод, что старые стандарты устарели , но ведь «старым способом» только и получится сделать блокировку когда данных в документе не достаточно для записи движений. Например, когда нам нужно посчитать себестоимость списания. Так?

    Reply ↓
  3. astracrypt

    (2) Если будете использовать старый метод, когда можно использовать новый, то можно получить минусовые баллы на экзамене «Специалист 1С»

    Reply ↓
  4. astracrypt

    (1) Это только в фирме 1С знают

    Reply ↓
  5. danjer74

    (3)Полностью поддерживаю. Не МОЖНО а ОДНОЗНАЧНО 🙂

    Reply ↓
  6. Sloth

    А зачем во втором примере дважды делается?

    Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;

    И там же зачем Записать() после Очистить()?

    Reply ↓
  7. Leon75

    Запутать новичков. Кто ж в отладчике увидит, что свойство после записи пустого набора не изменилось.

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *