Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
10 kB
1
Indexable
Never
Процедура ОбработкаПроведенияОУ(Отказ)
	
	// Определение текущего метода списания себестоимости

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

		// Движение по регистру Продажи
		Движение = Движения.Продажи.Добавить();		
		Движение.Период = Дата;
		Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
		Движение.Количество = ВыборкаНоменклатура.КоличествоВДокументе;
		Движение.ВыручкаВРублях = ВыборкаНоменклатура.СуммаВДокументе;
		Движение.ВыручкаВВалюте = ?(КурсДоллара = 0, 0, ВыборкаНоменклатура.СуммаВДокументе / КурсДоллара);		
		Движение.СтоимостьВРублях = СтоимостьВРублях;
		Движение.СтоимостьВВалюте = СтоимостьВВалюте;

	КонецЦикла;

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