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

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

При переходе с обычных форм на управляемые разработчики часто сталкиваются с трудностями при динамическом создании элементов интерфейса. Одной из типичных задач является создание флажка (чекбокса) из встроенного языка. Попытка передать в метод добавления элемента тип Флажок или ПолеФлажкаФормы приводит к ошибкам времени выполнения: «Тип не определен» или «Недопустимое значение параметров». Разберем подробно, почему это происходит и как правильно решить данную задачу на платформе 1С:Предприятие 8.3.

Выясним причину возникновения ошибок

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

  1. Ограничение допустимых типов в коллекции элементов. В объектной модели платформы действительно есть тип ПолеФлажкаФормы, однако метод Элементы.Добавить() на управляемой форме принимает строго ограниченный список интерфейсных типов. Их всего пять: Тип("ПолеФормы"), Тип("КнопкаФормы"), Тип("ГруппаФормы"), Тип("ТаблицаФормы") и Тип("ДекорацияФормы"). Любой флажок на управляемой форме с точки зрения платформы является полем ввода, визуальный вид которого настраивается через отдельное свойство.
  2. Путаница в синтаксисе обычных и управляемых форм. В обычном приложении сигнатура вызова выглядела как Добавить(<Тип>, <Имя>, <Видимость>, <ПоместитьНа>). В управляемом приложении порядок параметров принципиально иной: Добавить(<Имя>, <ТипЭлемента>, <Родитель>). Попытка передать имя вторым параметром неизбежно вызовет исключение.

Пошаговый алгоритм: создаем реквизит и элемент флажка

Разберем по шагам правильную последовательность действий. Флажок на управляемой форме не может существовать сам по себе — ему обязательно требуется источник данных с типом Булево. Если соответствующего реквизита в форме еще нет, его необходимо создать программно с помощью серверного метода ИзменитьРеквизиты(), после чего добавить сам визуальный элемент и связать его с данными.

Посмотрим на пример законченной серверной процедуры:


&НаСервере
Процедура ДобавитьФлажокНаФорму()
    // 1. Создаем реквизит формы с типом Булево
    МассивДобавляемыхРеквизитов = Новый Массив;
    ОписаниеТипаБулево = Новый ОписаниеТипов("Булево");
    
    НовыйРеквизит = Новый РеквизитФормы("ФлагСогласия", ОписаниеТипаБулево, , "Подтверждаю условия");
    МассивДобавляемыхРеквизитов.Добавить(НовыйРеквизит);
    
    // Применяем изменения к структуре формы
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
    
    // 2. Создаем визуальный элемент на форме
    НовыйЭлемент = Элементы.Добавить("ФлагСогласия", Тип("ПолеФормы"));
    НовыйЭлемент.ПутьКДанным = "ФлагСогласия";
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
КонецПроцедуры

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

  1. Создание описания типов. Для формирования булевого типа не обязательно вручную заполнять массив типов. Конструктор Новый ОписаниеТипов("Булево") позволяет быстро получить требуемое описание одной строкой.
  2. Метод ИзменитьРеквизиты(). Принимает массив новых объектов РеквизитФормы. Вызов этого метода перестраивает внутреннюю структуру формы на сервере.
  3. Свойство ПутьКДанным. Связывает созданное поле с реквизитом. Интересная особенность платформы: если привязать реквизит с типом Булево сразу после добавления поля, 1С в большинстве случаев автоматически установит Вид в значение ВидПоляФормы.ПолеФлажка. Однако явное указание вида через свойство Вид гарантирует предсказуемое поведение.

Тонкости настройки внешнего вида и поведения

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

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

Подключение обработчика событий

Чтобы динамический флажок реагировал на действия пользователя, подключим обработчик изменения значения с помощью метода УстановитьДействие():

НовыйЭлемент.УстановитьДействие("ПриИзменении", "ФлагСогласияПриИзменении");

Важное ограничение: процедура с именем ФлагСогласияПриИзменении должна быть заранее объявлена в модуле формы с директивой &НаКлиенте. Сгенерировать исполняемый клиентский код «на лету» платформа 1С не позволяет.

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

Обратим внимание на работу платформы с памятью при динамическом изменении форм:

  1. Не вызывайте ИзменитьРеквизиты() в цикле. Этот метод выполняет тяжелую операцию переинициализации контекста формы. Если необходимо создать несколько флажков или полей, сначала добавьте все объекты РеквизитФормы в один общий массив и вызовите ИзменитьРеквизиты() ровно один раз.
  2. Удаление динамических данных. Если форма долгоживущая и динамические элементы больше не нужны, простого удаления элемента через Элементы.Удалить() недостаточно — связанный реквизит останется в памяти. Для его очистки передайте массив имен реквизитов во второй параметр: ИзменитьРеквизиты(, МассивУдаляемыхИмен);.
  3. Альтернативный подход. Программная генерация элементов формы оправдана только для универсальных механизмов и сложных динамических конструкторов. В прикладных задачах стандартной практикой является предварительное размещение элементов и реквизитов в конфигураторе с последующим управлением их видимостью через Элемент.Видимость = Истина;.
← На главную