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

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

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

Понимание механизма изменения состава реквизитов

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

Для модификации состава данных используется метод ИзменитьРеквизиты(). Разберем по шагам, как это работает. Метод принимает массив объектов РеквизитФормы, которые нужно добавить, и массив имен реквизитов, которые нужно удалить. Это критически важно: если вы планируете обновлять список реквизитов динамически (например, при нажатии кнопки), вам сначала нужно удалить старые реквизиты, созданные ранее, иначе система выдаст ошибку о дублировании имен.

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


// Создаем массив для новых реквизитов
ДобавляемыеРеквизиты = Новый Массив;

// Описываем новый реквизит: Имя, Тип, Путь, Заголовок, СохраняемыеДанные
НовыйРеквизит = Новый РеквизитФормы("ДинамическийФлажок", Новый ОписаниеТипов("Булево"), , "Включить опцию", Истина);
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);

// Применяем изменения на сервере
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

Программное создание элемента формы «Флажок»

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

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


// 1. Создаем группу для горизонтального размещения
ГруппаФлажков = Элементы.Добавить("ГруппаДинамическихФлажков", Тип("ГруппаФормы"), ЭтаФорма);
ГруппаФлажков.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаФлажков.Группировка = ГруппировкаПодчиненныхЭлементов.Горизонтальная;
ГруппаФлажков.ОтображатьЗаголовок = Ложь;

// 2. Создаем сам элемент управления
НовыйЭлемент = Элементы.Добавить("ПолеДинамическийФлажок", Тип("ПолеФормы"), ГруппаФлажков);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
НовыйЭлемент.ПутьКДанным = "ДинамическийФлажок"; // Привязываем к созданному ранее реквизиту

Работа с динамическими колонками в таблице значений

Если ваша задача — добавить флажки в существующую таблицу значений на форме, алгоритм немного усложняется. Нам нужно указать «путь к данным», который включает имя самой таблицы. Рассмотрим пример, где мы добавляем колонку типа Булево в таблицу ТЗДанные:


// Добавляем реквизит (колонку таблицы)
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Выбор", Новый ОписаниеТипов("Булево"), "ТЗДанные", "ОК"));
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

// Добавляем элемент (колонку в визуальную таблицу)
ТаблицаНаФорме = Элементы.ТЗДанные;
НоваяКолонка = Элементы.Добавить("ТЗДанныеВыбор", Тип("ПолеФормы"), ТаблицаНаФорме);
НоваяКолонка.Вид = ВидПоляФормы.ПолеФлажка;
НоваяКолонка.ПутьКДанным = "ТЗДанные.Выбор";

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

Альтернатива: Использование тумблера

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

  1. Установить вид поля в значение ВидПоляФормы.ПолеПереключателя.
  2. Установить свойство ОтображениеВыбора в ОтображениеВыбораПереключателя.Тумблер.
  3. Заполнить список выбора элемента значениями Истина и Ложь с понятными пользователю представлениями (например, «Да»/«Нет» или «Вкл»/«Выкл»).

Обработка нажатия: Метод УстановитьДействие

Просто создать флажок недостаточно — нужно реагировать на его изменение. Поскольку элемент создан программно, мы не можем просто дважды кликнуть по нему в конфигураторе. Нам нужно использовать метод УстановитьДействие().

Разберем, как привязать обработчик события ПриИзменении:


// В процедуре создания элемента
НовыйЭлемент.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзмененииФлажка");

// Сама процедура (должна находиться в модуле формы с директивой &НаКлиенте)
&НаКлиенте
Процедура Подключаемый_ПриИзмененииФлажка(Элемент)
    // Получаем значение, которое установил пользователь
    Значение = ЭтаФорма[Элемент.Имя]; 
    
    // Если флажок в таблице, получаем текущую строку
    // ТекущиеДанные = Элементы.ТЗДанные.ТекущиеДанные;
    
    Сообщить("Состояние флажка изменилось: " + Значение);
КонецПроцедуры

Рекомендации по производительности

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

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

← На главную