Как программно добавить страницу и таблицу на управляемую форму 1С?

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

Программное управление интерфейсом — это одна из самых гибких и мощных возможностей платформы 1С:Предприятие 8.3. Однако разработчики часто сталкиваются с ситуацией, когда код вроде бы написан верно, элементы появляются в меню «Изменить форму», но физически на экране их нет. В этой статье мы подробно разберем, как правильно изменять состав формы «на лету», и выясним причины типичных ошибок. Для решения этой задачи без написания кода можно использовать инструмент для добавления реквизитов и элементов на управляемые формы.

Порядок действий: почему это критично?

При работе с управляемыми формами крайне важно соблюдать строгую последовательность операций. Если нарушить этот алгоритм, система либо выдаст ошибку «Недопустимое значение», либо создаст «призрачные» элементы, которые существуют в структуре, но не визуализируются. Рассмотрим правильный порядок действий:

  1. Создание реквизитов (данных): Сначала мы должны сообщить форме, какие новые данные в ней появятся. Это делается через метод ИзменитьРеквизиты().
  2. Создание визуальных элементов (групп, страниц): Только после того, как данные «зарегистрированы», мы создаем контейнеры (страницы, группы), где эти данные будут отображаться.
  3. Создание элементов управления (таблиц, полей): Добавляем саму таблицу или поля ввода.
  4. Связывание (ПутьКДанным): Устанавливаем связь между визуальным элементом и программным реквизитом.
  5. Заполнение данными: Наполняем созданную структуру конкретными значениями из запроса или других источников.

Шаг 1: Программное добавление реквизитов

Представим ситуацию: нам нужно вывести на форму таблицу с квантами поставки. Сначала создадим описание этой таблицы и её колонок. Проанализируем пример кода, который регистрирует новую таблицу значений как реквизит формы:


МассивРеквизитов = Новый Массив;

// Добавляем саму таблицу
МассивРеквизитов.Добавить(Новый РеквизитФормы("ТаблицаКванты", Новый ОписаниеТипов("ТаблицаЗначений"), , "Кванты"));

// Добавляем колонки для этой таблицы
МассивРеквизитов.Добавить(Новый РеквизитФормы("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"), "ТаблицаКванты"));
МассивРеквизитов.Добавить(Новый РеквизитФормы("ВидУпаковки", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыУпаковокДляЗаказа"), "ТаблицаКванты"));
МассивРеквизитов.Добавить(Новый РеквизитФормы("Коэффициент", Новый ОписаниеТипов("Число"), "ТаблицаКванты"));

// Фиксируем изменения на форме
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);

Важный нюанс: Обратите внимание на третий параметр в конструкторе РеквизитФормы. Для колонок таблицы там обязательно должно быть указано имя основной таблицы (в нашем примере — "ТаблицаКванты"). Это создает иерархическую связь данных.

Шаг 2: Создание контейнеров (Страниц и Групп)

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


// Находим родителя - существующую группу страниц на форме
ГруппаСтраницы = ЭтаФорма.Элементы.Найти("ГруппаСтраницыОборудование");

// Добавляем новую страницу
НоваяСтраница = ЭтаФорма.Элементы.Добавить("СтраницаКванты", Тип("ГруппаФормы"), ГруппаСтраницы);
НоваяСтраница.Вид = ВидГруппыФормы.Страница;
НоваяСтраница.Заголовок = "Данные по квантам";

// Добавляем обычную группу внутри страницы для группировки контента
НоваяГруппа = ЭтаФорма.Элементы.Добавить("ГруппаСодержимоеКвантов", Тип("ГруппаФормы"), НоваяСтраница);
НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
НоваяГруппа.ОтображатьЗаголовок = Ложь;

Выясним причину, почему элементы могут не отображаться. Управляемая форма скрывает пустые контейнеры. Если вы создали страницу, но не добавили в неё ни одного видимого элемента (или добавили их с ошибками привязки), страница просто не отрисуется на экране, хотя в структуре «Изменить форму» она будет присутствовать.

Шаг 3: Размещение таблицы и привязка данных

Это самый ответственный этап. Мы создаем элемент управления типа ТаблицаФормы и связываем его с реквизитом, созданным на первом шаге.


// Добавляем таблицу на форму, указывая родителем нашу новую группу
ЭлементТаблица = ЭтаФорма.Элементы.Добавить("ТаблицаВизуальная", Тип("ТаблицаФормы"), НоваяГруппа);

// Указываем путь к данным - это имя реквизита, который мы создали ранее
ЭлементТаблица.ПутьКДанным = "ТаблицаКванты";

Ошибка «Недопустимое значение»: Если при установке ПутьКДанным система выдает исключение, проверьте два момента. Во-первых, имя реквизита должно в точности совпадать с тем, что было передано в ИзменитьРеквизиты. Во-вторых, не используйте одинаковые имена для реквизита и элемента формы. Рекомендуется называть реквизит, например, ркТаблицаКванты, а элемент на форме — ТаблицаКванты.

Шаг 4: Программное создание колонок таблицы

Таблица на форме не будет отображать данные, пока мы не добавим в неё визуальные колонки. Каждая колонка — это ПолеФормы.


// Пройдемся по колонкам, которые мы ранее определили в реквизитах
СписокКолонок = "Контрагент,ВидУпаковки,Коэффициент";
МассивИмен = СтрРазделить(СписокКолонок, ",");

Для Каждого ИмяКолонки Из МассивИмен Цикл
    // Добавляем поле, родителем указываем объект ТАБЛИЦЫ
    НоваяКолонка = ЭтаФорма.Элементы.Добавить("Колонка_" + ИмяКолонки, Тип("ПолеФормы"), ЭлементТаблица);
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    
    // ПУТЬ К ДАННЫМ: строится по принципу "ИмяТаблицы.ИмяРеквизитаКолонки"
    НоваяКолонка.ПутьКДанным = "ТаблицаКванты." + ИмяКолонки;
КонецЦикла;

Обратите внимание на ПутьКДанным для колонок. Рассмотрим подробнее: если вы укажете просто "Контрагент", система не поймет, к какой таблице относится это поле. Обязательно используйте префикс с именем таблицы через точку.

Шаг 5: Заполнение таблицы данными

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


// Допустим, у нас есть результат запроса в переменной РезультатЗапроса
РезультатТаблица = РезультатЗапроса.Выгрузить();

// Загружаем данные напрямую в реквизит формы
ЭтаФорма.ТаблицаКванты.Загрузить(РезультатТаблица);

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

Почему элементы все равно не видны? Чек-лист для проверки

Проанализируем ситуацию, если после выполнения всего кода форма остается прежней:

Разберем еще один важный момент: использование метода Вставить() вместо Добавить(). Метод Вставить позволяет указать точное положение элемента относительно соседей. Если вы хотите, чтобы ваша страница была первой в списке, используйте именно его, передавая соседа в четвертом параметре. Однако помните: если сосед не будет найден, элемент может не отобразиться корректно.

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

← На главную