Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
10 kB
0
Indexable
Never
Процедура ОбработкаПроведения(Отказ, РежимПроведения)

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