Добавляем переключатель на управляемую форму

· 9 мин

Содержание

В 1С 8.3 нет отдельного элемента «переключатель», который можно перетащить из палитры. Переключатель — это обычное поле формы, у которого свойству Вид задано значение Поле переключателя. Поле привязывают к реквизиту типа Перечисление или Число, а варианты берутся из значений перечисления либо из списка выбора.

Отсюда частое заблуждение новичков: они ищут готовый контрол и не находят. На управляемой форме (интерфейс «Такси», платформа 8.3) вы сначала добавляете реквизит с нужным типом, кладёте его на форму как поле, а затем переключаете вид отображения. Весь процесс идёт в Конфигураторе и не зависит от прикладной конфигурации — приёмы одинаковы для собственной разработки, расширения или учебной базы.

Что делает переключатель и когда он уместен

Переключатель показывает несколько взаимоисключающих вариантов, из которых пользователь выбирает ровно один. Это замена выпадающего списка, когда вариантов немного (2–5) и важно, чтобы все они были видны сразу.

Выбирайте переключатель, если:

  • 🔘 вариантов немного и они фиксированы — способ доставки, режим расчёта, тип договора;
  • 🔘 пользователю удобнее видеть все значения, а не раскрывать список;
  • 🔘 от выбора зависит видимость или доступность других полей формы.

Если вариантов один-два и это «да/нет» — берите флажок (Поле флажка). Если вариантов больше пяти или они часто меняются — удобнее Поле ввода со списком выбора или ссылка на справочник. Переключатель на десяток строк превращается в простыню и теряет смысл.

Типичный сценарий: в документе «Счёт на оплату» нужно поле «Способ оплаты» с тремя вариантами, и при выборе «Карта» должно появляться поле для номера карты. Переключатель здесь удобнее списка — все способы видны сразу, а обработчик события скрывает и показывает зависимое поле. Этот пример и возьмём как сквозной: РежимыОплаты с вариантами «Наличные», «Карта», «Перевод».

Внешне переключатель может выглядеть как классические радиокнопки или как ряд кнопок-тумблеров. Это одно и то же поле, отличается только свойство вида — об этом ниже.

Шаг 1. Готовим источник вариантов

У переключателя должен быть тип, в котором значения дискретны. На практике используют два подхода.

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

Порядок создания перечисления:

  1. В дереве конфигурации правый клик на ветке Перечисления → Добавить.
  2. На вкладке «Основные» задайте имя, например РежимыОплаты.
  3. На вкладке «Значения» добавьте строки: Наличные, Карта, Перевод. Имя значения — латиницей или кириллицей, синоним — как увидит пользователь.

Число подходит, когда варианты — это коды или баллы (1, 2, 3), а подписи вы зададите вручную в списке выбора поля. Так делают для быстрых прототипов, но перечисление читается в коде яснее.

Порядок вариантов в переключателе повторяет порядок значений перечисления на вкладке «Значения» — перетащите их мышью, если нужен другой. Подпись к каждому варианту берётся из синонима значения, а не из имени: синоним правится в свойствах значения и может содержать пробелы и кириллицу. Ссылочные и составные типы для переключателя не годятся — у них нет короткого фиксированного набора, поэтому платформа не даст выбрать такой вид.

Реквизит, который хранит выбор, бывает двух видов. Решите заранее, где хранить значение — это определяет, увидит ли его пользователь после перезаписи.

Где хранитсяКогда применять
Реквизит объекта (документа, справочника)выбор нужно сохранить в базе вместе с объектом
Реквизит формывыбор нужен только на время работы формы (фильтр, режим отображения)

Реквизит объекта добавляют в самом объекте конфигурации, затем он появляется под веткой «Реквизиты» формы как Объект.<имя>. Реквизит формы добавляют прямо в редакторе формы на вкладке «Реквизиты».

Шаг 2. Кладём поле на форму в Конфигураторе

Откройте нужную форму (форму документа, справочника или общую форму) и перейдите в редактор формы.

  1. Справа на вкладке «Реквизиты» найдите реквизит с нужным типом. Если это реквизит объекта — он уже в списке; если реквизит формы — добавьте его командой Добавить реквизит и задайте тип (ваше перечисление или число).
  2. Перетащите реквизит мышью в дерево «Элементы» слева. Платформа создаст элемент с видом Поле ввода.
  3. Выделите созданное поле и откройте палитру свойств (F4 или двойной клик).
  4. В свойстве Вид выберите Поле переключателя.

