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

Копировать в буфер обмена
////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ
// 

// Процедура обработчик проведения документа
//
Процедура ОбработкаПроведения(Отказ, Режим)

	//Получение данных состава документа, номенклатуры и остатков
	Запрос = Новый Запрос;

	Если Режим = РежимПроведенияДокумента.Оперативный Тогда

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

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

	//Обход результата запроса
	СтрокаСостава = Результат.Выбрать();
	Пока СтрокаСостава.Следующий() Цикл

		//Проверка остатка при оперативном проведении
		Если Режим = РежимПроведенияДокумента.Оперативный Тогда
			Остаток = ?(СтрокаСостава.КоличествоСкл = Null, 0, СтрокаСостава.КоличествоСкл);
			Если Остаток < СтрокаСостава.Количество Тогда
				Сообщить("Товара " + СокрЛП(СтрокаСостава.Номенклатура) + " имеется только " + Остаток);
				Отказ = Истина;
				Продолжить;
			КонецЕсли;
		КонецЕсли;

		//Запись движения номенклатуры
		Движение = Движения.УчетНоменклатуры.ДобавитьРасход();
		Движение.Период = Дата;
		Движение.Номенклатура = СтрокаСостава.Номенклатура;
		Движение.Склад = Склад;
		Движение.Количество = СтрокаСостава.Количество;

	КонецЦикла;

	Для Каждого ТекСтрокаСостав Из Состав Цикл

		// регистр Основной 
		Движение = Движения.Основной.Добавить();
		Движение.СчетДт = ПланыСчетов.Основной.Покупатели;
		Движение.СчетКт = ПланыСчетов.Основной.НоменклатураНаСкладах;
		Движение.Период = Дата;

		Если Валюта.Пустая() Тогда
			Движение.Сумма = ТекСтрокаСостав.Сумма;
		Иначе
			Движение.ВалютаДт = Валюта;
			Движение.ВалютнаяСуммаДт = ТекСтрокаСостав.Сумма;
			Движение.Сумма = ТекСтрокаСостав.Сумма * ОбщиеФункции.ПолучитьКурс(Дата, Валюта);
		КонецЕсли;

		Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
		Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСостав.Номенклатура;
		Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад;
		Движение.КоличествоКт = ТекСтрокаСостав.Количество;

	КонецЦикла;

	Если Не Отказ Тогда
		Движения.УчетНоменклатуры.Записать();
	КонецЕсли;

КонецПроцедуры // ОбработкаПроведения(Отказ, Режим)