Untitled

mail@pastecode.io avatarunknown
plain_text
a month ago
18 kB
0
Indexable
Never
Процедура ОбработкаПроведенияОУ(Отказ)

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

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