Как программно добавить страницу на панель и разместить на ней элементы в обычных формах 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие 8 часто возникает необходимость динамически изменять интерфейс формы в зависимости от данных. Одной из типовых задач является программное добавление новых страниц (закладок) на существующую панель и размещение на них элементов управления, таких как табличные поля или поля ввода. В этой статье мы подробно разберем, как реализовать этот механизм в обычных формах, рассмотрим типичные ошибки (например, проблему уникальности имен) и научимся делать динамические элементы доступными для редактирования.

Шаг 1. Программное создание страницы на панели

Для начала разберем, как добавить саму вкладку на панель. В обычных формах (ОФ) за это отвечает коллекция Страницы объекта Панель. Рассмотрим пример кода, который создает новую страницу:


// Получаем доступ к панели на форме
Панель = ЭлементыФормы.Панель1; 

// Добавляем новую страницу
// Параметры: Имя (строка), Заголовок (строка)
НоваяСтраница = Панель.Страницы.Добавить("СтраницаСклад", "Складской учет");

// Устанавливаем новую страницу текущей, чтобы пользователь сразу её увидел
Панель.ТекущаяСтраница = НоваяСтраница;

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

Шаг 2. Размещение элементов управления на новой странице

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

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


// Добавляем табличное поле
// Параметры: Тип, Имя, Видимость, Родитель (наша страница)
ТипЭлемента = Тип("ТабличноеПоле");
ИмяЭлемента = "ТЗ_Склад";
ТабличноеПоле = ЭлементыФормы.Добавить(ТипЭлемента, ИмяЭлемента, Истина, ЭлементыФормы.Панель1);

// Важно: в ОФ для размещения на конкретной странице панели 
// нужно явно указать родителя. Если указать просто Панель1, 
// элемент может отображаться на всех страницах (если не задана привязка к странице).

Шаг 3. Решение проблемы уникальности имен (Ошибка "Не уникальное имя!")

Часто программисты сталкиваются с ошибкой при создании элементов в цикле. Выясним причину: 1С требует, чтобы имя каждого элемента формы (второй параметр в методе Добавить) было уникальным в пределах всей формы. Если вы попытаетесь создать два элемента с именем "ТЗ", система выдаст исключение.

Разберем, как правильно генерировать имена, используя, например, идентификатор склада или счетчик:


Для Каждого Стр Из СписокСкладов Цикл
    // Формируем уникальное имя без спецсимволов
    ИмяСтраницы = "Стр_" + СтрЗаменить(Строка(Стр.Склад.УникальныйИдентификатор()), "-", "_");
    ИмяПоля = "ТП_" + СтрЗаменить(Строка(Стр.Склад.УникальныйИдентификатор()), "-", "_");
    
    // Проверяем, не создан ли элемент ранее (защита от ошибок в цикле)
    Если ЭлементыФормы.Найти(ИмяПоля) = Неопределено Тогда
        Страница = ЭлементыФормы.Панель1.Страницы.Добавить(ИмяСтраницы, Стр.Склад.Наименование);
        НовоеПоле = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), ИмяПоля, Истина, ЭлементыФормы.Панель1);
        // Дополнительная привязка к странице
        // В ОФ это делается через свойство элемента, если панель управляет закладками
    КонецЕсли;
КонецЦикла;

Шаг 4. Настройка данных и возможности редактирования

Когда элемент добавлен, он часто оказывается пустым или доступным только для чтения. Чтобы связать ТабличноеПоле с данными и разрешить пользователю менять значения, выполним следующие действия:

  1. Связь с данными: Используйте свойство Значение для статической выгрузки или Данные для динамической связи.
  2. Создание колонок: Метод СоздатьКолонки() автоматически построит визуальный ряд на основе структуры источника.
  3. Доступность: Установите свойство ТолькоПросмотр в значение Ложь.

Пример реализации:


// Предположим, у нас есть ТаблицаЗначений (ТЗ_Данные)
ТабличноеПоле.Значение = ТЗ_Данные;
ТабличноеПоле.СоздатьКолонки();

// Разрешаем редактирование
ТабличноеПоле.ТолькоПросмотр = Ложь;
ТабличноеПоле.ИзменятьСоставСтрок = Истина;

Шаг 5. Технические нюансы: привязки и события

Разберем профессиональные тонкости, которые сделают вашу форму удобной. Программно созданный элемент в обычных формах часто имеет нулевые размеры или "не умеет" растягиваться вместе с окном.

Установка привязок (Layout): Чтобы таблица занимала всё пространство страницы, используйте метод УстановитьПривязку. Это позволит элементу корректно масштабироваться.


// Привязываем правую сторону поля к правой стороне панели
ЭлементыФормы.ТП_Склад.УстановитьПривязку(ГраницаЭлементаУправления.Право, ЭлементыФормы.Панель1, ГраницаЭлементаУправления.Право);
// Привязываем низ поля к низу панели
ЭлементыФормы.ТП_Склад.УстановитьПривязку(ГраницаЭлементаУправления.Низ, ЭлементыФормы.Панель1, ГраницаЭлементаУправления.Низ);

Подключение обработчиков: Если вы хотите, чтобы при изменении данных в созданной таблице срабатывал ваш код, используйте метод УстановитьДействие.


// Привязываем событие "ПриИзменении" к процедуре в модуле формы
ТабличноеПоле.УстановитьДействие("ПриИзменении", "ОбработкаПриИзмененииТП");

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

← На главную