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