При разработке на обычных формах 1С:Предприятие 8 программисты часто сталкиваются с необходимостью динамического изменения интерфейса. Одной из самых коварных задач является программное создание группы Переключателей (RadioButton). Типичная проблема, с которой можно столкнуться, — это загадочная ошибка: "Ошибка при установке значения атрибута контекста (ВыбираемоеЗначение)". Рассмотрим подробнее, почему это происходит и как правильно сконструировать этот элемент управления в коде.
Когда мы создаем элемент управления типа Переключатель через коллекцию ЭлементыФормы.Добавить, платформа инициализирует объект с пустыми метаданными. В момент, когда мы пытаемся присвоить свойству ВыбираемоеЗначение конкретное данное (например, Истина или число 1), система выполняет проверку соответствия типов. Если тип значения элемента еще не определен или не соответствует устанавливаемому значению, генерируется исключение.
Проанализируем ситуацию: в обычных формах тип переключателя жестко связан с типом данных реквизита, к которому он привязан, либо должен быть задан явно. Если свойство Данные еще не заполнено или заполнено некорректно, попытка установить ВыбираемоеЗначение приведет к краху конфигурации в режиме "1С:Предприятие".
Как выяснилось в ходе обсуждения проблемы, для 1С критически важен порядок, в котором заполняются атрибуты созданного элемента. Выясним причину: свойство ПервыйВГруппе и привязка к Данные подготавливают внутреннюю структуру элемента к приему конкретного типа данных. Разберем по шагам правильный алгоритм добавления переключателя:
Переключатель.ПервыйВГруппе (для первого элемента в наборе).Данные.ВыбираемоеЗначение.Посмотрим на пример кода, который успешно решает эту задачу:
// Создание первого переключателя (Истина)
ЭУ = ЭлементыФормы.Добавить(Тип("Переключатель"), "Переключатель1", Истина);
ЭУ.Заголовок = "Да";
ЭУ.Лево = 10;
ЭУ.Верх = 32;
ЭУ.Ширина = 50;
ЭУ.Высота = 19;
// КРИТИЧЕСКИ ВАЖНЫЙ ПОРЯДОК:
ЭУ.ПервыйВГруппе = Истина; // Сначала определяем начало группы
ЭУ.Данные = "БулевыйРеквизит"; // Затем привязываем к данным
ЭУ.ВыбираемоеЗначение = Истина; // Теперь ошибка не возникнет
// Создание второго переключателя (Ложь)
ЭУ2 = ЭлементыФормы.Добавить(Тип("Переключатель"), "Переключатель2", Истина);
ЭУ2.Заголовок = "Нет";
ЭУ2.Лево = 65;
ЭУ2.Верх = 32;
ЭУ2.Ширина = 50;
ЭУ2.Высота = 19;
ЭУ2.Данные = "БулевыйРеквизит";
ЭУ2.ВыбираемоеЗначение = Ложь;
Иногда привязки к Данные недостаточно, если реквизит формы имеет составной тип или платформа не может однозначно определить ожидаемый тип для ВыбираемоеЗначение. В таких случаях рекомендуется явно инициализировать свойство ТипЗначения элемента управления. Это "подготовит" поле к приему данных нужного формата.
Рассмотрим подробнее, как это реализовать:
НовыйЭлемент = ЭлементыФормы.Добавить(Тип("Переключатель"), "ПрограммныйПереключатель", Истина);
// Явно задаем тип, который будет принимать переключатель
НовыйЭлемент.ТипЗначения = Новый ОписаниеТипов("Булево");
// Теперь можно смело устанавливать значение
НовыйЭлемент.ВыбираемоеЗначение = Истина;
НовыйЭлемент.Данные = "ИмяРеквизитаТипаБулево";
Если вы используете числовые значения (например, 0, 1, 2), что часто встречается в старых типовых конфигурациях (таких как УТ 10.3), необходимо убедиться, что ОписаниеТипов соответствует числу с нужной разрядностью. Проанализируем ситуацию: если реквизит числовой, переключатели работают стабильнее, так как по умолчанию многие элементы управления ориентированы на числовые индексы выбора.
Важно помнить, что в обычных формах переключатели объединяются в визуальную и логическую группу не по имени, а по порядку обхода (Z-порядку) и свойству ПервыйВГруппе. Группа начинается на элементе, у которого ПервыйВГруппе = Истина, и заканчивается перед следующим элементом, у которого этот флаг также установлен в Истина, либо когда список элементов формы заканчивается.
При программном создании нескольких переключателей убедитесь, что:
ПервыйВГруппе = Истина.Данные.ВыбираемоеЗначение, соответствующее типу реквизита.Многие разработчики отмечают, что программная работа с типом Булево в переключателях на обычных формах реализована в платформе менее прозрачно, чем работа с типом Число. Если вышеуказанные способы не помогают, попробуйте временно очистить свойство Данные (установить пустую строку), затем присвоить ВыбираемоеЗначение, и после этого вернуть Данные на место. Этот прием заставляет платформу пересчитать внутренние кэши типов элемента управления.
Резюме: Главный секрет успеха при программном создании переключателя — это установка ПервыйВГруппе = Истина строго до манипуляций с выбираемым значением. Это инициализирует логику группы и позволяет платформе корректно обработать входящее значение.