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