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