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