Untitled

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