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