Почему поле переключателя, связанное с перечислением, не отображается на форме?

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

При разработке интерфейсов на управляемых формах в платформе 1С:Предприятие мы часто сталкиваемся с необходимостью предоставить пользователю выбор одного значения из небольшого фиксированного списка. Идеальным кандидатом для этого является элемент управления Поле переключателя (Radio Button). Однако, начинающие разработчики часто попадают в тупиковую ситуацию: реквизит создан, тип значения (обычно Перечисление) определен, элемент вынесен на форму, вид элемента изменен на «Поле переключателя», но при запуске предприятия в пользовательском режиме на месте этого поля пустота. Элемент просто не виден.

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

Суть проблемы: особенность элемента «Поле переключателя»

Давайте разберемся в механике работы платформы. Когда мы размещаем на форме обычное поле ввода, связанное с перечислением, платформа по умолчанию создает выпадающий список. При нажатии на кнопку выбора система автоматически обращается к метаданным и показывает все доступные значения перечисления. Это стандартное поведение.

Однако, когда мы принудительно меняем вид элемента на Поле переключателя, логика отрисовки меняется. Переключатель — это набор статичных кнопок (радиокнопок), которые должны быть отрисованы на форме сразу при её открытии. Платформа 1С в целях оптимизации и гибкости (ведь часто нам нужно показать не все значения, а только часть) не заполняет коллекцию вариантов выбора для переключателя автоматически, даже если он связан с конкретным перечислением.

Следовательно, если список значений для отрисовки пуст, платформа просто не выводит на экран ни одной радиокнопки, и визуально кажется, что поле исчезло.

Решение 1: Статическое заполнение Списка выбора

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

  1. Откроем форму в конструкторе форм.
  2. Выделим наш элемент управления (Поле переключателя).
  3. В палитре свойств найдем свойство СписокВыбора.
  4. Нажмем на кнопку открытия (с тремя точками).
  5. В открывшемся окне добавим необходимые элементы. В колонке Значение укажем конкретную ссылку на значение перечисления (например, Перечисления.ВидыОпераций.Приход), а в колонке Представление напишем текст, который увидит пользователь рядом с кружком переключателя.

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

Решение 2: Программное заполнение при создании формы

Более профессиональный и гибкий подход — заполнять список выбора программно. Это гарантирует, что если структура метаданных изменится, код (при правильном написании) подхватит изменения автоматически. Для этого используем обработчик события формы ПриСозданииНаСервере.

Рассмотрим пример, где у нас есть реквизит формы ВидОперации, связанный с одноименным перечислением.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Получаем ссылку на элемент формы
    ЭлементПереключатель = Элементы.ВидОперации;
    
    // Очищаем список на всякий случай (хотя при создании он обычно пуст)
    ЭлементПереключатель.СписокВыбора.Очистить();
    
    // Вариант А: Добавляем конкретные значения вручную
    // Это полезно, если нужно показать только определенные значения, а не все
    ЭлементПереключатель.СписокВыбора.Добавить(Перечисления.ВидыОпераций.Продажа, "Продажа товара");
    ЭлементПереключатель.СписокВыбора.Добавить(Перечисления.ВидыОпераций.Возврат, "Возврат от покупателя");
    
    // Вариант Б: Заполняем всеми значениями из метаданных автоматически
    // Это универсальный способ
    Для Каждого ЗначениеПеречисления Из Метаданные.Перечисления.ВидыОпераций.ЗначенияПеречисления Цикл
        
        ИмяЗначения = ЗначениеПеречисления.Имя;
        СсылкаНаЗначение = Перечисления.ВидыОпераций[ИмяЗначения];
        ПредставлениеЗначения = ЗначениеПеречисления.Синоним; // Или СсылкаНаЗначение.Метаданные().Синоним
        
        ЭлементПереключатель.СписокВыбора.Добавить(СсылкаНаЗначение, ПредставлениеЗначения);
        
    КонецЦикла;

КонецПроцедуры

Используя Вариант Б, мы страхуем себя от ошибок: все новые значения перечисления автоматически станут доступными для выбора пользователем без доработки формы.

Настройка внешнего вида: Колонки

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

Если вы заметили, что переключатели отображаются, но текст обрезается или расположение выглядит хаотично, попробуйте явно установить КоличествоКолонок равным 1.

Современная альтернатива: Вид «Тумблер»

Начиная с версии платформы 8.3.15, для элемента «Поле переключателя» доступен новый вид отображения — Тумблер (в свойствах элемента параметр ВидПереключателя).

Визуально это выглядит как слитная группа кнопок, где активная кнопка подсвечена цветом. Это более современный интерфейсный паттерн, удобный для работы на сенсорных экранах и выглядящий компактнее классических радиокнопок.

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

Резюме

Давайте подведем итог. Если поле переключателя не выводится в приложении:

  1. Убедитесь, что у элемента формы заполнена коллекция СписокВыбора.
  2. Если список заполнен, но отображение некорректно, проверьте свойство КоличествоКолонок.
  3. Для динамических списков используйте метод Элементы.ИмяПоля.СписокВыбора.Добавить() в процедуре ПриСозданииНаСервере.
← На главную