Untitled

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