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