Untitled

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

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