Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
5.7 kB
4
Indexable
Never
Процедура ОбработкаПроведенияОУ(Отказ)
	
	Если Не ОУ Тогда
		Возврат;
	КонецЕсли;
	
	// ДВИЖЕНИЯ ПО РЕГИСТРУ ОСТАТКИ НОМЕНКЛАТУРЫ (НОВАЯ МЕТОДИКА ПРОВЕДЕНИЯ)	
	
	Движения.ОстаткиНоменклатуры.Записывать = Истина;
	Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
	
	// Запрос получения данных для формирования движений (данные табличной части соединяются с регистром составов стеллажей,
	// детали ТЧ заменяются на стеллажи, количество рассчитывается с учетом количества табличной части и количества из данных по регистру)
	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;  // временная таблица данных ВТ_ТабЧасть будет использоваться несколько раз
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ЕСТЬNULL(СоставСтеллажей.Деталь, РасходнаяНакладнаяСписокНоменклатуры.Номенклатура) КАК Номенклатура,
	|	СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество * ЕСТЬNULL(СоставСтеллажей.Количество, 1)) КАК Количество
	|ПОМЕСТИТЬ ВТ_ТабЧасть
	|ИЗ
	|	Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставСтеллажей КАК СоставСтеллажей
	|		ПО РасходнаяНакладнаяСписокНоменклатуры.Номенклатура = СоставСтеллажей.Стеллаж
	|ГДЕ
	|	РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
	|
	|СГРУППИРОВАТЬ ПО
	|	ЕСТЬNULL(СоставСтеллажей.Деталь, РасходнаяНакладнаяСписокНоменклатуры.Номенклатура)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТ_ТабЧасть.Номенклатура КАК Номенклатура,
	|	ВТ_ТабЧасть.Количество КАК Количество
	|ИЗ
	|	ВТ_ТабЧасть КАК ВТ_ТабЧасть";
	
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	
	// Формирование набора записей, запись движений в регистр
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();		
		Движение.Период = Дата;
		Движение.Склад = Склад;
		ЗаполнитьЗначенияСвойств(Движение, Выборка);
	КонецЦикла;
	
	Движения.Записать();
	
	// Запрос получения данных для контроля появления отрицательных остатков
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	-ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Превышение,
	|	ОстаткиНоменклатурыОстатки.Номенклатура.Представление КАК НоменклатураПредставление
	|ИЗ
	|	РегистрНакопления.ОстаткиНоменклатуры.Остатки(
	|			&МоментВремени,
	|			Номенклатура В
	|					(ВЫБРАТЬ
	|						Т.Номенклатура
	|					ИЗ
	|						ВТ_ТабЧасть КАК Т)
	|				И Склад = &Склад) КАК ОстаткиНоменклатурыОстатки
	|ГДЕ
	|	ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0";
	
	Запрос.УстановитьПараметр("Склад", Склад);
	Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени()));
	
	// Если результат запроса не пустой, то вывод данных по превышениям остатка и отказ от проведения документа
	Результат = Запрос.Выполнить();
	Если Не Результат.Пустой() Тогда
		Выборка = Результат.Выбрать();
		Пока Выборка.Следующий() Цикл
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = СтрШаблон("Превышение остатка по номенклатуре %1 в количестве %2",
				Выборка.НоменклатураПредставление, Выборка.Превышение);
			Сообщение.Сообщить();
		КонецЦикла;
		
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
КонецПроцедуры