Создание и настройка переключателя на управляемой форме 1С 8.3

· 9 мин

Содержание

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

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

Разберём весь путь по шагам: как завести реквизит под переключатель, вывести его на управляемую форму, заполнить варианты, обработать выбор и связать его с остальными элементами.

Всё описанное относится к платформе 8.3 с интерфейсом «Такси» и управляемым формам. На обычных (неуправляемых) формах переключатель устроен иначе — об этом в конце.

Реквизит, к которому привязан переключатель

Переключатель всегда хранит выбор в каком-то значении. Поэтому первый шаг — завести реквизит и правильно выбрать его тип.

Где заводить реквизит, зависит от того, нужно ли хранить выбор:

  • 📌 выбор должен сохраняться вместе с объектом (в документе, элементе справочника) — заводите реквизит объекта в дереве метаданных;
  • 📌 выбор нужен только для логики на форме в текущем сеансе — заводите реквизит формы прямо в редакторе формы.

Тип реквизита определяет, сколько вариантов вы сможете предложить:

Тип реквизитаКогда подходит
Число2 и более вариантов; значения 0, 1, 2… вы задаёте вручную
ПеречислениеСсылка.Имяварианты и подписи берутся из перечисления автоматически
Булевотолько два состояния; но для двух вариантов обычно удобнее флажок

Для трёх и более вариантов тип Булево не подойдёт — он даёт лишь два состояния. Берите Число или перечисление.

Чтобы добавить реквизит формы: откройте форму в конфигураторе, перейдите на закладку реквизитов формы, добавьте новый реквизит, задайте ему имя (например, ВидОплаты) и тип.

С реквизитом объекта порядок другой. Сначала реквизит добавляют самому объекту в дереве метаданных (документу, справочнику). На форме он появляется внутри основного реквизита — того, что связывает форму с объектом. Оттуда его и перетаскивают на форму. Выбор, сделанный переключателем, запишется в базу при записи объекта.

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

Как вывести переключатель на форму в конфигураторе

После того как реквизит заведён, его нужно показать на форме и превратить обычное поле в группу радиокнопок.

  1. В редакторе формы перетащите реквизит из дерева реквизитов в дерево элементов. Появится элемент типа Поле, связанный с этим реквизитом.
  2. Выделите поле и откройте палитру свойств.
  3. Найдите свойство «Вид» и выберите в нём значение «Поле переключателя».

После этого поле перерисуется: вместо строки ввода появится набор радиокнопок. Платформа сама следит, чтобы включённой была только одна.

Перетаскивание — не единственный путь. Можно добавить в дерево элементов новый элемент типа «Поле» вручную и затем вписать в его свойство «ПутьКДанным» имя реквизита. Результат тот же, просто связь задаётся не перетаскиванием, а вручную — это удобно, когда порядок элементов на форме уже выстроен и перетаскивать мешает.

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

Привязка к данным задаётся свойством «ПутьКДанным» поля — при перетаскивании реквизита оно заполняется автоматически, проверять нужно только при ручной настройке.

Настройка вариантов переключателя и привязка к данным

Дальше переключателю нужно объяснить, какие именно кнопки показывать. Способ зависит от типа реквизита.

Тип Число. Варианты задаются в свойстве «Список выбора» поля. Это набор пар «значение — представление»: число хранится в реквизите, а текст показывается рядом с кнопкой.

Например, для вида оплаты:

  • 0 — «Наличные»;
  • 1 — «Банковской картой»;
  • 2 — «Онлайн-перевод».

Список выбора можно заполнить прямо в палитре свойств, а можно собрать программно при открытии формы:

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

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

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

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

При таком типе и обработчик читается нагляднее — сравнивать удобно не с числом, а с конкретным значением перечисления:

&НаКлиенте
Процедура ВидОплатыПриИзменении(Элемент)
	Если ВидОплаты = ПредопределённоеЗначение("Перечисление.ВидыОплаты.Наличные") Тогда
		Элементы.ГруппаКарта.Видимость = Ложь;
	Иначе
		Элементы.ГруппаКарта.Видимость = Истина;
	КонецЕсли;
КонецПроцедуры

В клиентском коде значение перечисления получают через ПредопределённоеЗначение, потому что обращаться к менеджеру перечисления напрямую на клиенте нельзя. На сервере пишут короче: Перечисления.ВидыОплаты.Наличные.

Как разложить кнопки — в столбик или в строку — задаёт свойство «Количество колонок списка выбора». Один столбец — вертикальный список, число по количеству вариантов — кнопки в одну строку.

Задайте реквизиту начальное значение. Иначе переключатель откроется без выбранной кнопки, и пользователь увидит пустую группу. Для Число это, как правило, 0; для перечисления — одно из его значений.

Обработчик события «ПриИзменении»: реакция на выбор

Чтобы форма реагировала на переключение, повесьте на поле обработчик события «ПриИзменении».

Выделите поле переключателя, в палитре свойств на закладке событий у строки «ПриИзменении» нажмите кнопку создания обработчика. Платформа создаст клиентскую процедуру с директивой &НаКлиенте и именем по шаблону «ИмяЭлементаПриИзменении» — переименовывать его не нужно, связь с событием уже установлена.

Внутри обработчика доступно текущее значение реквизита — его и анализируете:

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

&НаКлиенте
Процедура ОбновитьДоступностьГрупп()
	Элементы.ГруппаНаличные.Видимость = (ВидОплаты = 0);
	Элементы.ГруппаКарта.Видимость    = (ВидОплаты = 1);
КонецПроцедуры

Событие срабатывает каждый раз, когда пользователь нажимает другую кнопку. Значение реквизита к этому моменту уже обновлено, поэтому в обработчике можно смело читать ВидОплаты и ветвить логику.

