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