Почему метод ЗагрузитьКолонку не заполняет табличную часть в 1С и как это исправить

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

При разработке в среде 1С:Предприятие программисты часто сталкиваются с необходимостью быстрого заполнения табличных частей объектов (справочников или документов) из готовых наборов данных, таких как массивы. Метод ЗагрузитьКолонку кажется идеальным инструментом для этой задачи, однако при его использовании в коде часто возникает ситуация, когда табличная часть остается пустой. В этой статье мы подробно разберем, почему так происходит, и изучим правильные подходы к заполнению данных.

Разбор типичной ошибки: анализ исходного кода

Рассмотрим ситуацию, с которой столкнулся автор темы. В коде создается новый элемент справочника, и предпринимается попытка заполнить его табличную часть ТЧ напрямую из массивов, содержащихся в структуре или объекте Расписание. Проанализируем проблемный участок кода:


Если Выборка.Количество() = 0 Тогда
    НашСправочник = Справочники.РасписаниеПланировщика.СоздатьЭлемент();
    НашСправочник.Наименование = Наимаенование;
    НашСправочник.Расписание = Расписание;

    // Попытка заполнения табличных частей без подготовки строк
    НашСправочник.ТЧ.ЗагрузитьКолонку(Расписание.Месяцы, "НомерМесяц"); 
    НашСправочник.ТЧ.ЗагрузитьКолонку(Расписание.ДниНедели, "ДеньНедели");
    
    ДеньВМесяце = Новый Массив;
    ДеньВМесяце.Добавить(Расписание.ДеньВМесяце);
    НашСправочник.ТЧ.ЗагрузитьКолонку(ДеньВМесяце, "ДеньВМесяце");
    
    НашСправочник.Записать();
КонецЕсли;

При выполнении этого кода табличная часть ТЧ в новом элементе справочника останется абсолютно пустой. Выясним причину такого поведения платформы.

Критическая особенность метода ЗагрузитьКолонку

Основная причина проблемы заключается в понимании механики работы метода ЗагрузитьКолонку. Этот метод не добавляет новые строки в таблицу. Он предназначен для замены значений в уже существующих строках табличной части по указанной колонке.

Разберем это подробнее:

  1. Метод сопоставляет индекс элемента массива с индексом строки табличной части.
  2. Если в массиве 10 элементов, а в табличной части 0 строк, методу просто не в чем обновлять данные. Он не находит ни одной строки с индексом 0, 1, 2 и так далее.
  3. Платформа не выдает ошибку при несовпадении количества строк и размера массива, она просто игнорирует те данные, для которых нет соответствующих строк.

В приведенном примере объект НашСправочник только что создан методом СоздатьЭлемент(). Его табличная часть ТЧ пуста. Следовательно, вызовы ЗагрузитьКолонку ничего не записывают.

Правильное решение: подготовка строк

Чтобы метод сработал корректно, нам необходимо сначала создать в табличной части ровно столько строк, сколько элементов содержится в наших массивах. Рассмотрим, как изменить код, чтобы он стал работоспособным:


НашСправочник = Справочники.РасписаниеПланировщика.СоздатьЭлемент();
НашСправочник.Наименование = Наименование;

// Предположим, что количество строк определяется размером массива месяцев
КоличествоСтрок = Расписание.Месяцы.Количество();

// Шаг 1: Добавляем пустые строки в ТЧ
Для Итератор = 1 По КоличествоСтрок Цикл
    НашСправочник.ТЧ.Добавить();
КонецЦикла;

// Шаг 2: Теперь можно использовать ЗагрузитьКолонку
НашСправочник.ТЧ.ЗагрузитьКолонку(Расписание.Месяцы, "НомерМесяц");
НашСправочник.ТЧ.ЗагрузитьКолонку(Расписание.ДниНедели, "ДеньНедели");

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

Альтернативный метод: Загрузить()

Если ваша задача — полностью перезаписать данные в табличной части, использование ЗагрузитьКолонку может быть не самым оптимальным путем, так как оно требует ручного управления количеством строк. Рассмотрим более универсальный метод — Загрузить(). Этот метод принимает на вход ТаблицуЗначений.

Преимущество метода Загрузить() в том, что он автоматически очищает старые данные и создает нужное количество строк. Проанализируем пример:


// Создаем временную таблицу значений
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("НомерМесяц");
ТЗ.Колонки.Добавить("ДеньНедели");

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

// Одной командой загружаем все данные в объект
НашСправочник.ТЧ.Загрузить(ТЗ);

Технические тонкости и производительность

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

Основные правила работы с методом:

Сводная таблица сравнения подходов

Проанализируем ситуацию и выберем лучший инструмент для заполнения табличной части:

  1. ЗагрузитьКолонку: Идеально для массового обновления одной колонки в уже существующей и заполненной таблице. Требует предварительного совпадения количества строк и размера массива.
  2. Загрузить (из Таблицы Значений): Лучший вариант для полной перезаписи или первоначального заполнения таблицы. Автоматически управляет строками.
  3. Цикл Добавить() / Заполнить(): Наиболее гибкий, но самый медленный вариант. Подходит для сложной логики, когда значение в строке зависит от множества условий.

Таким образом, для исправления ошибки автора достаточно было добавить цикл по созданию пустых строк перед вызовом загрузки. Это гарантирует, что методу ЗагрузитьКолонку будет с чем работать в памяти сервера 1С.

← На главную