Обработчик «ПриИзменении» выполняется на клиенте и должен быть помечен &НаКлиенте. Если по ошибке поставить &НаСервере, платформа не свяжет его с событием, и переключение не вызовет никакой реакции.

Если при смене варианта нужно обратиться к базе (пересчитать, прочитать данные), не делайте это прямо в клиентском обработчике — вынесите тяжёлую часть в серверный метод и вызовите его из клиента:

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

&НаСервереБезКонтекста
Функция ПересчитатьНаСервере(ВидОплаты)
	// обращение к базе, расчёт по выбранному варианту
	Возврат ВидОплаты;
КонецФункции

Директива &НаСервереБезКонтекста не передаёт на сервер всю форму целиком — вызов получается лёгким и быстрым. Всё, что нужно для расчёта, передавайте параметрами, а результат возвращайте и применяйте уже на клиенте.

Как связать переключатель с другими полями формы

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

Для управления используйте свойства элементов:

  • 🔹 Видимость — показать или скрыть поле либо группу;
  • 🔹 Доступность — сделать поле активным или заблокированным для ввода;
  • 🔹 ТолькоПросмотр — разрешить чтение, но запретить правку.

Скрывать поле или только блокировать — зависит от сценария. Скрытие (Видимость = Ложь) убирает ненужное, чтобы форма не пестрела лишним. Блокировка (Доступность = Ложь) оставляет поле на виду, но запрещает ввод — так пользователь понимает, что поле существует, просто сейчас неактуально. Для реквизитов, которые важно видеть всегда, выбирайте блокировку, а не скрытие.

Удобный приём — сгруппировать зависимые поля в обычные группы без отображения и переключать видимость целой группы, а не каждого поля по отдельности:

&НаКлиенте
Процедура ОбновитьДоступностьГрупп()
	Элементы.ГруппаНаличные.Видимость = (ВидОплаты = 0);
	Элементы.ГруппаКарта.Видимость    = (ВидОплаты = 1);
	Элементы.ГруппаПеревод.Видимость  = (ВидОплаты = 2);
КонецПроцедуры

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

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

Обратите внимание: в серверном обработчике нельзя вызвать клиентскую процедуру ОбновитьДоступностьГрупп. Поэтому начальную установку видимости либо дублируют строками прямо в «ПриСозданииНаСервере», либо выносят в отдельный серверный метод.

Если условий много и они повторяются, держите всю логику видимости в одной процедуре и вызывайте её и из «ПриИзменении», и (серверным аналогом) при открытии. Так поведение формы не разъедется.

Переключатель или выпадающий список: что выбрать

Один и тот же реквизит со списком выбора можно показать двумя способами: переключателем (вид «Поле переключателя») или полем ввода с выпадающим списком (вид «Поле ввода» плюс режим выбора из списка). Выбор влияет на удобство, а не на данные — значение хранится одинаково.

Ориентируйтесь по числу вариантов:

  • 🔹 2–4 варианта — берите переключатель. Все варианты видны сразу, выбор в один клик, не нужно раскрывать список.
  • 🔹 5 и больше — удобнее выпадающий список: переключатель на десяток кнопок занимает пол-формы.
  • 🔹 Варианты редко меняются — переключатель нагляднее и подсказывает пользователю, что ещё можно выбрать.

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

Частые ошибки при создании переключателя

Ошибки с переключателем обычно одни и те же, и почти все видны по поведению формы.

  • ❌ Выбран тип Булево для трёх вариантов. Булево — это два состояния. Для выбора из трёх и более нужен Число или перечисление.
  • ❌ Не задано начальное значение реквизита. Переключатель открывается без выбранной кнопки. Задайте значение по умолчанию в данных или в «ПриСозданииНаСервере».
  • ❌ Логика видимости стоит только в «ПриИзменении». При открытии формы она не отработает. Продублируйте начальную установку при создании формы на сервере.
  • ❌ Пустой список выбора при типе Число. Поле переключателя не покажет ни одной кнопки. Заполните список выбора или перейдите на перечисление.
  • ❌ Обработчик помечен &НаСервере вместо &НаКлиенте. Событие «ПриИзменении» клиентское — такой обработчик просто не вызовется.
Проверьте перед сохранением конфигурации
Выполнено: 0 / 6

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

Чем переключатель отличается от флажка?
Флажок (тип Булево) — это одно поле с двумя состояниями: включено или выключено. Переключатель предлагает выбрать один вариант из нескольких взаимоисключающих, и значением может быть число или ссылка на перечисление.
Можно ли построить переключатель на перечислении?
Да, и это самый аккуратный способ. Задайте реквизиту тип ПеречислениеСсылка.Имя, выведите его на форму и поставьте вид «Поле переключателя». Кнопки появятся по значениям перечисления, подписи — по их синонимам, список выбора заполнять не нужно.
Как расположить варианты в несколько колонок или в строку?
За раскладку отвечает свойство «Количество колонок списка выбора» у поля. Одна колонка — кнопки в столбик, число колонок по количеству вариантов — в одну строку.
Где хранится выбранный вариант — в базе или только в форме?
Зависит от того, какой реквизит вы завели. Реквизит объекта сохраняется вместе с документом или элементом справочника. Реквизит формы живёт только в текущем сеансе работы с формой и в базу не записывается.
Переключатель есть и на обычных формах?
На обычных (неуправляемых) формах переключатель — это отдельный элемент управления, который размещают из палитры и настраивают по-другому. Описанный порядок — через реквизит и свойство «Вид» поля — относится к управляемым формам платформы 8.3.