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

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

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

Синтаксис и правильное использование метода ЗагрузитьКолонку

В платформе 1С у объекта ТабличнаяЧасть предусмотрен метод ЗагрузитьКолонку. Данный метод предназначен для пакетного заполнения ячеек одной колонки значениями из одномерного массива. Разберем его синтаксис:

ТабличнаяЧасть.ЗагрузитьКолонку(МассивЗначений, Колонка)

  1. МассивЗначений (обязательный) — одномерный объект Массив, содержащий значения, которые необходимо поместить в строки табличной части.
  2. Колонка (обязательный) — имя колонки в виде строки (например, "ХарактеристикаНоменклатуры") либо объект метаданных колонки.

Выясним причину частой ошибки разработчиков. Нередко возникает попытка передать напрямую свойство таблицы значений (например, ДетализацияДокумента.ХарактеристикаНоменклатуры), что приводит к системному исключению Поле объекта не обнаружено, либо разработчик забывает указать имя целевой колонки вторым параметром.

Посмотрим на рабочий пример правильного переноса колонки из таблицы значений ДетализацияДокумента в табличную часть Товары объекта документа:


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

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

В результате метод последовательно запишет элементы массива в реквизит ХарактеристикаНоменклатуры каждой строки табличной части Товары.

Ограничения и поведение метода ЗагрузитьКолонку

Проанализируем особенности работы метода, которые критически важно учитывать во избежание логических ошибок и повреждения данных:

  1. Метод не создает новые строки. Заполнение происходит исключительно в уже существующих строках табличной части. Если табличная часть пуста, выполнение метода завершится успешно, но таблица так и останется пустой, поскольку новые строки не добавляются.
  2. Строгая привязка по порядковым номерам (индексам). Перенос данных осуществляется строго сверху вниз: нулевой элемент массива помещается в нулевую строку табличной части, первый — в первую и так далее. Если строки в исходной таблице значений и в документе упорядочены по-разному или если пользователь интерактивно изменил порядок строк, данные попадут не в те позиции.
  3. Разница в количестве элементов. Если размер переданного массива меньше количества строк в табличной части, оставшиеся снизу строки сохранят свои прежние значения. Если массив длиннее, лишние элементы в конце просто игнорируются.
  4. Отсутствие вызова обработчиков событий формы. Заполнение через данный метод не вызывает событий вида ПриИзменении, связанных с элементами управления. Это означает, что зависящие реквизиты (пересчет сумм, заполнение ставок НДС или подстановка единиц измерения) автоматически пересчитаны не будут.
  5. Контроль типов данных. Метод выполняет прямое присвоение и не выполняет неявных преобразований ссылочных данных. Если целевой реквизит табличной части имеет ссылочный тип (например, СправочникСсылка.ХарактеристикиНоменклатуры), а массив содержит строковые наименования, автоматического поиска по наименованию не произойдет, и в базу запишется некорректное значение либо возникнет ошибка типа.

Особенности применения в обычных формах (ОФ)

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

Также при программной модификации реквизитов объекта напрямую форма может не зафиксировать признак Модифицированность, из-за чего система не выдаст стандартное предупреждение о несохраненных данных при попытке закрыть окно.

Альтернативные способы заполнения данных

Разберем ситуации, когда использование метода ЗагрузитьКолонку не подходит из-за несовпадения порядка строк или необходимости поиска ссылок.

Вариант 1. Построчный обход в цикле

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


Для Каждого СтрокаТЧ Из ДокументОбъект.Товары Цикл
    ПараметрыОтбора = Новый Структура("Номенклатура", СтрокаТЧ.Номенклатура);
    НайденныеСтроки = ДетализацияДокумента.НайтиСтроки(ПараметрыОтбора);
    
    Если НайденныеСтроки.Количество() > 0 Тогда
        СтрокаИсточника = НайденныеСтроки[0];
        // Находим или присваиваем значение
        СтрокаТЧ.ХарактеристикаНоменклатуры = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(СтрокаИсточника.НаименованиеХарактеристики, Истина, , СтрокаТЧ.Номенклатура);
    КонецЕсли;
КонецЦикла;

Вариант 2. Полная перезагрузка таблицы при совпадении колонок

Если имена всех колонок в таблице значений и табличной части совпадают и требуется полностью перезаполнить табличную часть с созданием строк, эффективнее использовать связку методов полной выгрузки и загрузки:


// Полная замена строк табличной части данными из таблицы значений
ДокументОбъект.Товары.Загрузить(ДетализацияДокумента);

Вариант 3. Использование функции ЗаполнитьЗначенияСвойств

Если строки таблицы-источника и табличной части уже строго синхронизированы по количеству и порядку, но требуется скопировать только совпадающие по именам колонки, не затирая остальные реквизиты строки, удобно применить обход с вызовом ЗаполнитьЗначенияСвойств:


ВсегоСтрок = Мин(ДокументОбъект.Товары.Количество(), ДетализацияДокумента.Количество());
Для Индекс = 0 По ВсегоСтрок - 1 Цикл
    ЗаполнитьЗначенияСвойств(ДокументОбъект.Товары[Индекс], ДетализацияДокумента[Индекс], "ХарактеристикаНоменклатуры");
КонецЦикла;
← На главную