Прослеживаемые товары в составе ОС / Модуль набора записей

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
	
#Область ОбработчикиСобытий

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

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

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

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

#КонецОбласти

#КонецЕсли

Связанные материалы