Дано
Каркасная конфигурация для сдачи экзамена «1С:Специалист» по платформе «1С:Предприятие 8″ (1.0.0.1)
Задача
Написать обработчик проведения документа «Приходная накладная». В решении должен использоваться управляемый режим работы с транзакционными блокировками.
Решение
Про управляемые блокировки можно почитать здесь, здесь и здесь.
В решении будем использовать так называемый «новый» вариант блокировки
Собственно код:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«Ссылка», Ссылка);
Запрос.Текст =
«ВЫБРАТЬ
| ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура,
| ПриходнаяНакладнаяСписокНоменклатуры.Количество,
| ПриходнаяНакладнаяСписокНоменклатуры.Ссылка КАК Регистратор,
| ПриходнаяНакладнаяСписокНоменклатуры.Ссылка.Дата КАК Период,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения
|ИЗ
| Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры»;
// Начинаем транзакцию с управляемым режимом блокировок
НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
Движения.ОстаткиНоменклатуры.Загрузить(Запрос.Выполнить().Выгрузить());
// Заблокируем для изменения
// Набор движений не пустой, на регистр накопления по значениям
// измерений движений установится исключительная блокировка.
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Записать();
// Проведем контроль остатков, по результатам зафиксируем
// или отменим транзакцию
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«Ссылка», Ссылка);
Запрос.УстановитьПараметр(«Период», Новый Граница(Дата, ВидГраницы.Включая));
Запрос.Текст =
«ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура
|ПОМЕСТИТЬ ВТ_Номенклатура
|ИЗ
| Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры
|ГДЕ
| ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.Номенклатура,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &Период,
| Номенклатура В
| (ВЫБРАТЬ
| ВТ_Номенклатура.Номенклатура
| ИЗ
| ВТ_Номенклатура КАК ВТ_Номенклатура)) КАК ОстаткиНоменклатурыОстатки
|ГДЕ
| ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0»;
Если Не Запрос.Выполнить().Пустой() Тогда
// Отменяем транзакцию
ОтменитьТранзакцию();
Иначе
// Фиксируем транзакцию
ЗафиксироватьТранзакцию();
КонецЕсли;
Источники: v8.1c.ru, 1c.chistov.pro, infostart.ru