Как программно добавить колонки в Таблицу Значений на тонком клиенте в 1С?

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

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

Выясним причину: почему привычный синтаксис не работает на клиенте

Для понимания логики работы управляемого приложения важно разграничивать типы данных и место их обработки:

  1. Различие типов данных на клиенте и сервере. Тип ТаблицаЗначений существует только на сервере (а также в толстом клиенте). На тонком и веб-клиенте реквизит формы, связанный с таблицей значений, преобразуется в объект типа ДанныеФормыКоллекция. У этого объекта нет свойства Колонки, так как структура таблицы определяется контекстом формы на сервере.
  2. Ограничение метаданных объекта в режиме исполнения. Изменить состав реквизитов или табличных частей самого объекта обработки (ОбработкаОбъект) программно в рантайме невозможно — структура фиксируется на этапе конфигуратора. Однако платформой предусмотрен механизм динамического изменения состава реквизитов формы.

Решение: динамическое изменение реквизитов и элементов формы

Чтобы добавить новые колонки в таблицу значений и отобразить их на форме, необходимо выполнить работу на стороне сервера в два этапа: сформировать новые реквизиты формы с помощью метода ИзменитьРеквизиты() и добавить визуальные элементы интерфейса в коллекцию Элементы.

Рассмотрим подробнее пошаговый пример реализации в серверной процедуре (например, ПриСозданииНаСервере или пользовательской серверной процедуре):


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

Важная особенность: повторное переформирование колонок

Если в процессе работы обработки требуется многократно переформировать состав колонок, обязательно удаляйте ранее созданные динамические реквизиты и элементы формы. В противном случае платформа вызовет ошибку дублирования имен.

Разберем по шагам алгоритм обновления колонок:

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

Альтернативные варианты решения

Если динамическое добавление колонок через ИзменитьРеквизиты() кажется слишком ресурсоемким вызовом, проанализируем альтернативные подходы:

← На главную