Оптимизация обработки проведения документа с использованием запроса

Версия для печатиPDF-версия
Все, кто хоть раз использовал конструктор движений для автоматического создания обработки проведения документа, знают, что в результате создаётся цикл, в котором последовательно обходятся все строки табличной части документа и по каждой строке создаётся и заполняется запись соответствующего регистра.

	//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

	// регистр ТоварыНаСкладе Приход
	Движения.ТоварыНаСкладе.Записывать = Истина;
	Для Каждого ТекСтрокаТовары Из Товары Цикл
		Движение = Движения.ТоварыНаСкладе.Добавить();
		Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
		Движение.Период = Дата;
		Движение.Склад = Склад;
		Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
		Движение.Количество = ТекСтрокаТовары.Количество;
		Движение.Сумма = ТекСтрокаТовары.Сумма;
	КонецЦикла;

	//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
Если табличная часть документа содержит большое количество строк и к тому же документ делает движения по нескольким регистрам, обработка проведения может занять продолжительное время.
Для ускорения процесса проведения можно использовать промежуточную таблицу значений.
 
Допустим у нас есть документ Поступление товаров, у которого есть реквизит Склад и табличная часть Товары с реквизитами Номенклатура, Количество, Сумма. Документ производит движения по регистру накопления Товары на складе с измерениями Склад, Номенклатура и ресурсами Количество, Сумма.
 
Процедуру проведения документа можно разделить на несколько этапов:
 
1. Создаём запрос. Имена полей должны совпадать с именами имерений, ресурсов и реквизитов регистра. Не забываем добавить в список полей "ВидДвижения" и "Период" для установки стандартных реквизитов регистра.

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

	ТаблицаТоваров = Запрос.Выполнить().Выгрузить();
3. Устанавливаем у заполняемого набора движений свойство Записывать.

	Движения.ТоварыНаСкладе.Записывать = Истина;
4. Загружаем таблицу значений в набор движений.

	Движения.ТоварыНаСкладе.Загрузить(ТаблицаТоваров);
5. Повторяем пп.3-4 для остальных наборов движений документа.
 
PS. Если документ производит движения только по одному регистру, то можно обойтись без промежуточной таблицы значений и выгружать результаты запроса сразу в набор движений.

	Движения.ТоварыНаСкладе.Загрузить(Запрос.Выполнить().Выгрузить());
Полезность материала: 
5
Ваша оценка: Нет Средняя: 4.2 (6 оценок)
Оцените полезность материала
© При копировании материалов сайта ссылка на оригинал обязательна.