Как загрузить выбранные колонки из таблицы значений в табличную часть документа без перебора строк в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке в среде 1С часто возникает задача перенести данные из программно сформированной таблицы значений в табличную часть документа (например, Товары в документе ПоступлениеТоваровУслуг). При этом нередко требуется перенести не всю структуру, а лишь несколько конкретных колонок, избегая медленного построчного цикла Для Каждого.

Разберем основные и наиболее производительные способы реализации этой задачи с помощью стандартных методов платформы 1С.

Способ 1. Создание урезанной копии таблицы через метод Скопировать() и метод Загрузить()

Рассмотрим самый распространенный и удобный вариант: предварительно отфильтровать состав колонок исходной таблицы значений с помощью метода Скопировать(), а затем полностью загрузить результат в табличную часть.

Посмотрим на пример реализации:


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

// Загружаем подготовленную таблицу в табличную часть объекта или формы
Объект.Товары.Загрузить(ТЗ_Обрезанная);

Проанализируем, как работает этот механизм:

  1. Метод Скопировать() первым параметром принимает массив строк для отбора (если передать пустое значение, копируются все строки), а вторым — строку с именами колонок через запятую.
  2. Метод Загрузить() полностью очищает табличную часть и заполняет ее данными из переданной таблицы значений. Реквизиты табличной части, отсутствующие в урезанной таблице, заполняются значениями по умолчанию.

Способ 2. Поколоночная загрузка через методы ВыгрузитьКолонку() и ЗагрузитьКолонку()

Если в табличной части документа уже созданы строки и требуется обновить или заполнить значения только в определенных реквизитах, не очищая остальные данные, применим связку методов ВыгрузитьКолонку() и ЗагрузитьКолонку().

Разберем по шагам данный подход:


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

// 2. Загружаем массивы в соответствующие колонки табличной части
Объект.Товары.ЗагрузитьКолонку(МассивНоменклатуры, "Номенклатура");
Объект.Товары.ЗагрузитьКолонку(МассивКоличества, "Количество");

Важное ограничение: метод ЗагрузитьКолонку() не создает новых строк в табличной части. Он только перезаписывает значения в уже существующих строках. Если в табличной части меньше строк, чем в передаваемом массиве, лишние элементы массива загружены не будут.

Способ 3. Использование временных таблиц и объекта Запрос

Если при переносе колонок требуется дополнительно подтянуть зависимые данные (например, цены, ставки НДС или счета учета), наиболее эффективным решением будет обработка через Запрос.

Посмотрим на типовой алгоритм:


МенеджерВТ = Новый МенеджерВременныхТаблиц;

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ИсходнаяТЗ.Номенклатура КАК Номенклатура,
    |   ИсходнаяТЗ.Количество КАК Количество
    |ПОМЕСТИТЬ ВТ_Данные
    |ИЗ
    |   &ТаблицаДанных КАК ИсходнаяТЗ
    |;
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |   ВТ.Номенклатура КАК Номенклатура,
    |   ВТ.Количество КАК Количество,
    |   ВТ.Номенклатура.СтавкаНДС КАК СтавкаНДС
    |ИЗ
    |   ВТ_Данные КАК ВТ";

Запрос.УстановитьПараметр("ТаблицаДанных", ИсходнаяТЗ);

// Выгружаем результат запроса прямо в табличную часть
Объект.Товары.Загрузить(Запрос.Выполнить().Выгрузить());

Особенности и технические ограничения платформы

При работе с методами массовой загрузки данных важно учитывать следующие нюансы:

  1. Клиент-серверный контекст: объект ТаблицаЗначений доступен исключительно на сервере. Все операции по трансформации и загрузке данных должны выполняться в процедурах с директивами &НаСервере или &НаСервереБезКонтекста.
  2. Отсутствие событий формы: методы Загрузить() и ЗагрузитьКолонку() являются низкоуровневыми. Они не вызывают события элементов управления (например, ПриИзменении) и типовые алгоритмы пересчета сумм, НДС или подстановки цен. Все зависимые реквизиты необходимо либо подготовить заранее, либо пересчитать программно после загрузки.
  3. Совпадение имен и типов данных: имена колонок в таблице значений должны строго совпадать с именами реквизитов табличной части документа (регистр букв не учитывается). Типы данных в таблице значений должны быть совместимы с описанием типов целевых реквизитов.
← На главную