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

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

Как программно создать группу на форме 1С

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

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

Группа на форме — это контейнер, который объединяет другие элементы: поля, кнопки, таблицы и вложенные группы. От её свойств зависит, как элементы располагаются (горизонтально или вертикально), отображается ли заголовок, есть ли рамка и как ведёт себя группа при растягивании формы. Созданная программно группа полностью равноправна с группой, добавленной в конфигураторе.

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

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

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

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

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

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

Минимальный пример создания группы в корне формы:

&НаСервере

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

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

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

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

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

НоваяГруппа.Отображение = ОтображениеОбычнойГруппы.СлабоеВыделение;

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

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

После этого в группу можно добавлять поля и кнопки, передавая её как родителя: Элементы.Добавить("ПолеКомментарий", Тип("ПолеФормы"), НоваяГруппа). Для поля дополнительно задаётся ПутьКДанным — реквизит формы должен существовать (создан заранее или добавлен программно через ИзменитьРеквизиты).

Порядок действий
  1. 1
    Определите место создания группы: обычно ПриСозданииНаСервере
  2. 2
    Вызовите Элементы.Добавить с типом ГруппаФормы и при необходимости родителем
  3. 3
    Задайте Вид группы и Группировку подчинённых элементов
  4. 4
    Настройте заголовок, отображение и поведение при растягивании
  5. 5
    Добавьте дочерние элементы, передавая группу как родителя
  6. 6
    Откройте форму и проверьте расположение и видимость элементов

Выбор вида группы под задачу

Свойство Вид определяет поведение контейнера. Платформа предлагает несколько видов групп, и выбор влияет на то, какие свойства доступны и как группа выглядит.

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

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

Создание группы страниц с вкладками

Страницы создаются в два приёма: сначала контейнер вида Страницы, затем в него добавляются вкладки вида Страница. Нарушение иерархии (страница вне контейнера страниц) приведёт к ошибке при формировании формы.

&НаСервере

Процедура СоздатьСтраницыПоДанным()

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

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

КонтейнерСтраниц.ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСверху;

Для Каждого Раздел Из СписокРазделов Цикл

Страница = Элементы.Добавить("Страница_" + Раздел.Код, Тип("ГруппаФормы"), КонтейнерСтраниц);

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

Страница.Заголовок = Раздел.Наименование;

КонецЦикла;

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

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

Управление расположением и отображением

Свойство Группировка задаёт направление размещения дочерних элементов: Вертикальная, ГоризонтальнаяВсегда, ГоризонтальноеЕслиВозможно или ВЯчейках. Вариант «горизонтально если возможно» позволяет платформе переносить элементы на новую строку при нехватке ширины — это удобно для адаптивных форм.

За внешний вид отвечают свойства Отображение (рамка, слабое выделение, без отображения), ОтображатьЗаголовок, ЦветФона, ШрифтЗаголовка. Для сворачиваемых блоков используется Поведение со значением Свертываемая и свойство Свернута. Такая группа позволяет пользователю скрывать редко используемые настройки.

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

Состав формы известен заранееПрограммное создание не нужно

Опишите группу в редакторе формы конфигуратора

Элементы зависят от данныхНужно программное создание

Создавайте группу в ПриСозданииНаСервере

Группа появляется по кнопкеНужна серверная процедура

Из клиентского обработчика вызовите процедуру &НаСервере

Много однотипных блоковНужен цикл с уникальными именами

Формируйте имена элементов с суффиксом-индексом

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

После добавления группы форму нужно открыть и визуально проверить: появилась ли группа в нужном месте, правильно ли расположены дочерние элементы, не «съехала» ли соседняя разметка. Если группа добавлена без родителя, она встаёт в конец корневого списка элементов — порядок можно изменить методом Элементы.Переместить(Элемент, Родитель, МестоРасположения).

Программно убедиться в существовании элемента можно через Элементы.Найти("ГруппаНастройки"): метод вернёт объект или Неопределено. Это полезно в обработчиках, которые могут выполняться повторно, — перед созданием стоит проверить, не существует ли уже группа с таким именем, иначе платформа выдаст ошибку дублирования имени.

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

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

Группа на форме
Норма

Отображается в заданном месте с нужным заголовком

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

Группа отсутствует или попала в конец формы

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

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

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

Элементы вне группы или наложены друг на друга

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

Ошибок дублирования имён нет

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

Ошибка «Элемент с таким именем уже существует»

Имена элементов
Норма

Элементы.Найти возвращает объект

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

Метод возвращает Неопределено — имя не совпадает

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

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

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

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

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

Альтернативы программному созданию

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

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

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

Группа в конфигураторе + управление видимостью

Подходит для постоянных блоков; не работает, если состав элементов зависит от данных

Программное создание через Элементы.Добавить

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

Таблица формы вместо множества групп

Лучший вариант для однотипных повторяющихся данных; ограничена табличным представлением

Итог

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

Программно группа создаётся методом Элементы.Добавить с типом ГруппаФормы только на сервере. Задайте Вид, Группировку и Отображение, добавьте дочерние элементы с группой-родителем, проверяйте уникальность имён и тестируйте на копии базы.

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

Можно ли создать группу на форме прямо из клиентского кода?

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

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

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

Почему возникает ошибка «Элемент с таким именем уже существует»?

Процедура создания выполнилась повторно, а имя группы жёстко задано. Перед добавлением проверяйте Элементы.Найти("ИмяГруппы"): если результат не Неопределено, либо пропустите создание, либо удалите старый элемент. При создании в цикле формируйте уникальные имена с индексом или кодом строки данных.

Как разместить группу в нужном месте, а не в конце формы?

Укажите родителя третьим параметром метода Добавить, а затем при необходимости скорректируйте положение методом Элементы.Переместить(Группа, Родитель, СоседнийЭлемент) — группа встанет перед указанным соседним элементом.

Можно ли программно сделать сворачиваемую группу?

Да. Для обычной группы установите свойство Поведение в значение ПоведениеОбычнойГруппы.Свертываемая, а начальное состояние задайте свойством Свернута (Истина — группа свёрнута). Заголовок при этом должен отображаться, иначе пользователю не за что будет развернуть блок.

Работает ли этот подход в обычных формах?

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