Untitled

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