Пример использования управления блокировками при проведении документа
Копировать в буфер обмена////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ
//
// Процедура обработчик проведения документа
//
Процедура ОбработкаПроведения(Отказ, Режим)
//Получение данных состава документа, номенклатуры и остатков
Запрос = Новый Запрос;
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
//Блокировка остатков на складах
БлокировкаДанных = Новый БлокировкаДанных;
ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрНакопления.УчетНоменклатуры");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Склад", Склад);
ЭлементБлокировки.ИсточникДанных = Состав;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
БлокировкаДанных.Заблокировать();
Запрос.Текст = "ВЫБРАТЬ
| Док.Номенклатура,
| Док.Количество,
| ОстаткиСкл.КоличествоОстаток КАК КоличествоСкл
|ИЗ
| Документ.РасходнаяНакладная.Состав КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(
| ,
| Номенклатура В (&ПарНоменклатура)
| И Склад = &ПарСклад) КАК ОстаткиСкл
| ПО Док.Номенклатура = ОстаткиСкл.Номенклатура
|ГДЕ
| Док.Ссылка = &Ссылка
|
|ДЛЯ ИЗМЕНЕНИЯ
| РегистрНакопления.УчетНоменклатуры.Остатки";
Запрос.УстановитьПараметр("ПарСклад", Склад);
Запрос.УстановитьПараметр("ПарНоменклатура", Состав.ВыгрузитьКолонку("Номенклатура"));
Иначе
Запрос.Текст = "ВЫБРАТЬ
| Док.Номенклатура,
| Док.Количество
|ИЗ
| Документ.РасходнаяНакладная.Состав КАК Док
|ГДЕ
| Док.Ссылка = &Ссылка";
КонецЕсли;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
//Обход результата запроса
СтрокаСостава = Результат.Выбрать();
Пока СтрокаСостава.Следующий() Цикл
//Проверка остатка при оперативном проведении
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
Остаток = ?(СтрокаСостава.КоличествоСкл = Null, 0, СтрокаСостава.КоличествоСкл);
Если Остаток < СтрокаСостава.Количество Тогда
Сообщить("Товара " + СокрЛП(СтрокаСостава.Номенклатура) + " имеется только " + Остаток);
Отказ = Истина;
Продолжить;
КонецЕсли;
КонецЕсли;
//Запись движения номенклатуры
Движение = Движения.УчетНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = СтрокаСостава.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = СтрокаСостава.Количество;
КонецЦикла;
Для Каждого ТекСтрокаСостав Из Состав Цикл
// регистр Основной
Движение = Движения.Основной.Добавить();
Движение.СчетДт = ПланыСчетов.Основной.Покупатели;
Движение.СчетКт = ПланыСчетов.Основной.НоменклатураНаСкладах;
Движение.Период = Дата;
Если Валюта.Пустая() Тогда
Движение.Сумма = ТекСтрокаСостав.Сумма;
Иначе
Движение.ВалютаДт = Валюта;
Движение.ВалютнаяСуммаДт = ТекСтрокаСостав.Сумма;
Движение.Сумма = ТекСтрокаСостав.Сумма * ОбщиеФункции.ПолучитьКурс(Дата, Валюта);
КонецЕсли;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСостав.Номенклатура;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад;
Движение.КоличествоКт = ТекСтрокаСостав.Количество;
КонецЦикла;
Если Не Отказ Тогда
Движения.УчетНоменклатуры.Записать();
КонецЕсли;
КонецПроцедуры // ОбработкаПроведения(Отказ, Режим)