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

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

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

Программное добавление страниц на управляемую форму 1С: работа с ГруппаСтраницы, ИзменитьРеквизиты, создание элементов в коде, примеры и типичные ошибки.

Управляемые формы в 1С:Предприятие 8.3 строятся декларативно: состав элементов задаётся в конфигураторе, а в модуле формы разработчик работает с уже созданными объектами. Однако на практике часто требуется добавить страницу динамически — например, по количеству дополнительных реквизитов, по ролям пользователя или по данным документа. Сделать это можно полностью программно, если понимать порядок создания реквизитов формы и элементов.

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

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

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

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

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

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

Подготовка: создание реквизитов формы через ИзменитьРеквизиты

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

Типичный код подготовки выглядит так:

&НаСервере

Процедура СоздатьРеквизитыСтраницы()

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

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

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

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

Новый ОписаниеТипов("Булево")));

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

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

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

Программное создание страницы и элементов

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

&НаСервере

Процедура ДобавитьСтраницу()

СоздатьРеквизитыСтраницы();

НоваяСтраница = Элементы.Добавить("СтраницаДополнительно",

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

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

НоваяСтраница.Заголовок = "Дополнительно";

НоваяСтраница.Группировка =

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

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

Тип("ПолеФормы"), НоваяСтраница);

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

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

ПолеФлажок = Элементы.Добавить("ПолеСогласовано",

Тип("ПолеФормы"), НоваяСтраница);

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

ПолеФлажок.ПутьКДанным = "Согласовано";

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

Обратите внимание на три момента. Во-первых, имя элемента должно быть уникальным в пределах формы — при повторном вызове процедуры с тем же именем возникнет ошибка, поэтому перед добавлением полезно проверять Элементы.Найти("СтраницаДополнительно"). Во-вторых, свойство ПутьКДанным задаётся строкой с именем реквизита формы, созданного на предыдущем шаге. В-третьих, заголовок страницы виден пользователю как текст закладки, поэтому он обязателен.

Порядок добавления страницы
  1. 1
    В ПриСозданииНаСервере проверьте условия, при которых страница нужна
  2. 2
    Одним вызовом ИзменитьРеквизиты() добавьте все необходимые реквизиты формы
  3. 3
    Найдите или создайте панель страниц (группу с видом ГруппаСтраницы)
  4. 4
    Добавьте группу-страницу методом Элементы.Добавить() и задайте заголовок
  5. 5
    Создайте дочерние поля, указав ПутьКДанным для каждого
  6. 6
    Заполните реквизиты начальными значениями и проверьте форму в режиме предприятия

Динамическое создание нескольких страниц в цикле

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

&НаСервере

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

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

Для Каждого Строка Из Разделы Цикл

ИмяРеквизита = "Текст_" + Строка.Код;

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

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

КонецЦикла;

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

Для Каждого Строка Из Разделы Цикл

Страница = Элементы.Добавить("Страница_" + Строка.Код,

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

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

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

Поле = Элементы.Добавить("Поле_" + Строка.Код,

Тип("ПолеФормы"), Страница);

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

Поле.ПутьКДанным = "Текст_" + Строка.Код;

КонецЦикла;

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

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

Управление видимостью и активация страницы

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

Для программно созданной страницы доступны те же свойства: Видимость, Доступность, ТолькоПросмотр. Чтобы переключить пользователя на нужную закладку, используется свойство панели страниц ТекущаяСтраница:

Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаДополнительно;

Присваивание текущей страницы выполняется и на клиенте, что удобно в обработчиках команд — например, кнопка «Перейти к дополнительным данным» может активировать закладку без обращения к серверу.

Маршрут решения

Создавать или показывать

Состав страниц известен при разработке, меняется только их доступностьСоздайте страницы в конфигураторе и управляйте свойством Видимость в коде
Количество страниц зависит от данных объекта или настроек пользователяСоздавайте страницы программно в ПриСозданииНаСервере
Нужно одно изменение состава полей без отдельных закладокРассмотрите одну динамическую группу вместо панели страниц

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

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

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

Ещё одна частая ошибка — попытка создать страницу в обработчике ПриОткрытии() на клиенте. К этому моменту форма уже построена, а ИзменитьРеквизиты() недоступен. Вся структурная работа выполняется в ПриСозданииНаСервере() или в серверных процедурах, вызываемых до интерактивной работы пользователя.

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

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

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

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

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

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

Наличие закладки на форме
Норма

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

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

Закладки нет — проверьте родителя и вид группы

Работа полей
Норма

Значения вводятся и читаются из реквизитов формы

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

Поле пустое или недоступно — проверьте ПутьКДанным

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

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

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

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

Сохранение данных
Норма

Введённые значения переносятся в объект при записи

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

Данные теряются — нет кода переноса в ПередЗаписьюНаСервере

Итог

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

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

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

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

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

Почему созданная страница не отображается на форме?

Чаще всего причина в том, что родителем указана группа, не являющаяся панелью страниц, или странице не задан вид ГруппаСтраницы. Также проверьте, что у панели страниц не отключено отображение закладок и что самой странице не установлено свойство Видимость = Ложь.

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

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

Сохраняются ли данные из программных реквизитов формы в базу?

Нет, реквизиты формы существуют только в памяти сеанса. Чтобы значения сохранились, их нужно вручную перенести в реквизиты объекта, табличную часть или регистр в обработчике ПередЗаписьюНаСервере() либо в отдельной команде сохранения.

Можно ли добавить страницу в форму списка или форму выбора?

Технически да, механизм одинаков для любых управляемых форм. Однако формы списков часто открываются в режиме выбора с жёсткими настройками, и добавление лишних страниц там редко оправдано — обычно достаточно динамического списка и отборов.

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

Да. Каждый вызов ИзменитьРеквизиты() перестраивает дерево данных формы, а большое число элементов увеличивает время открытия и объём передаваемых между клиентом и сервером данных. Создавайте всё одним проходом в ПриСозданииНаСервере и не пересоздавайте элементы при каждом серверном вызове.