Untitled

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