В процессе разработки часто возникают задачи, когда структура таблицы значений (ТЗ) предполагает наличие колонок с динамическими наименованиями, например: День1, День2, День3 и так далее. В этой статье мы разберем, как эффективно обращаться к таким колонкам и правильно заполнять их данными, избегая ошибок и лишних строк.
Первая и самая важная задача — понять, как обратиться к конкретной колонке, если ее имя формируется программно. В 1С для этих целей используется механизм доступа через квадратные скобки. Это позволяет подставить строковое выражение в качестве имени колонки.
Рассмотрим пример формирования имени колонки в цикле:
Для НомерДняНедели = 1 По 7 Цикл
ИмяКолонки = "День" + Формат(НомерДняНедели, "ЧГ=");
СтрТаб[ИмяКолонки] = 15; // Установка значения
КонецЦикла;
Метод Формат(НомерДняНедели, "ЧГ=") здесь используется для того, чтобы исключить отображение разделителя групп разрядов (например, чтобы число 1 не превратилось в 1,00 или не добавило пробел).
Часто разработчики сталкиваются с проблемой «лесенки», когда при каждом добавлении данных создается новая строка. Чтобы заполнить одну и ту же строку по индексу для разных колонок, необходимо правильно организовать вложенность циклов.
Если вы загружаете данные из внешнего источника (например, Excel) и хотите сопоставить их с данными в системе, мы рекомендуем сначала подготовить структуру поиска, а затем обходить таблицу. Посмотрите на этот подход:
СтруктураПоиска = Новый Структура;
СтруктураПоиска.Вставить("ДеньНедели");
Для НомерДняНедели = 1 По 7 Цикл
СтруктураПоиска.ДеньНедели = НомерДняНедели;
МассивНайденныхСтрок = ТЗ.НайтиСтроки(СтруктураПоиска);
Для Каждого Эл Из МассивНайденныхСтрок Цикл
Строка = ТаблицаНаФорме.Добавить();
Данные = СопоставлениеДанных(Эл, НомерДняНедели);
ЗаполнитьЗначенияСвойств(Строка, Данные);
КонецЦикла;
КонецЦикла;
ЗаполнитьЗначенияСвойств: Этот метод значительно упрощает код. Он автоматически переносит данные из структуры или другого объекта в строку таблицы, если имена полей (свойств) совпадают. Это избавляет от необходимости прописывать каждое присваивание вручную.ДанныеФормыКоллекция (ТЗ на форме) помните, что каждое обращение к Добавить() вызывает обновление интерфейса. Если данных много, выгоднее сначала сформировать все в обычной ТаблицаЗначений на сервере, а потом загрузить её в форму одним действием.Найти() или НайтиСтроки(). Для ускорения этих операций применяйте индексы колонок: ТЗ.Индексы.Добавить("Сотрудник, ДеньНедели").Хотя горизонтальные таблицы (когда дни недели идут колонками) удобны для визуального отображения, они сложны в программной обработке. Если задача позволяет, лучше использовать вертикальную структуру данных:
СотрудникДеньНеделиПоказательТакой подход позволяет использовать стандартные запросы 1С для фильтрации и группировки данных, что намного производительнее, чем ручной перебор колонок с суффиксами в циклах.
Применяя данные советы на практике, вы сможете создавать гибкие и производительные алгоритмы обработки табличных данных, избегая типичных ошибок проектирования.