При разработке в среде 1С:Предприятие программисты часто сталкиваются с необходимостью быстрого заполнения табличных частей объектов (справочников или документов) из готовых наборов данных, таких как массивы. Метод ЗагрузитьКолонку кажется идеальным инструментом для этой задачи, однако при его использовании в коде часто возникает ситуация, когда табличная часть остается пустой. В этой статье мы подробно разберем, почему так происходит, и изучим правильные подходы к заполнению данных.
Рассмотрим ситуацию, с которой столкнулся автор темы. В коде создается новый элемент справочника, и предпринимается попытка заполнить его табличную часть ТЧ напрямую из массивов, содержащихся в структуре или объекте Расписание. Проанализируем проблемный участок кода:
Если Выборка.Количество() = 0 Тогда
НашСправочник = Справочники.РасписаниеПланировщика.СоздатьЭлемент();
НашСправочник.Наименование = Наимаенование;
НашСправочник.Расписание = Расписание;
// Попытка заполнения табличных частей без подготовки строк
НашСправочник.ТЧ.ЗагрузитьКолонку(Расписание.Месяцы, "НомерМесяц");
НашСправочник.ТЧ.ЗагрузитьКолонку(Расписание.ДниНедели, "ДеньНедели");
ДеньВМесяце = Новый Массив;
ДеньВМесяце.Добавить(Расписание.ДеньВМесяце);
НашСправочник.ТЧ.ЗагрузитьКолонку(ДеньВМесяце, "ДеньВМесяце");
НашСправочник.Записать();
КонецЕсли;
При выполнении этого кода табличная часть ТЧ в новом элементе справочника останется абсолютно пустой. Выясним причину такого поведения платформы.
Основная причина проблемы заключается в понимании механики работы метода ЗагрузитьКолонку. Этот метод не добавляет новые строки в таблицу. Он предназначен для замены значений в уже существующих строках табличной части по указанной колонке.
Разберем это подробнее:
В приведенном примере объект НашСправочник только что создан методом СоздатьЭлемент(). Его табличная часть ТЧ пуста. Следовательно, вызовы ЗагрузитьКолонку ничего не записывают.
Чтобы метод сработал корректно, нам необходимо сначала создать в табличной части ровно столько строк, сколько элементов содержится в наших массивах. Рассмотрим, как изменить код, чтобы он стал работоспособным:
НашСправочник = Справочники.РасписаниеПланировщика.СоздатьЭлемент();
НашСправочник.Наименование = Наименование;
// Предположим, что количество строк определяется размером массива месяцев
КоличествоСтрок = Расписание.Месяцы.Количество();
// Шаг 1: Добавляем пустые строки в ТЧ
Для Итератор = 1 По КоличествоСтрок Цикл
НашСправочник.ТЧ.Добавить();
КонецЦикла;
// Шаг 2: Теперь можно использовать ЗагрузитьКолонку
НашСправочник.ТЧ.ЗагрузитьКолонку(Расписание.Месяцы, "НомерМесяц");
НашСправочник.ТЧ.ЗагрузитьКолонку(Расписание.ДниНедели, "ДеньНедели");
Важный нюанс: все массивы, которые вы планируете загружать в одну и ту же табличную часть разными вызовами ЗагрузитьКолонку, должны иметь одинаковый размер. Если один массив будет короче другого, часть строк в соответствующей колонке останется незаполненной.
Если ваша задача — полностью перезаписать данные в табличной части, использование ЗагрузитьКолонку может быть не самым оптимальным путем, так как оно требует ручного управления количеством строк. Рассмотрим более универсальный метод — Загрузить(). Этот метод принимает на вход ТаблицуЗначений.
Преимущество метода Загрузить() в том, что он автоматически очищает старые данные и создает нужное количество строк. Проанализируем пример:
// Создаем временную таблицу значений
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("НомерМесяц");
ТЗ.Колонки.Добавить("ДеньНедели");
// Заполняем ТЗ данными (в цикле или иным способом)
Для Каждого ТекущийМесяц Из Расписание.Месяцы Цикл
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.НомерМесяц = ТекущийМесяц;
// ... заполнение остальных колонок
КонецЦикла;
// Одной командой загружаем все данные в объект
НашСправочник.ТЧ.Загрузить(ТЗ);
Выясним, в каких случаях ЗагрузитьКолонку все же предпочтительнее. Этот метод реализован на уровне платформы крайне эффективно. Если у вас уже есть табличная часть с данными (например, 10 000 строк) и вам нужно обновить значения только в одной колонке, использование ЗагрузитьКолонку будет работать значительно быстрее, чем обход таблицы в цикле Для Каждого.
Основные правила работы с методом:
СправочникОбъект, ДокументОбъект). Вы не можете вызвать его у ссылки напрямую. Всегда используйте ПолучитьОбъект(), если работаете с существующей записью базы данных.Число, 1С попытается преобразовать значение. Если преобразование невозможно, будет записано пустое значение (например, 0).Проанализируем ситуацию и выберем лучший инструмент для заполнения табличной части:
Таким образом, для исправления ошибки автора достаточно было добавить цикл по созданию пустых строк перед вызовом загрузки. Это гарантирует, что методу ЗагрузитьКолонку будет с чем работать в памяти сервера 1С.