После этого поле на форме превратится в набор радиокнопок. Если тип реквизита — перечисление, варианты подтянутся автоматически из его значений. Для числового реквизита поле пока пустое: варианты зададим на следующем шаге.

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

Шаг 3. Настраиваем свойства и внешний вид

Основная настройка переключателя — список его вариантов и способ отображения.

Список выбора. Свойство СписокВыбора хранит пары «значение — представление». Для перечисления его можно не трогать: платформа возьмёт синонимы значений. Для числового реквизита заполните список вручную в палитре свойств: каждая строка — число и подпись к нему.

Вид переключателя. Свойство ВидПереключателя задаёт внешний вид:

  • Переключатель — классические круглые радиокнопки с подписями;
  • Тумблер — ряд связанных кнопок, из которых нажата одна (компактнее, удобно для панелей).

Расположение. Число колонок задаёт свойство КоличествоКолонокПереключателя — при трёх вариантах и одной колонке они встанут столбцом, при трёх колонках — в строку. Заголовок поля и его положение регулируются свойствами Заголовок и ПоложениеЗаголовка, как у любого поля.

Чтобы один из вариантов был выбран при открытии формы, задайте начальное значение реквизита — для реквизита объекта удобно сделать это в обработчике заполнения, для реквизита формы — в ПриСозданииНаСервере.

Что проверить перед сохранением формы
Выполнено: 0 / 5

Переключатель или тумблер: что выбрать

Оба вида решают одну задачу — выбор одного из нескольких, — но воспринимаются по-разному. Радиокнопки читаются как «список опций», тумблер — как «режим». От этого и отталкивайтесь.

КритерийПереключатель (радиокнопки)Тумблер (кнопки)
Как выглядиткружки с подписямисвязанные кнопки в ряд
Сколько местабольше по высотекомпактно по ширине
Когда удобенформа документа, настройкипанель, фильтр над списком
Длинные подписичитаются нормальнорастягивают кнопки

Практическое правило: если варианты — это свойство заполняемого объекта (способ оплаты в счёте, вид операции), ставьте радиокнопки, пользователь воспринимает их как поле ввода. Если переключатель управляет видом списка или отчёта («показать все / только мои / архив»), берите тумблер — он живёт в командной панели и не занимает строку формы.

Менять вид можно в любой момент: свойство ВидПереключателя не влияет ни на тип реквизита, ни на сохранённые данные, только на отрисовку.

Шаг 4. Управляем переключателем и ловим выбор в коде

Самое частое, ради чего ставят переключатель, — реакция на выбор: показать или скрыть другие поля, подставить значения, пересчитать. Для этого служит событие ПриИзменении.

Назначьте обработчик: выделите поле, в палитре свойств на вкладке «События» у строки ПриИзменении нажмите лупу — платформа создаст процедуру.

&НаКлиенте
Процедура РежимОплатыПриИзменении(Элемент)
    УстановитьВидимостьПолей();
КонецПроцедуры

&НаКлиенте
Процедура УстановитьВидимостьПолей()
    Карта = ПредопределенноеЗначение("Перечисление.РежимыОплаты.Карта");
    Элементы.НомерКарты.Видимость = (Объект.РежимОплаты = Карта);
КонецПроцедуры

На клиенте нельзя обращаться к перечислению через Перечисления.РежимыОплаты.Карта — используйте функцию ПредопределенноеЗначение. Это и есть главный приём, на котором спотыкаются: на сервере первый вариант работает, на тонком клиенте управляемой формы — нет.

Полезно не только показывать зависимое поле, но и очищать его, когда вариант сменился. Иначе в счёте с оплатой «Наличные» останется номер карты от прошлого выбора:

&НаКлиенте
Процедура УстановитьВидимостьПолей()
    Карта = ПредопределенноеЗначение("Перечисление.РежимыОплаты.Карта");
    ЭтоКарта = (Объект.РежимОплаты = Карта);
    Элементы.НомерКарты.Видимость = ЭтоКарта;
    Если НЕ ЭтоКарта Тогда
        Объект.НомерКарты = "";
    КонецЕсли;
КонецПроцедуры

Прочитать текущий выбор просто — он равен значению реквизита:

Если Объект.РежимОплаты = ПредопределенноеЗначение("Перечисление.РежимыОплаты.Наличные") Тогда
    // своя логика
КонецЕсли;

