Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
12 kB
2
Indexable
Never
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма");
КонецПроцедуры
Процедура ОбработкаПроведенияБУ(Отказ)

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