Все, кто хоть раз использовал конструктор движений для автоматического создания обработки проведения документа, знают, что в результате создаётся цикл, в котором последовательно обходятся все строки табличной части документа и по каждой строке создаётся и заполняется запись соответствующего регистра.
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
// регистр ТоварыНаСкладе Приход
Движения.ТоварыНаСкладе.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.ТоварыНаСкладе.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Склад = Склад;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Количество = ТекСтрокаТовары.Количество;
Движение.Сумма = ТекСтрокаТовары.Сумма;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
Если табличная часть документа содержит большое количество строк и к тому же документ делает движения по нескольким регистрам, обработка проведения может занять продолжительное время.
Для ускорения процесса проведения можно использовать промежуточную таблицу значений.
Допустим у нас есть документ Поступление товаров, у которого есть реквизит Склад и табличная часть Товары с реквизитами Номенклатура, Количество, Сумма. Документ производит движения по регистру накопления Товары на складе с измерениями Склад, Номенклатура и ресурсами Количество, Сумма.
Процедуру проведения документа можно разделить на несколько этапов:
1. Создаём запрос. Имена полей должны совпадать с именами имерений, ресурсов и реквизитов регистра. Не забываем добавить в список полей "ВидДвижения" и "Период" для установки стандартных реквизитов регистра.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
| ПоступлениеТоваровТовары.Ссылка.Дата КАК Период,
| ПоступлениеТоваровТовары.Ссылка.Склад КАК Склад,
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.Количество,
| ПоступлениеТоваровТовары.Сумма
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
|ГДЕ
| ПоступлениеТоваровТовары.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
2. Выгружаем результат запроса в таблицу значений.
ТаблицаТоваров = Запрос.Выполнить().Выгрузить();
3. Устанавливаем у заполняемого набора движений свойство Записывать.
Движения.ТоварыНаСкладе.Записывать = Истина;
4. Загружаем таблицу значений в набор движений.
Движения.ТоварыНаСкладе.Загрузить(ТаблицаТоваров);
5. Повторяем пп.3-4 для остальных наборов движений документа.
PS. Если документ производит движения только по одному регистру, то можно обойтись без промежуточной таблицы значений и выгружать результаты запроса сразу в набор движений.
Движения.ТоварыНаСкладе.Загрузить(Запрос.Выполнить().Выгрузить());