Если список вариантов нужно собрать динамически (например, из настроек), заполните СписокВыбора программно в ПриСозданииНаСервере:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Элементы.ПриоритетЗадачи.СписокВыбора.Добавить(1, "Низкий");
    Элементы.ПриоритетЗадачи.СписокВыбора.Добавить(2, "Средний");
    Элементы.ПриоритетЗадачи.СписокВыбора.Добавить(3, "Высокий");
КонецПроцедуры

Метод Добавить(Значение, Представление) принимает значение (оно ляжет в реквизит) и подпись. Тип значения должен совпадать с типом реквизита — иначе платформа выдаст ошибку.

Заблокировать или скрыть переключатель из кода можно обращением к элементу:

Элементы.РежимОплаты.Доступность = Ложь;   // серый, выбор недоступен
Элементы.РежимОплаты.Видимость = Ложь;     // поле скрыто

Добавляем переключатель целиком из кода

Иногда поле нельзя завести в Конфигураторе заранее — например, набор вариантов зависит от данных, а форма общая. Тогда и реквизит, и элемент создают программно в ПриСозданииНаСервере.

Сначала добавляют реквизит формы методом ИзменитьРеквизиты, затем создают элемент и настраивают его:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // 1. Добавляем реквизит формы типа Число
    ДобавляемыеРеквизиты = Новый Массив;
    ДобавляемыеРеквизиты.Добавить(
        Новый РеквизитФормы("Приоритет", Новый ОписаниеТипов("Число")));
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);

    // 2. Создаём поле и делаем его переключателем
    Поле = Элементы.Добавить("Приоритет", Тип("ПолеФормы"));
    Поле.ПутьКДанным = "Приоритет";
    Поле.Вид = ВидПоляФормы.ПолеПереключателя;

    // 3. Заполняем варианты
    Поле.СписокВыбора.Добавить(1, "Низкий");
    Поле.СписокВыбора.Добавить(2, "Средний");
    Поле.СписокВыбора.Добавить(3, "Высокий");

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

Разберём ключевые строки:

  • ИзменитьРеквизиты принимает массив объектов РеквизитФормы; второй параметр метода — массив имён на удаление, здесь он не нужен.
  • Элементы.Добавить(Имя, Тип("ПолеФормы")) создаёт поле; третьим параметром можно указать группу-родителя, иначе поле встанет в корень формы.
  • ПутьКДанным связывает поле с реквизитом — без него поле «ни к чему не привязано» и выбор некуда сохранять.

Вызывать ИзменитьРеквизиты можно только на сервере и, по сути, при создании формы. Пересобирать реквизиты на каждое изменение не нужно — это тяжёлая операция, которая перестраивает форму целиком.

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

Частые ошибки при работе с переключателем

Большинство проблем сводится к типу реквизита и месту хранения значения. Разберите по симптому.

Диагностика: выберите симптом

Ещё одна тонкость: ширина поля-переключателя считается по самой длинной подписи. Если варианты разной длины и ВидПереключателя = Переключатель, кнопки могут «прыгать» по колонкам — тогда задайте фиксированное число колонок или переведите вид в Тумблер.

Частые вопросы

Чем переключатель отличается от флажка?
Флажок (Поле флажка) хранит два состояния — включено или нет, тип реквизита Булево. Переключатель даёт выбор одного варианта из нескольких и привязан к перечислению или числу. Если вариантов строго два и они противоположны — берите флажок, он компактнее.
Можно ли сделать переключатель без перечисления?
Да. Задайте реквизиту тип Число и заполните СписокВыбора поля: значение (число) и подпись к нему. Это быстрее для прототипа, но в коде перечисление читается яснее, чем магические числа.
Как задать вариант по умолчанию?
Установите начальное значение реквизита до показа формы: для реквизита формы — в ПриСозданииНаСервере, для реквизита объекта — при заполнении нового объекта. Переключатель встанет на тот вариант, чьё значение совпало.
Как расположить варианты в строку, а не столбцом?
Задайте свойству КоличествоКолонокПереключателя число, равное количеству вариантов, либо смените ВидПереключателя на Тумблер — там кнопки по умолчанию идут в ряд.
Почему на клиенте не работает сравнение с перечислением?
Глобальный контекст Перечисления доступен на сервере, но не в клиентских процедурах тонкого клиента. Для сравнения на клиенте используйте ПредопределенноеЗначение("Перечисление.Имя.Значение") или передавайте значение с сервера.