Untitled

mail@pastecode.io avatarunknown
plain_text
a month ago
5.4 kB
0
Indexable
Never
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	// Так как периодичность регистра - месяц, то чтобы избежать ошибки при вводе пользовательских данных, 
	// принудительно устанавливаем дату в начало месяца. Тогда не будет расхождений в дате документа,
	// даты установки учетной политики и даты получения и записи данных в регистр остатков.
	Дата = НачалоМесяца(Дата);
КонецПроцедуры

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