Untitled

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


КонецПроцедуры