Переключатель и флажок в 1С: добавляем на форму и связываем с данными

· 9 мин

Содержание

Переключатель в 1С — это поле формы с видом «Поле переключателя»: оно показывает несколько взаимоисключающих вариантов, из которых пользователь выбирает один. Флажок — поле с видом «Поле флажка» для значения «да/нет». Оба элемента рисуются на управляемой форме за пару минут, но работать начинают только когда связаны с реквизитом через свойство ПутьКДанным.

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

Флажок, переключатель или тумблер: что ставить

Выбор элемента зависит от того, какое значение вы храните.

  • ✅ Флажок — для реквизита типа Булево. Одно значение: включено или нет. Пример: «Учитывать НДС», «Согласие на обработку».
  • ✅ Переключатель — для реквизита типа Число или значения перечисления, когда вариантов два и больше и выбрать можно только один. Пример: способ доставки, вид расчёта.
  • ✅ Флажок в режиме «Тумблер» — тот же Булево, но выглядит как ползунок. Свойство ВидФлажка на поле меняет внешний вид, логика та же.

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

Что выбрать под вашу задачу?

Добавляем флажок на форму через конструктор

Самый частый случай — флажок на форме элемента справочника или документа. Порядок такой:

  1. Откройте нужную форму в конфигураторе (ветка Формы объекта, двойной клик по форме).
  2. В редакторе формы найдите панель с двумя списками: слева Реквизиты, рядом Элементы.
  3. Если поле хранится в самом объекте — нужный реквизит уже есть в ветке Объект. Перетащите его из списка реквизитов в список элементов.
  4. Платформа сама подберёт вид поля: для реквизита типа Булево создаётся поле флажка.
  5. Проверьте свойство Заголовок — именно он выводится рядом с галочкой, а не имя реквизита.

Если реквизита в объекте нет, а флажок нужен только на время работы с формой (служебный), добавьте реквизит формы типа Булево через панель реквизитов, кнопка «Добавить». Такое значение в базе не сохраняется.

После этого запустите 1С:Предприятие в режиме отладки и откройте форму — флажок уже кликается и меняет значение реквизита.

Группа переключателей с взаимоисключающим выбором

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

  1. Добавьте реквизит типа Число (в объекте или на форме). Число — это индекс выбранного варианта: 0, 1, 2 и так далее.
  2. Перетащите реквизит на форму. Платформа создаст поле ввода, а не переключатель — вид нужно сменить вручную.
  3. В свойствах поля смените Вид на Поле переключателя.
  4. Заполните СписокВыбора: для каждого варианта задайте значение (число) и представление (текст, который видит пользователь).

Пример списка выбора для способа доставки:

ЗначениеПредставление
0Самовывоз
1Курьер
2Транспортная компания

Чтобы варианты легли в несколько столбцов, а не в одну колонку, задайте в свойствах поля число колонок переключателя. А свойство ВидПереключателя переключает внешний вид между классическими радиокнопками и тумблером-сегментом.

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

Создаём переключатель программно в модуле формы

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

&НаСервере
Процедура ДобавитьПереключательДоставки()

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

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

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

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

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

  • ИзменитьРеквизиты принимает массив добавляемых реквизитов (и, при необходимости, вторым параметром — массив удаляемых). Вызывать его можно только на сервере.
  • Элементы.Добавить создаёт визуальный элемент. Третий параметр — родитель: группа формы, в которую ляжет поле. Если передать Форма, поле встанет в корень.
  • ПутьКДанным — главная строка. Без неё поле ничего не хранит и не отображает. Для реквизита объекта путь был бы "Объект.СпособДоставки".

Для флажка всё то же самое, меняются два места: тип реквизита на Булево и вид поля на ВидПоляФормы.ПолеФлажка (список выбора ему не нужен).

Если набор вариантов нужно поменять уже после создания поля (например, часть способов доставки стала недоступна), не удаляйте и не пересоздавайте элемент — очистите и наполните список выбора заново: Поле.СписокВыбора.Очистить(), затем нужные Добавить. Это дешевле и не ломает привязку к данным.

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

Привязка к данным: реквизит объекта и реквизит формы

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

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

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

Число в качестве индекса варианта удобно писать быстро, но через полгода СпособДоставки = 2 в коде уже ни о чём не говорит. Читаемее держать варианты в перечислении. Тогда реквизит объявляют типом этого перечисления, а список выбора наполняют его значениями:

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

Сравнение в обработчиках становится самодокументированным: ВидОплаты = Перечисления.ВидыОплаты.Безналичные читается без шпаргалки с номерами.

Частая связка — флажок управляет доступностью поля:

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

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

Зависимые переключатели и каскадная логика

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

Типичный сценарий: переключатель «Способ доставки» управляет видимостью полей адреса и транспортной компании.

&НаКлиенте
Процедура СпособДоставкиПриИзменении(Элемент)
    // 0 — Самовывоз, 1 — Курьер, 2 — Транспортная компания
    Элементы.АдресДоставки.Видимость         = (СпособДоставки <> 0);
    Элементы.ТранспортнаяКомпания.Видимость  = (СпособДоставки = 2);
КонецПроцедуры

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

&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьВидимостьДоставки(Форма, СпособДоставки)
    Форма.Элементы.АдресДоставки.Видимость        = (СпособДоставки <> 0);
    Форма.Элементы.ТранспортнаяКомпания.Видимость = (СпособДоставки = 2);
КонецПроцедуры

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

Для управления доступностью (поле видно, но заблокировано) используйте Доступность, для скрытия — Видимость. Скрытое поле не занимает место на форме, заблокированное — занимает, но выделено серым. Выбирайте по смыслу: лишние поля лучше прятать.

Типичные ошибки при настройке

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

  • Вид поля сменили, а тип реквизита — нет. Смена Вид на «Поле переключателя» не меняет тип хранимого значения. Если реквизит остался Строка, выбор работать не будет. Под переключатель нужен Число или перечисление, под флажок — Булево.
  • Заполнили список выбора, но оставили вид «Поле ввода». Тогда вместо радиокнопок пользователь увидит обычный выпадающий список. Радиокнопки появятся только после смены Вид на «Поле переключателя».
  • Значения списка выбора не совпадают с логикой. Если в коде сравнение идёт с 1, а в списке выбора нужный вариант стоит под другим числом, выбор будет молча отрабатывать неверную ветку. При переносе формы между конфигурациями это первый подозреваемый.
  • Один заголовок на всю группу. У переключателя Заголовок поля — это подпись ко всей группе вариантов, а не к отдельной кнопке. Тексты самих вариантов задаются только в представлениях списка выбора.
  • Флажок стоит, а связанное поле осталось активным. Доступность зависимого поля не обновляется сама — нужен обработчик ПриИзменении и повтор той же логики при открытии формы, иначе после перезаписи форма открывается в рассогласованном виде.

Производительность: держите переключение на клиенте

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

  • Обработчик ПриИзменении для показа и скрытия полей пишите на клиенте. Смена Видимость и Доступность — клиентская операция, сервер для неё не нужен.
  • Не вызывайте серверные процедуры на каждый клик, если без этого можно обойтись. Серверный вызов — это сетевой запрос; при частом переключении форма начнёт подтормаживать.
  • Если по переключателю всё же нужно подтянуть данные с сервера (например, пересчитать табличную часть), собирайте все изменения в один вызов, а не делайте несколько подряд.
  • Программное пересоздание элементов (ИзменитьРеквизиты + Элементы.Добавить) — операция дорогая и серверная. Не вызывайте её в обработчике изменения; делайте один раз при создании формы.

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

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

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

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