Untitled

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

		Если ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда
			Отказ = Истина;
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = СтрШаблон("(ОУ)Недостаточно номенклатуры %1 в количестве %2",
			ВыборкаНоменклатура.НоменклатураПредставление, ВыборкаНоменклатура.Количество - ВыборкаНоменклатура.КоличествоОстаток);
			Сообщение.Сообщить();
		КонецЕсли;	
		
		Если Отказ Тогда
			Продолжить;
		КонецЕсли;
		
		ОсталосьСписать = ВыборкаНоменклатура.Количество;
		
		Выборка = ВыборкаНоменклатура.Выбрать();
		Пока Выборка.Следующий() и ОсталосьСписать <> 0 Цикл
			
			Списываем = мин(ОсталосьСписать, Выборка.КоличествоОстаток); 
			
			Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
			Движение.Период = Дата;
			Движение.Партия = Выборка.Партия;
			Движение.Количество = Списываем;
			Движение.Номенклатура = Выборка.Номенклатура;
			Движение.Сумма = ?(Списываем = Выборка.КоличествоОстаток, Выборка.СуммаОстаток, Списываем / Выборка.КоличествоОстаток * Выборка.СуммаОстаток);
			
			ОсталосьСписать = ОсталосьСписать - Списываем;
			
		КонецЦикла; 
		
	КонецЦикла;
	
КонецПроцедуры