Добавляем переключатель на управляемую форму
Содержание
В 1С 8.3 нет отдельного элемента «переключатель», который можно перетащить из палитры. Переключатель — это обычное поле формы, у которого свойству Вид задано значение Поле переключателя. Поле привязывают к реквизиту типа Перечисление или Число, а варианты берутся из значений перечисления либо из списка выбора.
Отсюда частое заблуждение новичков: они ищут готовый контрол и не находят. На управляемой форме (интерфейс «Такси», платформа 8.3) вы сначала добавляете реквизит с нужным типом, кладёте его на форму как поле, а затем переключаете вид отображения. Весь процесс идёт в Конфигураторе и не зависит от прикладной конфигурации — приёмы одинаковы для собственной разработки, расширения или учебной базы.
Что делает переключатель и когда он уместен
Переключатель показывает несколько взаимоисключающих вариантов, из которых пользователь выбирает ровно один. Это замена выпадающего списка, когда вариантов немного (2–5) и важно, чтобы все они были видны сразу.
Выбирайте переключатель, если:
- 🔘 вариантов немного и они фиксированы — способ доставки, режим расчёта, тип договора;
- 🔘 пользователю удобнее видеть все значения, а не раскрывать список;
- 🔘 от выбора зависит видимость или доступность других полей формы.
Если вариантов один-два и это «да/нет» — берите флажок (Поле флажка). Если вариантов больше пяти или они часто меняются — удобнее Поле ввода со списком выбора или ссылка на справочник. Переключатель на десяток строк превращается в простыню и теряет смысл.
Типичный сценарий: в документе «Счёт на оплату» нужно поле «Способ оплаты» с тремя вариантами, и при выборе «Карта» должно появляться поле для номера карты. Переключатель здесь удобнее списка — все способы видны сразу, а обработчик события скрывает и показывает зависимое поле. Этот пример и возьмём как сквозной: РежимыОплаты с вариантами «Наличные», «Карта», «Перевод».
Внешне переключатель может выглядеть как классические радиокнопки или как ряд кнопок-тумблеров. Это одно и то же поле, отличается только свойство вида — об этом ниже.
Шаг 1. Готовим источник вариантов
У переключателя должен быть тип, в котором значения дискретны. На практике используют два подхода.
Перечисление — правильный выбор, когда набор вариантов жёстко задан на этапе разработки (например, «Наличные», «Карта», «Перевод»). Создайте объект конфигурации Перечисление, задайте ему значения на вкладке «Значения». Платформа сама подставит их в переключатель как варианты, а в коде вы будете сравнивать с понятными именами.
Порядок создания перечисления:
- В дереве конфигурации правый клик на ветке
Перечисления→Добавить. - На вкладке «Основные» задайте имя, например
РежимыОплаты. - На вкладке «Значения» добавьте строки:
Наличные,Карта,Перевод. Имя значения — латиницей или кириллицей, синоним — как увидит пользователь.
Число подходит, когда варианты — это коды или баллы (1, 2, 3), а подписи вы зададите вручную в списке выбора поля. Так делают для быстрых прототипов, но перечисление читается в коде яснее.
Порядок вариантов в переключателе повторяет порядок значений перечисления на вкладке «Значения» — перетащите их мышью, если нужен другой. Подпись к каждому варианту берётся из синонима значения, а не из имени: синоним правится в свойствах значения и может содержать пробелы и кириллицу. Ссылочные и составные типы для переключателя не годятся — у них нет короткого фиксированного набора, поэтому платформа не даст выбрать такой вид.
Реквизит, который хранит выбор, бывает двух видов. Решите заранее, где хранить значение — это определяет, увидит ли его пользователь после перезаписи.
| Где хранится | Когда применять |
|---|---|
| Реквизит объекта (документа, справочника) | выбор нужно сохранить в базе вместе с объектом |
| Реквизит формы | выбор нужен только на время работы формы (фильтр, режим отображения) |
Реквизит объекта добавляют в самом объекте конфигурации, затем он появляется под веткой «Реквизиты» формы как Объект.<имя>. Реквизит формы добавляют прямо в редакторе формы на вкладке «Реквизиты».
Шаг 2. Кладём поле на форму в Конфигураторе
Откройте нужную форму (форму документа, справочника или общую форму) и перейдите в редактор формы.
- Справа на вкладке «Реквизиты» найдите реквизит с нужным типом. Если это реквизит объекта — он уже в списке; если реквизит формы — добавьте его командой
Добавить реквизити задайте тип (ваше перечисление или число). - Перетащите реквизит мышью в дерево «Элементы» слева. Платформа создаст элемент с видом
Поле ввода. - Выделите созданное поле и откройте палитру свойств (
F4или двойной клик). - В свойстве
ВидвыберитеПоле переключателя.
После этого поле на форме превратится в набор радиокнопок. Если тип реквизита — перечисление, варианты подтянутся автоматически из его значений. Для числового реквизита поле пока пустое: варианты зададим на следующем шаге.
Если в свойстве Вид нет пункта Поле переключателя, значит тип реквизита не поддерживает переключатель. Составной тип или ссылка на справочник так отображать нельзя — верните примитивный тип или перечисление.
Шаг 3. Настраиваем свойства и внешний вид
Основная настройка переключателя — список его вариантов и способ отображения.
Список выбора. Свойство СписокВыбора хранит пары «значение — представление». Для перечисления его можно не трогать: платформа возьмёт синонимы значений. Для числового реквизита заполните список вручную в палитре свойств: каждая строка — число и подпись к нему.
Вид переключателя. Свойство ВидПереключателя задаёт внешний вид:
Переключатель— классические круглые радиокнопки с подписями;Тумблер— ряд связанных кнопок, из которых нажата одна (компактнее, удобно для панелей).
Расположение. Число колонок задаёт свойство КоличествоКолонокПереключателя — при трёх вариантах и одной колонке они встанут столбцом, при трёх колонках — в строку. Заголовок поля и его положение регулируются свойствами Заголовок и ПоложениеЗаголовка, как у любого поля.
Чтобы один из вариантов был выбран при открытии формы, задайте начальное значение реквизита — для реквизита объекта удобно сделать это в обработчике заполнения, для реквизита формы — в ПриСозданииНаСервере.
Переключатель или тумблер: что выбрать
Оба вида решают одну задачу — выбор одного из нескольких, — но воспринимаются по-разному. Радиокнопки читаются как «список опций», тумблер — как «режим». От этого и отталкивайтесь.
| Критерий | Переключатель (радиокнопки) | Тумблер (кнопки) |
|---|---|---|
| Как выглядит | кружки с подписями | связанные кнопки в ряд |
| Сколько места | больше по высоте | компактно по ширине |
| Когда удобен | форма документа, настройки | панель, фильтр над списком |
| Длинные подписи | читаются нормально | растягивают кнопки |
Практическое правило: если варианты — это свойство заполняемого объекта (способ оплаты в счёте, вид операции), ставьте радиокнопки, пользователь воспринимает их как поле ввода. Если переключатель управляет видом списка или отчёта («показать все / только мои / архив»), берите тумблер — он живёт в командной панели и не занимает строку формы.
Менять вид можно в любой момент: свойство ВидПереключателя не влияет ни на тип реквизита, ни на сохранённые данные, только на отрисовку.
Шаг 4. Управляем переключателем и ловим выбор в коде
Самое частое, ради чего ставят переключатель, — реакция на выбор: показать или скрыть другие поля, подставить значения, пересчитать. Для этого служит событие ПриИзменении.
Назначьте обработчик: выделите поле, в палитре свойств на вкладке «События» у строки ПриИзменении нажмите лупу — платформа создаст процедуру.
&НаКлиенте
Процедура РежимОплатыПриИзменении(Элемент)
УстановитьВидимостьПолей();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьВидимостьПолей()
Карта = ПредопределенноеЗначение("Перечисление.РежимыОплаты.Карта");
Элементы.НомерКарты.Видимость = (Объект.РежимОплаты = Карта);
КонецПроцедуры
На клиенте нельзя обращаться к перечислению через Перечисления.РежимыОплаты.Карта — используйте функцию ПредопределенноеЗначение. Это и есть главный приём, на котором спотыкаются: на сервере первый вариант работает, на тонком клиенте управляемой формы — нет.
Полезно не только показывать зависимое поле, но и очищать его, когда вариант сменился. Иначе в счёте с оплатой «Наличные» останется номер карты от прошлого выбора:
&НаКлиенте
Процедура УстановитьВидимостьПолей()
Карта = ПредопределенноеЗначение("Перечисление.РежимыОплаты.Карта");
ЭтоКарта = (Объект.РежимОплаты = Карта);
Элементы.НомерКарты.Видимость = ЭтоКарта;
Если НЕ ЭтоКарта Тогда
Объект.НомерКарты = "";
КонецЕсли;
КонецПроцедуры
Прочитать текущий выбор просто — он равен значению реквизита:
Если Объект.РежимОплаты = ПредопределенноеЗначение("Перечисление.РежимыОплаты.Наличные") Тогда
// своя логика
КонецЕсли;
Если список вариантов нужно собрать динамически (например, из настроек), заполните СписокВыбора программно в ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.ПриоритетЗадачи.СписокВыбора.Добавить(1, "Низкий");
Элементы.ПриоритетЗадачи.СписокВыбора.Добавить(2, "Средний");
Элементы.ПриоритетЗадачи.СписокВыбора.Добавить(3, "Высокий");
КонецПроцедуры
Метод Добавить(Значение, Представление) принимает значение (оно ляжет в реквизит) и подпись. Тип значения должен совпадать с типом реквизита — иначе платформа выдаст ошибку.
Заблокировать или скрыть переключатель из кода можно обращением к элементу:
Элементы.РежимОплаты.Доступность = Ложь; // серый, выбор недоступен
Элементы.РежимОплаты.Видимость = Ложь; // поле скрыто
Добавляем переключатель целиком из кода
Иногда поле нельзя завести в Конфигураторе заранее — например, набор вариантов зависит от данных, а форма общая. Тогда и реквизит, и элемент создают программно в ПриСозданииНаСервере.
Сначала добавляют реквизит формы методом ИзменитьРеквизиты, затем создают элемент и настраивают его:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Добавляем реквизит формы типа Число
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(
Новый РеквизитФормы("Приоритет", Новый ОписаниеТипов("Число")));
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// 2. Создаём поле и делаем его переключателем
Поле = Элементы.Добавить("Приоритет", Тип("ПолеФормы"));
Поле.ПутьКДанным = "Приоритет";
Поле.Вид = ВидПоляФормы.ПолеПереключателя;
// 3. Заполняем варианты
Поле.СписокВыбора.Добавить(1, "Низкий");
Поле.СписокВыбора.Добавить(2, "Средний");
Поле.СписокВыбора.Добавить(3, "Высокий");
КонецПроцедуры
Разберём ключевые строки:
ИзменитьРеквизитыпринимает массив объектовРеквизитФормы; второй параметр метода — массив имён на удаление, здесь он не нужен.Элементы.Добавить(Имя, Тип("ПолеФормы"))создаёт поле; третьим параметром можно указать группу-родителя, иначе поле встанет в корень формы.ПутьКДаннымсвязывает поле с реквизитом — без него поле «ни к чему не привязано» и выбор некуда сохранять.
Вызывать ИзменитьРеквизиты можно только на сервере и, по сути, при создании формы. Пересобирать реквизиты на каждое изменение не нужно — это тяжёлая операция, которая перестраивает форму целиком.
Такой приём выручает в универсальных обработках и внешних формах, где заранее неизвестно, сколько будет вариантов. Для обычной прикладной задачи проще и надёжнее завести перечисление и поле в Конфигураторе.
Частые ошибки при работе с переключателем
Большинство проблем сводится к типу реквизита и месту хранения значения. Разберите по симптому.
СписокВыбора. Заполните его в свойствах поля или программно. Для перечисления проверьте, что у объекта заданы значения на вкладке «Значения».Перечисления.Имя.Значение. Замените на ПредопределенноеЗначение("Перечисление.Имя.Значение").ПриИзменении.Ещё одна тонкость: ширина поля-переключателя считается по самой длинной подписи. Если варианты разной длины и ВидПереключателя = Переключатель, кнопки могут «прыгать» по колонкам — тогда задайте фиксированное число колонок или переведите вид в Тумблер.
Частые вопросы
Чем переключатель отличается от флажка?
Поле флажка) хранит два состояния — включено или нет, тип реквизита Булево. Переключатель даёт выбор одного варианта из нескольких и привязан к перечислению или числу. Если вариантов строго два и они противоположны — берите флажок, он компактнее.Можно ли сделать переключатель без перечисления?
Число и заполните СписокВыбора поля: значение (число) и подпись к нему. Это быстрее для прототипа, но в коде перечисление читается яснее, чем магические числа.Как задать вариант по умолчанию?
ПриСозданииНаСервере, для реквизита объекта — при заполнении нового объекта. Переключатель встанет на тот вариант, чьё значение совпало.Как расположить варианты в строку, а не столбцом?
КоличествоКолонокПереключателя число, равное количеству вариантов, либо смените ВидПереключателя на Тумблер — там кнопки по умолчанию идут в ряд.Почему на клиенте не работает сравнение с перечислением?
Перечисления доступен на сервере, но не в клиентских процедурах тонкого клиента. Для сравнения на клиенте используйте ПредопределенноеЗначение("Перечисление.Имя.Значение") или передавайте значение с сервера.