К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как программно добавить группу на форму в 1С

Как программно добавить группу на управляемую форму в 1С: метод Элементы.Добавить, виды групп, родитель, свойства, типичные ошибки и готовые примеры кода.

Программное добавление группы на управляемую форму в 1С выполняется через коллекцию Элементы объекта формы: вызывается метод Добавить с указанием имени, типа Тип("ГруппаФормы") и родительского элемента. После этого группе задаётся вид (обычная группа, страница, командная панель и другие), а уже внутрь неё программно помещаются поля, кнопки и таблицы.

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

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

Где и когда выполняется программное добавление элементов

Программно изменять состав элементов управляемой формы можно только в серверном контексте. Стандартное место — обработчик ПриСозданииНаСервере: на этом этапе форма уже существует, реквизиты созданы, а пользователь интерфейс ещё не видит. Добавление группы здесь не вызывает лишних перерисовок и не требует директив компиляции за пределами &НаСервере.

Добавлять элементы можно и позже, например в обработчике команды, но тогда процедура должна быть серверной (&НаСервере), а после возврата на клиент форма будет перерисована платформой. Из клиентского контекста напрямую создать группу нельзя — коллекция Элементы там доступна только на чтение и изменение отдельных свойств.

Базовый синтаксис: метод Элементы.Добавить

Метод имеет три параметра: имя создаваемого элемента (строка, уникальная в пределах формы), тип элемента и необязательный родитель. Для группы тип задаётся как Тип("ГруппаФормы"). Если родитель не указан, элемент размещается в корне формы.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

НоваяГруппа = Элементы.Добавить("ГруппаНастройки", Тип("ГруппаФормы"));

НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа;

НоваяГруппа.Заголовок = НСтр("ru = 'Настройки'");

НоваяГруппа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;

НоваяГруппа.ОтображатьЗаголовок = Истина;

КонецПроцедуры

Чтобы поместить группу внутрь существующего элемента (например, на страницу или в другую группу), третьим параметром передаётся ссылка на родительский элемент. Родитель должен существовать на момент вызова — либо создан в конфигураторе, либо добавлен программно раньше.

ГруппаСтраница = Элементы.Добавить("СтраницаОтборы", Тип("ГруппаФормы"), Элементы.СтраницыФормы);

ГруппаСтраница.Вид = ВидГруппыФормы.Страница;

ГруппаСтраница.Заголовок = НСтр("ru = 'Отборы'");

Порядок действий
  1. 1
    Откройте модуль формы и создайте серверную процедуру (например, ПриСозданииНаСервере)
  2. 2
    Вызовите Элементы.Добавить с типом Тип("ГруппаФормы") и нужным родителем
  3. 3
    Установите свойство Вид и при необходимости Заголовок, Группировка, Отображение
  4. 4
    Добавьте внутрь группы поля или кнопки, указывая её родителем
  5. 5
    Запустите форму в режиме предприятия и проверьте расположение и видимость группы

Какие виды групп можно создать

Одно и то же действие — добавление элемента типа «ГруппаФормы» — даёт разный результат в зависимости от значения свойства Вид. Выбор вида определяет поведение группы и набор доступных свойств.

Вид группыНазначениеОсобенности
ОбычнаяГруппаВизуальное объединение элементов, рамки, отступыГибкая настройка группировки и отображения заголовка
СтраницаВкладка внутри группы-страницРодителем должна быть группа с видом «Страницы»
СтраницыКонтейнер вкладокМожет содержать только страницы
КоманднаяПанельПанель кнопок и подменюКнопки добавляются с привязкой к командам формы
ПодменюВыпадающее меню в командной панелиРодитель — командная панель или другое подменю
ГруппаКнопокГоризонтальный ряд кнопокОбычно внутри командной панели или подменю

Частая связка — контейнер страниц плюс программно создаваемые вкладки. Сначала добавляется группа с видом Страницы, затем в неё — группы с видом Страница. Если страница одна, платформа может скрыть закладки; это нормальное поведение, управляемое свойством ОтображениеСтраниц у контейнера.

Сравнение вариантов

Обычная группа

Подходит для объединения полей и управления компоновкой; не даёт вкладок и кнопок сама по себе

Страницы и страницы

Подходят для экономии места на форме; требуют строгой иерархии «контейнер — вкладка»

Командная панель

Подходит для действий пользователя; требует предварительного создания команд формы

Добавление содержимого внутрь группы

Сама по себе пустая группа бессмысленна — в неё помещают поля, кнопки и таблицы, указывая группу родителем при вызове Добавить. Для полей ввода предварительно нужен реквизит формы: если его нет в конфигураторе, он создаётся методом ИзменитьРеквизиты.

&НаСервере

Процедура СоздатьГруппуСПолем()

