Untitled

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

		ОсталосьСписать = ВыборкаНоменклатура.КоличествоВДокументе;
		Выборка = ВыборкаНоменклатура.Выбрать();
		Пока Выборка.Следующий() и ОсталосьСписать <> 0 Цикл
			Списываем = Мин (ОсталосьСписать, Выборка.КоличествоОстаток);
			
			// списание из регистра Остатки номенклатуры
			ДвижениеОстаткиНоменклатуры = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
			ДвижениеОстаткиНоменклатуры.Период = Дата;
			ДвижениеОстаткиНоменклатуры.Номенклатура = Выборка.Номенклатура;
			ДвижениеОстаткиНоменклатуры.СрокГодности = Выборка.СрокГодности;
			ДвижениеОстаткиНоменклатуры.Количество = Списываем;
			ДвижениеОстаткиНоменклатуры.Сумма = Списываем / Выборка.КоличествоОстаток * Выборка.СуммаОстаток;			
			
			// приход в регистр Эксплуатируемое оборудование
			ДвижениеЭксплуатируемоеОборудование = Движения.ЭксплуатируемоеОборудование.Добавить();
			ЗаполнитьЗначенияСвойств(ДвижениеЭксплуатируемоеОборудование, ДвижениеОстаткиНоменклатуры);
			ДвижениеЭксплуатируемоеОборудование.ВидДвижения = ВидДвиженияНакопления.Приход;
			ДвижениеЭксплуатируемоеОборудование.СрокЭксплуатации = Выборка.СрокЭксплуатации; 
			
			ОсталосьСписать = ОсталосьСписать - Списываем;
			
		КонецЦикла;
		
	КонецЦикла;

КонецПроцедуры