Разработка и Конфигурация · 11 мин
Как программно добавить группу на форму в 1С
Как программно добавить группу на управляемую форму в 1С: метод Элементы.Добавить, виды групп, родитель, свойства, типичные ошибки и готовые примеры кода.
Программное добавление группы на управляемую форму в 1С выполняется через коллекцию Элементы объекта формы: вызывается метод Добавить с указанием имени, типа Тип("ГруппаФормы") и родительского элемента. После этого группе задаётся вид (обычная группа, страница, командная панель и другие), а уже внутрь неё программно помещаются поля, кнопки и таблицы.
Такой подход нужен, когда состав интерфейса заранее неизвестен: например, настройки обработки формируются по метаданным, набор реквизитов зависит от вида документа или форма строится по пользовательским настройкам. Статически в конфигураторе такую структуру не описать, поэтому элементы создаются в коде модуля формы, обычно в обработчике ПриСозданииНаСервере.
Материал относится к управляемым формам (тонкий клиент, веб-клиент). Обычные формы используют другую модель и здесь не рассматриваются. Все примеры приведены на встроенном языке 1С и работают на актуальных версиях платформы 8.3.
Где и когда выполняется программное добавление элементов
Программно изменять состав элементов управляемой формы можно только в серверном контексте. Стандартное место — обработчик ПриСозданииНаСервере: на этом этапе форма уже существует, реквизиты созданы, а пользователь интерфейс ещё не видит. Добавление группы здесь не вызывает лишних перерисовок и не требует директив компиляции за пределами &НаСервере.
Добавлять элементы можно и позже, например в обработчике команды, но тогда процедура должна быть серверной (&НаСервере), а после возврата на клиент форма будет перерисована платформой. Из клиентского контекста напрямую создать группу нельзя — коллекция Элементы там доступна только на чтение и изменение отдельных свойств.
Базовый синтаксис: метод Элементы.Добавить
Метод имеет три параметра: имя создаваемого элемента (строка, уникальная в пределах формы), тип элемента и необязательный родитель. Для группы тип задаётся как Тип("ГруппаФормы"). Если родитель не указан, элемент размещается в корне формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
НоваяГруппа = Элементы.Добавить("ГруппаНастройки", Тип("ГруппаФормы"));
НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
НоваяГруппа.Заголовок = НСтр("ru = 'Настройки'");
НоваяГруппа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
НоваяГруппа.ОтображатьЗаголовок = Истина;
КонецПроцедуры
Чтобы поместить группу внутрь существующего элемента (например, на страницу или в другую группу), третьим параметром передаётся ссылка на родительский элемент. Родитель должен существовать на момент вызова — либо создан в конфигураторе, либо добавлен программно раньше.
ГруппаСтраница = Элементы.Добавить("СтраницаОтборы", Тип("ГруппаФормы"), Элементы.СтраницыФормы);
ГруппаСтраница.Вид = ВидГруппыФормы.Страница;
ГруппаСтраница.Заголовок = НСтр("ru = 'Отборы'");
- 1Откройте модуль формы и создайте серверную процедуру (например, ПриСозданииНаСервере)
- 2Вызовите Элементы.Добавить с типом Тип("ГруппаФормы") и нужным родителем
- 3Установите свойство Вид и при необходимости Заголовок, Группировка, Отображение
- 4Добавьте внутрь группы поля или кнопки, указывая её родителем
- 5Запустите форму в режиме предприятия и проверьте расположение и видимость группы
Какие виды групп можно создать
Одно и то же действие — добавление элемента типа «ГруппаФормы» — даёт разный результат в зависимости от значения свойства Вид. Выбор вида определяет поведение группы и набор доступных свойств.
| Вид группы | Назначение | Особенности |
|---|---|---|
| ОбычнаяГруппа | Визуальное объединение элементов, рамки, отступы | Гибкая настройка группировки и отображения заголовка |
| Страница | Вкладка внутри группы-страниц | Родителем должна быть группа с видом «Страницы» |
| Страницы | Контейнер вкладок | Может содержать только страницы |
| КоманднаяПанель | Панель кнопок и подменю | Кнопки добавляются с привязкой к командам формы |
| Подменю | Выпадающее меню в командной панели | Родитель — командная панель или другое подменю |
| ГруппаКнопок | Горизонтальный ряд кнопок | Обычно внутри командной панели или подменю |
Частая связка — контейнер страниц плюс программно создаваемые вкладки. Сначала добавляется группа с видом Страницы, затем в неё — группы с видом Страница. Если страница одна, платформа может скрыть закладки; это нормальное поведение, управляемое свойством ОтображениеСтраниц у контейнера.
Сравнение вариантов
Подходит для объединения полей и управления компоновкой; не даёт вкладок и кнопок сама по себе
Подходят для экономии места на форме; требуют строгой иерархии «контейнер — вкладка»
Подходит для действий пользователя; требует предварительного создания команд формы
Добавление содержимого внутрь группы
Сама по себе пустая группа бессмысленна — в неё помещают поля, кнопки и таблицы, указывая группу родителем при вызове Добавить. Для полей ввода предварительно нужен реквизит формы: если его нет в конфигураторе, он создаётся методом ИзменитьРеквизиты.
&НаСервере
Процедура СоздатьГруппуСПолем()
// Реквизит формы
Добавляемые = Новый Массив;
Добавляемые.Добавить(Новый РеквизитФормы("КомментарийНовый",
Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200))));
ИзменитьРеквизиты(Добавляемые);
// Группа
Группа = Элементы.Добавить("ГруппаДоп", Тип("ГруппаФормы"));
Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
Группа.Заголовок = НСтр("ru = 'Дополнительно'");
// Поле внутри группы
Поле = Элементы.Добавить("ПолеКомментарий", Тип("ПолеФормы"), Группа);
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "КомментарийНовый";
КонецПроцедуры
Для кнопок в программно созданной командной панели сначала добавляется команда формы (Команды.Добавить) с указанием обработчика, затем кнопка связывается с ней через свойство ИмяКоманды. Обработчик команды должен существовать в модуле формы, иначе платформа выдаст ошибку при обращении к кнопке.
Команда = Команды.Добавить("ОбновитьДанные");
Команда.Действие = "ОбновитьДанныеНаКлиенте";
Кнопка = Элементы.Добавить("КнопкаОбновить", Тип("КнопкаФормы"), КоманднаяПанельГруппы);
Кнопка.ИмяКоманды = "ОбновитьДанные";Перемещение существующих элементов в новую группу
Если группа создаётся для реорганизации уже существующего интерфейса, элементы не пересоздают, а перемещают методом Элементы.Переместить. Метод принимает перемещаемый элемент, нового родителя и необязательный элемент, перед которым нужно разместить переносимый.
Элементы.Переместить(Элементы.АдресДоставки, Группа, Элементы.Телефон);
Такой приём позволяет менять компоновку типовой формы из расширения или из кода формы без полного пересоздания элементов: данные и связи сохраняются, меняется только место в иерархии. Перемещать можно и программно созданные, и описанные в конфигураторе элементы.
При доработке форм типовых конфигураций предпочтительнее добавлять группы программно в расширении, а не менять форму в основной конфигурации: это упрощает обновление. Программное создание в ПриСозданииНаСервере расширения не конфликтует с будущими изменениями типовой формы.
Типичные ошибки и ограничения
Самая частая ошибка — неуникальное имя. Если элемент с таким именем уже есть на форме (в том числе создан в конфигураторе), Добавить вызывает исключение. Перед добавлением имеет смысл проверять существование через Элементы.Найти(Имя), особенно если процедура может выполняться повторно.
Вторая группа проблем связана с иерархией: страницу нельзя добавить в обычную группу, кнопку — напрямую в корень формы без командной панели, поле — в группу-страницы. Платформа либо откажет в выполнении, либо отобразит результат не так, как ожидалось. Также помните, что изменение реквизитов (ИзменитьРеквизиты) нельзя выполнять после того, как форма уже открыта и показана пользователю, — динамическое создание связанных данных планируется на этапе создания формы.
Проверка результата
После доработки откройте форму в режиме предприятия и проверьте не только факт появления группы, но и её поведение: растягивание при изменении размера окна, видимость заголовка, порядок обхода элементов. Для страниц убедитесь, что вкладки переключаются и содержимое видно на каждой.
Как проверить результат
Расположена внутри заданного родителя, заголовок корректен
Группа в корне формы или не видна — проверьте родителя и Видимость
Поля и кнопки внутри группы, данные отображаются
Элементы вне группы или ошибка «Поле не найдено» — проверьте родителя и ПутьКДанным
Форма открывается без исключений
Ошибка дублирования имени — добавьте проверку Элементы.Найти
Если группа создаётся по условию (например, только для определённого вида документа), проверьте обе ветки: и когда группа нужна, и когда её быть не должно. Ошибки условной компоновки часто проявляются только на одном из вариантов данных.
Что важно запомнить
Группа создаётся методом Элементы.Добавить с типом ГруппаФормы на сервере, обычно в ПриСозданииНаСервере. Вид группы определяет её поведение, имя должно быть уникальным, а поля внутри группы требуют существующих реквизитов формы. Для типовых конфигураций такие доработки безопаснее выполнять через расширение.
Частые вопросы
Можно ли добавить группу на форму из внешней обработки, не меняя конфигурацию?
Да. В модуле формы внешней обработки доступны те же методы Элементы.Добавить и ИзменитьРеквизиты. Для чужих форм (например, типовых) внешняя обработка не подходит — там используются расширения конфигурации или подключение через события формы.
Как удалить программно созданную группу?
Методом Элементы.Удалить(Элемент), при этом удаляются и все вложенные элементы. Удалять можно только программно добавленные элементы; элементы, описанные в конфигураторе, удалить из кода нельзя — им можно только установить Видимость = Ложь.
Почему созданная страница не показывает закладку?
Если в контейнере «Страницы» только одна страница или у контейнера свойство ОтображениеСтраниц установлено в значение без отображения закладок, вкладка скрывается. Добавьте вторую страницу или измените свойство отображения у родительской группы.
Как задать порядок группы среди соседних элементов?
Метод Добавить ставит элемент в конец коллекции родителя. Для точного позиционирования используйте Элементы.Переместить с третьим параметром — элементом, перед которым нужно разместить группу.
Можно ли добавить группу на обычную (неуправляемую) форму?
В обычных формах другая объектная модель: там нет коллекции Элементы в таком виде, а состав формы меняется через элементы управления с привязкой к форме в конфигураторе. Программное создание групп в стиле этой статьи доступно только в управляемых формах.
Влияет ли программное создание элементов на производительность?
Разумное количество динамических элементов заметно не замедляет открытие формы. Проблемы начинаются при массовом создании сотен полей в цикле — в таких случаях лучше пересмотреть интерфейс в пользу таблицы или динамического списка.