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