Как работать с переключателем на управляемой форме 1С:Предприятия 8.3

· 9 мин

Содержание

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

Частая ошибка новичков — искать «Переключатель» в списке добавляемых элементов, как в обычных формах 8.2, и делать по полю на каждый вариант. На управляемой форме один реквизит и одно поле дают сразу всю группу вариантов: «Все / Только активные / Только закрытые». Дальше — как эффективно работать с переключателем в 1С:Предприятии: от настройки до динамического списка значений.

Где переключатель нужен и чем он отличается от флажка и списка

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

Сравнение с соседними элементами:

ЭлементКогда братьОграничения
ФлажокДа/нет, одна опцияТолько булево значение
Поле переключателя2–5 взаимоисключающих вариантовМного вариантов загромождают форму
Поле ввода со списком выбора6+ вариантов или длинные названияВарианты скрыты до нажатия
Тумблер (вид переключателя)2–4 коротких варианта в шапкеПлохо читается при длинных подписях

У поля переключателя есть свойство Вид переключателя с тремя значениями:

  • 🔘 Переключатель — классические круглые радиокнопки.
  • 🎚️ Тумблер — сегментированная кнопка, варианты стоят вплотную, выбранный подсвечен. Удобно для режимов «День / Неделя / Месяц».
  • ⚙️ Авто — платформа решает сама; на практике чаще показывает радиокнопки.

💡 Тумблер экономит место по вертикали. Для фильтров над списком он смотрится аккуратнее, чем столбик радиокнопок.

Переключатель в обычных формах

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

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

Возьмём пример: обработка с выбором режима отбора документов — «Все», «Проведённые», «Непроведённые».

Шаг 1. Реквизит формы

  1. Откройте форму в конфигураторе, вкладка Реквизиты.
  2. Добавьте реквизит РежимОтбора.
  3. Тип — Число, длина 1, точность 0. Подойдёт и Строка, и перечисление, если оно уже есть в конфигурации.

Число удобно для кода (Если РежимОтбора = 2), перечисление — для читаемости и для хранения в объекте. Строку берут, когда значение уходит наружу, например в параметр внешней системы.

Шаг 2. Элемент на форме

  1. Перетащите реквизит в дерево Элементы.
  2. В палитре свойств элемента найдите Вид и выберите Поле переключателя.
  3. В Вид переключателя укажите Переключатель или Тумблер.

Шаг 3. Список выбора

Откройте свойство Список выбора и добавьте строки «значение — представление»:

ЗначениеПредставление
0Все
1Проведённые
2Непроведённые

Тип значений в списке должен совпадать с типом реквизита. Число 1 и строка «1» для платформы — разные значения.

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

Шаг 4. Внешний вид

  • 📐 Количество колонок — сколько вариантов в строке. Значение 3 выстроит наш пример в одну строку, 1 — в столбик.
  • 🏷️ Положение заголовка — Нет, если подпись «Режим отбора» не нужна.
  • ↔️ Растягивать по горизонтали — выключите, чтобы тумблер не растягивался на всю ширину формы.

Шаг 5. Значение по умолчанию

Реквизит типа Число по умолчанию равен 0 — в примере это совпадает с «Все». Если 0 нет в списке, ни один вариант не будет отмечен. Задайте стартовое значение в ПриСозданииНаСервере:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если РежимОтбора = 0 Тогда
		РежимОтбора = 1; // по умолчанию показываем проведённые
	КонецЕсли;
КонецПроцедуры

Реакция на выбор: событие ПриИзменении

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

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

&НаСервере
Процедура ОбновитьОтбор()
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
		Список, "Проведен", РежимОтбора = 1, , , РежимОтбора <> 0);
КонецПроцедуры

Процедура УстановитьЭлементОтбораДинамическогоСписка есть в типовых конфигурациях на БСП. В самописной конфигурации без БСП отбор ставят через Список.Отбор.Элементы напрямую.

Что обычно делают в обработчике:

  • 🔄 обновляют отбор динамического списка или перечитывают данные;
  • 👁️ меняют Видимость и Доступность других элементов под выбранный режим;
  • 🧮 пересчитывают итоги на форме.

Пример управления видимостью — показывать поле «Контрагент» только в режиме 2:

&НаКлиенте
Процедура РежимОтбораПриИзменении(Элемент)
	Элементы.Контрагент.Видимость = (РежимОтбора = 2);
КонецПроцедуры

Видимость элементов можно менять прямо на клиенте, без вызова сервера. Это быстрее: нет серверного вызова на каждый клик.

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

Как передать выбор переключателя в запрос и отчёт

В запрос

Значение реквизита передают параметром. Ветвление по режиму удобно сделать прямо в тексте запроса:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Док.Ссылка,
|	Док.Дата,
|	Док.Проведен
|ИЗ
|	Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
|	(&Режим = 0
|		ИЛИ &Режим = 1 И Док.Проведен
|		ИЛИ &Режим = 2 И НЕ Док.Проведен)";
Запрос.УстановитьПараметр("Режим", РежимОтбора);