// Реквизит формы

Добавляемые = Новый Массив;

Добавляемые.Добавить(Новый РеквизитФормы("КомментарийНовый",

Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200))));

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

// Группа

Группа = Элементы.Добавить("ГруппаДоп", Тип("ГруппаФормы"));

Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;

Группа.Заголовок = НСтр("ru = 'Дополнительно'");

// Поле внутри группы

Поле = Элементы.Добавить("ПолеКомментарий", Тип("ПолеФормы"), Группа);

Поле.Вид = ВидПоляФормы.ПолеВвода;

Поле.ПутьКДанным = "КомментарийНовый";

КонецПроцедуры

Для кнопок в программно созданной командной панели сначала добавляется команда формы (Команды.Добавить) с указанием обработчика, затем кнопка связывается с ней через свойство ИмяКоманды. Обработчик команды должен существовать в модуле формы, иначе платформа выдаст ошибку при обращении к кнопке.

bsl
Команда = Команды.Добавить("ОбновитьДанные");
Команда.Действие = "ОбновитьДанныеНаКлиенте";
Кнопка = Элементы.Добавить("КнопкаОбновить", Тип("КнопкаФормы"), КоманднаяПанельГруппы);
Кнопка.ИмяКоманды = "ОбновитьДанные";

Перемещение существующих элементов в новую группу

Если группа создаётся для реорганизации уже существующего интерфейса, элементы не пересоздают, а перемещают методом Элементы.Переместить. Метод принимает перемещаемый элемент, нового родителя и необязательный элемент, перед которым нужно разместить переносимый.

Элементы.Переместить(Элементы.АдресДоставки, Группа, Элементы.Телефон);

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

При доработке форм типовых конфигураций предпочтительнее добавлять группы программно в расширении, а не менять форму в основной конфигурации: это упрощает обновление. Программное создание в ПриСозданииНаСервере расширения не конфликтует с будущими изменениями типовой формы.
ПЗ
Практическое замечание

Типичные ошибки и ограничения

Самая частая ошибка — неуникальное имя. Если элемент с таким именем уже есть на форме (в том числе создан в конфигураторе), Добавить вызывает исключение. Перед добавлением имеет смысл проверять существование через Элементы.Найти(Имя), особенно если процедура может выполняться повторно.

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

Типичные ошибки
01
Вызов Элементы.Добавить на клиенте — ошибка исполнения, переносите код на сервер
02
Повторное добавление элемента с тем же именем без проверки Элементы.Найти — исключение при повторном входе в процедуру
03
Добавление страницы не в контейнер «Страницы» — ошибка или неверное отображение
04
Кнопка без предварительно созданной команды — пустое действие или ошибка при нажатии
05
Создание поля со ссылкой на несуществующий реквизит — ошибка «Поле не найдено» при открытии формы

Проверка результата

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

Контрольные точки

Как проверить результат

Группа видна на форме в ожидаемом месте
Норма

Расположена внутри заданного родителя, заголовок корректен

Тревожный признак

Группа в корне формы или не видна — проверьте родителя и Видимость

Дочерние элементы
Норма

Поля и кнопки внутри группы, данные отображаются

Тревожный признак

Элементы вне группы или ошибка «Поле не найдено» — проверьте родителя и ПутьКДанным

Повторное открытие формы
Норма

Форма открывается без исключений

Тревожный признак

Ошибка дублирования имени — добавьте проверку Элементы.Найти

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

Итог

Что важно запомнить

Группа создаётся методом Элементы.Добавить с типом ГруппаФормы на сервере, обычно в ПриСозданииНаСервере. Вид группы определяет её поведение, имя должно быть уникальным, а поля внутри группы требуют существующих реквизитов формы. Для типовых конфигураций такие доработки безопаснее выполнять через расширение.

Частые вопросы

Можно ли добавить группу на форму из внешней обработки, не меняя конфигурацию?

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

Как удалить программно созданную группу?

Методом Элементы.Удалить(Элемент), при этом удаляются и все вложенные элементы. Удалять можно только программно добавленные элементы; элементы, описанные в конфигураторе, удалить из кода нельзя — им можно только установить Видимость = Ложь.

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

Если в контейнере «Страницы» только одна страница или у контейнера свойство ОтображениеСтраниц установлено в значение без отображения закладок, вкладка скрывается. Добавьте вторую страницу или измените свойство отображения у родительской группы.

Как задать порядок группы среди соседних элементов?

Метод Добавить ставит элемент в конец коллекции родителя. Для точного позиционирования используйте Элементы.Переместить с третьим параметром — элементом, перед которым нужно разместить группу.

Можно ли добавить группу на обычную (неуправляемую) форму?

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

Влияет ли программное создание элементов на производительность?

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