Untitled

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