Один текст запроса на все три варианта проще сопровождать, чем три разных текста. Для больших таблиц лучше собирать условие кодом, чтобы СУБД получала простой отбор без ИЛИ.

В отчёт на СКД

В отчёте на системе компоновки переключатель обычно делают так:

  1. В схеме компоновки добавьте параметр Режим типа Число и используйте его в запросе набора данных.
  2. В форме отчёта создайте реквизит и поле переключателя, как выше.
  3. В ПриИзменении передайте значение в настройки:
&НаКлиенте
Процедура РежимОтбораПриИзменении(Элемент)
	Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
		"Режим", РежимОтбора);
КонецПроцедуры

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

💡 Простой вариант без своего поля: у параметра СКД задайте Доступные значения с представлениями. Пользователь выберет режим из списка в настройках отчёта, код писать не нужно. Радиокнопок при этом не будет — только выпадающий список.

Динамическое управление вариантами переключателя

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

&НаСервере
Процедура НастроитьВариантыРежима()
	Варианты = Элементы.РежимОтбора.СписокВыбора;
	Варианты.Очистить();
	Варианты.Добавить(0, "Все");
	Варианты.Добавить(1, "Проведённые");
	Если ПравоДоступа("Проведение", Метаданные.Документы.РеализацияТоваровУслуг) Тогда
		Варианты.Добавить(2, "Непроведённые");
	ИначеЕсли РежимОтбора = 2 Тогда
		РежимОтбора = 1;
	КонецЕсли;
КонецПроцедуры

Смысл последней ветки: если текущее значение реквизита пропало из списка, сбросьте его на допустимое. Иначе на форме не будет отмечен ни один вариант.

Переключатель, созданный полностью из кода

Бывает, что набор режимов известен только во время работы, например в универсальной обработке. Тогда реквизит и элемент создают программно:

&НаСервере
Процедура СоздатьПереключатель()
	Добавляемые = Новый Массив;
	Добавляемые.Добавить(Новый РеквизитФормы("Вариант",
		Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(2, 0))));
	ИзменитьРеквизиты(Добавляемые);

	Поле = Элементы.Добавить("Вариант", Тип("ПолеФормы"));
	Поле.Вид = ВидПоляФормы.ПолеПереключателя;
	Поле.ПутьКДанным = "Вариант";
	Поле.ВидПереключателя = ВидПереключателя.Тумблер;
	Поле.СписокВыбора.Добавить(1, "Месяц");
	Поле.СписокВыбора.Добавить(2, "Квартал");
	Поле.СписокВыбора.Добавить(3, "Год");
	Вариант = 1;
КонецПроцедуры

Обработчик события для такого поля назначают методом Поле.УстановитьДействие("ПриИзменении", "ВариантПриИзменении"). Сама процедура ВариантПриИзменении должна заранее быть в модуле формы.

Как запомнить выбор пользователя

Реквизит формы живёт, пока форма открыта. Чтобы при следующем открытии стоял последний выбранный вариант, есть два пути:

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

Для отчётов и обработок проще первый способ, для документов — второй.

Переключатель на типовой форме через расширение

В типовой конфигурации (Бухгалтерия, ЗУП, УТ) переключатель добавляют не в основную конфигурацию, а в расширение. Так доработка не потеряется при обновлении, а поддержка поставщика останется включённой.

Порядок действий:

  1. В конфигураторе откройте Конфигурация → Расширения конфигурации и создайте расширение.
  2. В дереве основной конфигурации найдите нужную форму, в контекстном меню выберите Добавить в расширение.
  3. В заимствованной форме создайте реквизит формы и поле переключателя так же, как на обычной форме.
  4. Обработчики событий формы, которые уже есть в типовой, подключайте через &После или &Перед, а не копированием кода.
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если РежимОтбора = 0 Тогда
		РежимОтбора = 1;
	КонецЕсли;
КонецПроцедуры

Имена своих реквизитов и элементов начинайте с префикса расширения, например Расш1_РежимОтбора. Если в следующем релизе типовая получит элемент с тем же именем, конфликта не будет.

💡 Перед выпуском проверьте форму под пользователем без административных прав. Права на расширение и на объекты, к которым обращается обработчик переключателя, у него могут отличаться.

Ошибки при работе с переключателем и как их исправить

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

Ещё две ошибки, которые всплывают уже в работе:

  • 🐢 Тормозит форма при каждом клике. Обработчик на клиенте вызывает сервер ради простой смены видимости. Видимость и доступность меняйте на клиенте, сервер вызывайте только для данных.
  • 🧩 После обновления типовой переключатель пропал. Правка была сделана прямо в основной конфигурации, без расширения, и при обновлении её затёрли.

Перед правкой форм в рабочей базе сделайте резервную копию и согласуйте изменения по регламенту вашей компании. Изменения в основной конфигурации требуют обновления конфигурации базы данных.

Частые вопросы о переключателе в 1С

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