Untitled

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