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

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

В процессе разработки часто возникают задачи, когда структура таблицы значений (ТЗ) предполагает наличие колонок с динамическими наименованиями, например: День1, День2, День3 и так далее. В этой статье мы разберем, как эффективно обращаться к таким колонкам и правильно заполнять их данными, избегая ошибок и лишних строк.

Доступ к колонкам через квадратные скобки

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

Рассмотрим пример формирования имени колонки в цикле:


Для НомерДняНедели = 1 По 7 Цикл
    ИмяКолонки = "День" + Формат(НомерДняНедели, "ЧГ=");
    СтрТаб[ИмяКолонки] = 15; // Установка значения
КонецЦикла;

Метод Формат(НомерДняНедели, "ЧГ=") здесь используется для того, чтобы исключить отображение разделителя групп разрядов (например, чтобы число 1 не превратилось в 1,00 или не добавило пробел).

Оптимизация алгоритма заполнения

Часто разработчики сталкиваются с проблемой «лесенки», когда при каждом добавлении данных создается новая строка. Чтобы заполнить одну и ту же строку по индексу для разных колонок, необходимо правильно организовать вложенность циклов.

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


СтруктураПоиска = Новый Структура;
СтруктураПоиска.Вставить("ДеньНедели");

Для НомерДняНедели = 1 По 7 Цикл
    СтруктураПоиска.ДеньНедели = НомерДняНедели;
    МассивНайденныхСтрок = ТЗ.НайтиСтроки(СтруктураПоиска);
    
    Для Каждого Эл Из МассивНайденныхСтрок Цикл
        Строка = ТаблицаНаФорме.Добавить();
        Данные = СопоставлениеДанных(Эл, НомерДняНедели);
        ЗаполнитьЗначенияСвойств(Строка, Данные);
    КонецЦикла;
КонецЦикла;

Важные рекомендации при работе с данными

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

Альтернативный взгляд: вертикальное проектирование

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

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

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

← На главную