Реквизит типа Булево на форме 1С: флажок, выключатель и три состояния
Содержание
Чтобы булево поле в 1С выглядело как флажок, достаточно задать реквизиту тип Булево и вывести его на управляемую форму: платформа сама создаст элемент вида «Поле флажка». Дальше в конфигураторе меняют вид флажка, положение заголовка и вешают обработчик ПриИзменении.
Типичная ситуация: бухгалтер просит галочку «Оплата наличными» в документе, чтобы по ней скрывать банковские реквизиты и фильтровать отчёт. Сам флажок делается за минуту. Время уходит на остальное: правильный запрос, пустые значения после соединений, обмен с внешней системой. Если про эти мелочи забыть, галочка работает на форме, но врёт в отчёте и теряется при загрузке из файла.
Что такое булев реквизит и почему он показывается флажком
Тип Булево хранит одно из двух значений: Истина или Ложь. Других состояний у реквизита объекта нет. Значение по умолчанию у нового объекта — Ложь.
Флажок — естественное отображение такого типа: включён или выключен. Поле ввода с выпадающим «Да/Нет» для булева значения тоже возможно, но пользователю неудобно.
Где булевы реквизиты встречаются чаще всего:
- ✅ признаки документа: «Без НДС», «Отражать в налоговом учёте», «Оплата наличными»;
- 📦 настройки справочника: «Не используется», «Услуга», «Подотчётное лицо»;
- ⚙️ константы с функциональными опциями: «Использовать несколько складов»;
- 📋 колонки табличных частей: «Выбран», «Отгружено».
Если признак может иметь больше двух значений («Да / Нет / Не указано»), подумайте о перечислении. Булево с «третьим состоянием» — компромисс, о нём ниже.
Как создать булев реквизит в конфигураторе
Порядок одинаков для справочника, документа, обработки и регистра сведений.
- Откройте конфигурацию:
Конфигурация → Открыть конфигурацию. Если это типовая конфигурация на поддержке, лучше делать изменения в расширении (см. ниже). - Найдите объект в дереве метаданных и откройте его двойным щелчком.
- Перейдите на вкладку
Данныеи в группеРеквизитынажмите «Добавить». - Задайте имя, например
ОплатаНаличными. Синоним заполнится автоматически: «Оплата наличными». Именно синоним станет заголовком флажка. - В поле
ТипвыберитеБулево. - При необходимости откройте палитру свойств реквизита (
Alt+Enter) и задайтеЗначение заполнения— например,Истина, если признак почти всегда включён. - Откройте форму объекта на вкладке
Формы. В редакторе формы на вкладкеРеквизитыраскройтеОбъект, найдите новый реквизит и перетащите его в дерево элементов. - Платформа создаст элемент вида «Поле флажка». Проверьте это в его свойстве
Вид. - Сохраните и выполните
Конфигурация → Обновить конфигурацию базы данных(F7).
Обновление структуры базы данных требует монопольного доступа: перед F7 попросите пользователей выйти и сделайте резервную копию.
Свойства поля флажка, которые стоит настроить
| Свойство | Что даёт | Когда менять |
|---|---|---|
ВидФлажка | обычный флажок или выключатель | выключатель уместен для включения режима, флажок — для признака |
ПоложениеЗаголовка | слева, справа, нет | в группах настроек заголовок справа читается лучше |
Подсказка и ОтображениеПодсказки | пояснение рядом с флажком | когда смысл галочки неочевиден |
ТолькоПросмотр | флажок виден, но не меняется | признак выставляется программно |
ТриСостояния | третье, «серое» состояние | только для числовых данных, см. раздел ниже |
Заголовок справа от флажка — привычная для пользователя схема «☑ Оплата наличными». Поставьте ПоложениеЗаголовка в значение «Право».
Если конфигурация типовая — расширение
Типовую БП, ЗУП или УТ не стоит снимать с поддержки ради одной галочки. Создайте расширение (Конфигурация → Расширения конфигурации), заимствуйте нужный объект и добавьте реквизит уже в расширении. Затем заимствуйте форму и выведите поле на неё.
После добавления реквизита в расширение база тоже потребует обновления структуры: данные такого реквизита хранятся в отдельной таблице.
Флажок в бизнес-логике: примеры кода
Самый частый сценарий — флажок меняет внешний вид формы. Например, при включённой «Оплате наличными» скрываем банковский счёт.
&НаКлиенте
Процедура ОплатаНаличнымиПриИзменении(Элемент)
УстановитьВидимостьБанковскогоСчета();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьВидимостьБанковскогоСчета()
Элементы.БанковскийСчет.Видимость = НЕ Объект.ОплатаНаличными;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.БанковскийСчет.Видимость = НЕ Объект.ОплатаНаличными;
КонецПроцедуры
Обработчик ПриИзменении создаётся из палитры свойств поля: раздел События, кнопка с лупой рядом с ПриИзменении.
Одной обработки ПриИзменении мало. При открытии уже записанного документа событие не срабатывает, поэтому видимость задают ещё и в ПриСозданииНаСервере (или ПриЧтенииНаСервере). Иначе форма откроется с неверным набором полей.
Флажок в запросе
Булево поле можно ставить в условие напрямую, без сравнения с ИСТИНА:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка,
| Док.СуммаДокумента
|ИЗ
| Документ.ПоступлениеНаличных КАК Док
|ГДЕ
| Док.ОплатаНаличными
| И НЕ Док.ПометкаУдаления";
Название документа здесь условное — подставьте свой объект.
Если поле приходит из левого соединения, у строк без пары оно будет NULL. Условие ГДЕ НЕ Т.Флаг такие строки отбросит. Нужно явно:
|ГДЕ
| НЕ ЕСТЬNULL(Т.Флаг, ЛОЖЬ)
Флажок в отчёте на СКД
В системе компоновки булево поле по умолчанию выводится как «Да» / «Нет». Для отбора выбирайте вид сравнения «Равно» и ставьте галочку в значении.
Если в печатной форме или отчёте нужен другой текст, задайте формат поля: БЛ=Наличные; БИ=Безналичные. Тот же формат работает и в функции Формат():
Текст = Формат(Объект.ОплатаНаличными, "БЛ=Нет; БИ=Да");
Колонка-флажок в табличной части
Для отметки строк добавьте в табличную часть реквизит Выбран типа Булево и выведите колонку на форму. Для массовой отметки хватает простой команды:
&НаКлиенте
Процедура ОтметитьВсе(Команда)
Для Каждого Строка Из Объект.Товары Цикл
Строка.Выбран = Истина;
КонецЦикла;
КонецПроцедуры
Для снятия всех отметок нужна такая же команда со значением Ложь, для инверсии — Строка.Выбран = НЕ Строка.Выбран. Если строк тысячи, а отмечают их по условию, удобнее выставить признак запросом на сервере и загрузить результат в табличную часть.
Если признак нужен только в обработке и не должен храниться в базе, делайте его реквизитом формы или реквизитом табличной части обработки — так ничего лишнего не запишется в документ.
Типовые ошибки с булевыми полями
Ещё две ошибки, которые не видны сразу:
- 🔀 Составной тип «Булево + что-то ещё». Флажок перестаёт быть флажком, а в запросах приходится проверять тип значения. Если нужен признак — только
Булево. - 🔁 Двойное отрицание в имени. Реквизит
НеИспользоватьСкидкус условиемГДЕ НЕ Т.НеИспользоватьСкидкулегко прочитать наоборот. Называйте признак утвердительно:ИспользоватьСкидку.
Булевы поля в больших базах: индексы и запросы
Булево поле само по себе плохо подходит под индекс. У него два значения, и если 90% документов имеют Ложь, индекс по такому полю почти не сужает выборку.
Что работает на практике:
- Не индексируйте признак в одиночку, если значения распределены примерно поровну. Свойство
Индексироватьу реквизита оставьте «Не индексировать». - Индекс полезен при редком значении. Например, флажок «Требует проверки» включён у сотни документов из миллиона, и вы регулярно выбираете именно их. Тогда индекс заметно ускоряет отбор.
- Ставьте условие на флажок вместе с более избирательными условиями — период, организация, контрагент. Сначала сужает период, флажок дорезает остаток.
- Для часто используемых отборов вынесите признак в регистр сведений с измерениями «Объект» и «Признак» и храните там только записи со значением
Истина. Выборка «всех отмеченных» станет чтением маленькой таблицы.
На MS SQL Server булев реквизит хранится в однобайтовом двоичном поле, на PostgreSQL — в поле типа boolean. Места он почти не занимает, поэтому добавлять признаки не страшно. Страшно ставить на каждый из них индекс: каждый индекс замедляет запись.
Для массового изменения признака у тысяч объектов пишите обработку с выборкой по запросу и записью порциями в транзакциях. Записывать объекты по одному из открытых форм — долго и рискованно.
Флажок с тремя состояниями и программное создание поля
У поля флажка есть свойство ТриСостояния. Оно добавляет третье, «серое» состояние, но работает с данными числового типа, а не с Булево. Значения такие:
| Значение | Вид флажка | Смысл |
|---|---|---|
0 | снят | нет |
1 | установлен | да |
2 | неопределённое | не указано / смешанное |
Типичный случай — флажок «Выбрать все» над списком, где отмечена только часть строк. Тогда в «шапке» показывают 2.
Порядок настройки:
- Создайте реквизит формы (или объекта) типа
Число, длина 1, точность 0. - Выведите его на форму и в свойстве
Видэлемента выберите «Поле флажка». - Включите свойство
ТриСостояния.
Для хранимых признаков с тремя вариантами перечисление обычно честнее. Число 2 в реквизите документа через год никто не расшифрует без комментария.
Поле флажка, созданное из кода
Иногда флажок нужно добавить на форму программно — например, в расширении, когда трогать типовую форму в редакторе не хочется.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
НовыйРеквизит = Новый РеквизитФормы("ПоказыватьАрхив",
Новый ОписаниеТипов("Булево"), , "Показывать архивные");
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(НовыйРеквизит);
ИзменитьРеквизиты(МассивРеквизитов);
Поле = Элементы.Добавить("ПоказыватьАрхив", Тип("ПолеФормы"));
Поле.Вид = ВидПоляФормы.ПолеФлажка;
Поле.ПутьКДанным = "ПоказыватьАрхив";
Поле.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право;
Поле.УстановитьДействие("ПриИзменении", "ПоказыватьАрхивПриИзменении");
КонецПроцедуры
&НаКлиенте
Процедура ПоказыватьАрхивПриИзменении(Элемент)
// здесь, например, меняем отбор динамического списка
КонецПроцедуры
Процедура ПоказыватьАрхивПриИзменении должна существовать в модуле формы, иначе при изменении флажка будет ошибка.
Булевы значения при обмене с внешними системами
Внутри 1С всё просто: Истина / Ложь. Проблемы начинаются на границе — в JSON, XML, CSV и Excel.
| Формат | Как 1С пишет | Как прочитать в Булево |
|---|---|---|
JSON (ЗаписатьJSON) | true / false | ПрочитатьJSON сразу даёт Булево |
| XML / XDTO | true / false (xs:boolean) | XMLЗначение(Тип("Булево"), Строка) |
| CSV, Excel | как настроите | ручное сопоставление строк |
XMLСтрока(Истина) возвращает "true", а XMLЗначение(Тип("Булево"), "true") — Истина. Эта пара — самый надёжный способ перевести признак в строку и обратно.
Из Excel и CSV приходит что угодно: «Да», «да», «1», «+», «TRUE». Нормализуйте значение одной функцией:
Функция СтрокаВБулево(Знач Значение) Экспорт
Значение = НРег(СокрЛП(Значение));
Возврат Значение = "да"
ИЛИ Значение = "1"
ИЛИ Значение = "истина"
ИЛИ Значение = "true"
ИЛИ Значение = "+";
КонецФункции
При выгрузке наоборот договоритесь с получателем о формате заранее. Если внешняя система ждёт 0 и 1, преобразуйте явно: ?(Объект.ОплатаНаличными, 1, 0).
В правилах обмена (Конвертация данных, EnterpriseData) булевы реквизиты обычно сопоставляются без настройки. Проверять стоит, если на другой стороне признак хранится числом или строкой.
Частые вопросы
Можно ли сделать булев реквизит обязательным к заполнению?
Ложь — тоже значение. Если нужно заставить пользователя сделать выбор, используйте перечисление или проверку в ОбработкаПроверкиЗаполнения.Как показать булево поле в списке как галочку, а не «Да/Нет»?
Чем «Выключатель» отличается от обычного флажка?
Как задать флажку значение по умолчанию «Истина»?
Значение заполнения = Истина. Для реквизита формы присвойте значение в ПриСозданииНаСервере.