Untitled

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

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