Как программно добавить колонку в существующий реквизит формы типа ТаблицаЗначений?

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

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

Понимаем разницу между данными и их отображением

Для начала проанализируем важный теоретический момент, в котором часто путаются начинающие разработчики. Работа с программным изменением формы всегда делится на два независимых этапа:

  1. Изменение структуры данных: Добавление новых путей в памяти сервера (создание новых реквизитов).
  2. Изменение интерфейса: Создание визуальных элементов (колонок), которые пользователь увидит в таблице на экране.

Важно помнить: колонки таблицы внутри реквизита формы — это тоже реквизиты. Они подчиняются строгой иерархии и требуют вызова специальных методов платформы.

Этап 1: Программное добавление реквизитов (данных)

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

Сначала подготовим массив новых реквизитов. Для каждой новой колонки создается объект РеквизитФормы. Проанализируем пример кода:


// Создаем массив для добавления новых реквизитов
ДобавляемыеРеквизиты = Новый Массив;

// Описываем новую колонку
// Параметры: Имя, Тип, Путь к родителю, Заголовок, Сохраняемые данные
ИмяКолонки = "Колонка2";
ТипКолонки = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
ПутьКРодителю = "ПохожиеФизЛица"; // Указываем имя нашего реквизита ТЗ

НоваяКолонка = Новый РеквизитФормы(ИмяКолонки, ТипКолонки, ПутьКРодителю, "Сумма баллов");
ДобавляемыеРеквизиты.Добавить(НоваяКолонка);

// Применяем изменения на сервере
ИзменитьРеквизиты(ДобавляемыеРеквизиты);

Обратите внимание: метод ИзменитьРеквизиты является "тяжелой" операцией. Если вам нужно добавить 20 колонок, соберите их все в один массив и вызовите метод один раз. Это значительно ускорит работу формы.

Этап 2: Создание элементов формы (визуализация)

После выполнения первого этапа данные в памяти появились, но таблица на форме осталась прежней. Теперь нам нужно создать визуальный элемент — поле формы, которое будет отображать данные нашей новой колонки. Рассмотрим процесс по шагам:

  1. Находим саму таблицу в коллекции Элементы.
  2. Добавляем в таблицу новый элемент с типом ПолеФормы.
  3. Устанавливаем свойство Вид (например, поле ввода или поле надписи).
  4. Связываем элемент с данными через свойство ПутьКДанным.

Посмотрим на пример реализации этого этапа:


// 1. Получаем объект таблицы на форме
ТаблицаЭлемент = Элементы.ПохожиеФизЛица;

// 2. Добавляем новую колонку в визуальную таблицу
НовоеПоле = Элементы.Добавить("ПохожиеФизЛица_Колонка2", Тип("ПолеФормы"), ТаблицаЭлемент);

// 3. Настраиваем вид поля
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;

// 4. Указываем путь к данным (обязательно через точку: ИмяТЗ.ИмяКолонки)
НовоеПоле.ПутьКДанным = "Объект.ПохожиеФизЛица.Колонка2"; 
// Примечание: если ТЗ - реквизит формы, а не объекта, путь будет "ПохожиеФизЛица.Колонка2"

Важные нюансы и советы

Выясним причины возможных ошибок при программной работе с колонками:

Типизация данных. При создании РеквизитФормы всегда старайтесь максимально точно описывать ОписаниеТипов. Если оставить тип пустым, колонка будет иметь тип Произвольный, что может вызвать проблемы при попытке редактирования или форматирования данных (например, выравнивание чисел или выбор из справочника).

Контекст исполнения. Все манипуляции с ИзменитьРеквизиты и Элементы.Добавить должны выполняться строго в процедурах НаСервере. Попытка выполнить эти действия на клиенте приведет к ошибке, так как структура формы доступна для изменения только на стороне сервера.

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


НовоеПоле.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзмененииКолонки");

В этом случае в модуле формы должна существовать экспортная процедура с именем Подключаемый_ПриИзмененииКолонки, которая примет стандартные параметры события.

Зачем использовать программное добавление?

Разберем, почему разработчики выбирают этот путь вместо обычного рисования в конфигураторе. Во-первых, это упрощение обновлений. Если конфигурация находится на поддержке, программное изменение формы позволяет избежать конфликтов при обновлении типовых объектов. Во-вторых, это единственный способ реализовать динамический интерфейс, когда состав колонок зависит от настроек пользователя или данных в базе (например, отчет по месяцам, где количество колонок меняется каждый раз).

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

← На главную