Untitled

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