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

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

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

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

Программное добавление страницы на форму в 1С требуется, когда состав вкладок зависит от данных объекта, прав пользователя или режима работы. Например, страница «Дополнительные согласования» должна появляться только для документов свыше определённой суммы, а страница с настройками интеграции — только у администраторов. Жёстко задать такие страницы в конфигураторе нельзя, поэтому их создают кодом в обработчике ПриСозданииНаСервере.

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

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

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

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

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

Подготовка: что должно быть на форме до написания кода

Перед программным добавлением страницы убедитесь, что на форме существует группа-контейнер с видом Страницы. В типовых формах она обычно уже есть (например, «ГруппаСтраницы»). Если её нет, создайте группу в конфигураторе вручную или добавьте её кодом — тоже через Элементы.Добавить, но с видом Страницы и родителем в виде корня формы.

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

Третий момент — место вызова кода. Создание элементов доступно только на сервере, поэтому вся логика размещается в ПриСозданииНаСервере либо в серверной процедуре, вызываемой из него. Из клиентского контекста добавить страницу нельзя — попытка завершится ошибкой о недоступности метода.

Базовый код: создаём страницу программно

Минимальный пример — добавление пустой страницы в существующий контейнер. Код выполняется в модуле формы:

&НаСервере

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

// Родитель — группа с видом "Страницы"

РодительСтраниц = Элементы.ГруппаСтраницы;

// Создаём страницу

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

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

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

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

Метод Элементы.Добавить принимает имя элемента (уникальное в пределах формы), тип и необязательного родителя. Если родителя не указать, элемент попадёт в корень формы и вкладкой не станет. Свойство Вид обязательно: без него группа останется обычной группой и страница не отобразится как вкладка.

Если контейнера страниц на форме нет, создайте его так же, но с видом Страницы:

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

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

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

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

Наполнение страницы полями и командами

Элементы добавляются на страницу тем же методом Элементы.Добавить, но родителем теперь выступает созданная страница. Для поля ввода дополнительно указывают ПутьКДанным — имя реквизита формы или объекта:

// Реквизит добавлен заранее через ИзменитьРеквизиты()

ПолеКомментарий = Элементы.Добавить("ПолеКомментарийДоп", Тип("ПолеФормы"), НоваяСтраница);

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

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

ПолеКомментарий.Заголовок = НСтр("ru = 'Комментарий'");

Для кнопки сначала создают команду формы через коллекцию Команды, назначают ей обработчик, а затем добавляют кнопку, связанную с этой командой:

НоваяКоманда = Команды.Добавить("КомандаПроверить");

НоваяКоманда.Действие = "Подключаемый_Проверить";

НоваяКоманда.Заголовок = НСтр("ru = 'Проверить'");

Кнопка = Элементы.Добавить("КнопкаПроверить", Тип("КнопкаФормы"), НоваяСтраница);

Кнопка.ИмяКоманды = "КомандаПроверить";

Обработчик команды — процедура в модуле формы с директивой &НаКлиенте или &НаСервере, её имя должно совпадать со строкой в свойстве Действие. Если процедуры нет или имя не совпадает, форма упадёт при нажатии кнопки с сообщением о ненайденном обработчике.

Программное переключение и управление видимостью страниц

Активную страницу задают через свойство ТекущаяСтраница контейнера страниц. Это удобно, когда после определённого действия пользователя нужно сразу показать конкретную вкладку:

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

Видимость страницы управляется свойством Видимость самой группы-страницы: скрытая страница исчезает из перечня закладок вместе с содержимым. Это основной способ реализовать условные вкладки — например, показывать страницу «ЭДО» только для документов, участвующих в электронном обмене.

Установку ТекущаяСтраница можно выполнять и на клиенте — это одна из немногих операций со страницами, не требующих серверного вызова. А вот изменение состава страниц (добавление, удаление) всегда серверное, поэтому частые перестройки формы «на лету» приводят к лишним вызовам сервера и заметному снижению отзывчивости.

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

Как выбрать действие

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

Проверка результата и типичные ошибки

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

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

Типичные ошибки
01
Не установлено свойство Вид = ВидГруппыФормы.Страница — группа отображается как обычная панель, а не вкладка
02
В качестве родителя указана корневая группа формы вместо контейнера «Страницы» — вкладка не появляется
03
Попытка добавить элементы на клиенте — ошибка «Метод объекта не обнаружен» или недоступность в данном контексте
04
ПутьКДанным указывает на несуществующий реквизит — форма падает при открытии
05
Добавление элементов без проверки Элементы.Найти() при повторном вызове — исключение из-за дублирования имени
06
Обработчик команды указан строкой, но процедуры с таким именем в модуле нет — ошибка при нажатии кнопки
Контрольные точки

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

Вкладка в списке страниц
Норма

Новая закладка видна рядом с остальными и переключается

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

Вкладки нет — проверьте родителя и свойство Вид

Содержимое страницы
Норма

Поля отображаются, данные читаются и сохраняются

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

Пустая страница или ошибка при открытии — проверьте ПутьКДанным и порядок создания реквизитов

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

Форма открывается стабильно, страница одна

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

Дубли страниц или исключение — нет проверки на повторное добавление

Права пользователей
Норма

У пользователей без нужной роли форма открывается без страницы

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

Форма не открывается вовсе — обращение к недоступным данным

Ограничения и альтернативные подходы

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

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

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

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

Страница в конфигураторе

Подходит для постоянных вкладок. Простая поддержка, но нет гибкости по условиям

Программное добавление

Подходит, когда состав зависит от данных или прав. Требует аккуратности с именами и контекстом сервера

Скрытие готовых страниц

Компромисс: страницы созданы в конфигураторе, код управляет только Видимостью. Быстро и надёжно

Отдельная форма объекта

Подходит, когда различается не одна вкладка, а вся структура формы под разные режимы работы

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

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

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

Почему вкладка не отображается, хотя код выполнился без ошибок?

Чаще всего не установлено свойство Вид = ВидГруппыФормы.Страница или родителем указана не группа-контейнер страниц. Также проверьте, не стоит ли у контейнера отображение страниц «Нет» и не скрыта ли страница свойством Видимость.

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

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

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

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

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

Да, методом Элементы.Переместить(Элемент, Родитель, ПередЭлементом) — страница перемещается внутри контейнера на нужную позицию. Если параметр «перед каким элементом» не указан, страница станет последней.

Итог

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

Страница на управляемой форме — это группа с видом «Страница» внутри контейнера «Страницы». Программно её создают на сервере через Элементы.Добавить, обязательно устанавливая Вид и Заголовок. Реквизиты добавляют до элементов, имена проверяют на уникальность, а для постоянных вкладок предпочтительнее конфигуратор или расширение.