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