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