Реквизит типа Булево на форме 1С: флажок, выключатель и три состояния

· 9 мин

Содержание

Чтобы булево поле в 1С выглядело как флажок, достаточно задать реквизиту тип Булево и вывести его на управляемую форму: платформа сама создаст элемент вида «Поле флажка». Дальше в конфигураторе меняют вид флажка, положение заголовка и вешают обработчик ПриИзменении.

Типичная ситуация: бухгалтер просит галочку «Оплата наличными» в документе, чтобы по ней скрывать банковские реквизиты и фильтровать отчёт. Сам флажок делается за минуту. Время уходит на остальное: правильный запрос, пустые значения после соединений, обмен с внешней системой. Если про эти мелочи забыть, галочка работает на форме, но врёт в отчёте и теряется при загрузке из файла.

Что такое булев реквизит и почему он показывается флажком

Тип Булево хранит одно из двух значений: Истина или Ложь. Других состояний у реквизита объекта нет. Значение по умолчанию у нового объекта — Ложь.

Флажок — естественное отображение такого типа: включён или выключен. Поле ввода с выпадающим «Да/Нет» для булева значения тоже возможно, но пользователю неудобно.

Где булевы реквизиты встречаются чаще всего:

  • ✅ признаки документа: «Без НДС», «Отражать в налоговом учёте», «Оплата наличными»;
  • 📦 настройки справочника: «Не используется», «Услуга», «Подотчётное лицо»;
  • ⚙️ константы с функциональными опциями: «Использовать несколько складов»;
  • 📋 колонки табличных частей: «Выбран», «Отгружено».

Если признак может иметь больше двух значений («Да / Нет / Не указано»), подумайте о перечислении. Булево с «третьим состоянием» — компромисс, о нём ниже.

Как создать булев реквизит в конфигураторе

Порядок одинаков для справочника, документа, обработки и регистра сведений.

  1. Откройте конфигурацию: Конфигурация → Открыть конфигурацию. Если это типовая конфигурация на поддержке, лучше делать изменения в расширении (см. ниже).
  2. Найдите объект в дереве метаданных и откройте его двойным щелчком.
  3. Перейдите на вкладку Данные и в группе Реквизиты нажмите «Добавить».
  4. Задайте имя, например ОплатаНаличными. Синоним заполнится автоматически: «Оплата наличными». Именно синоним станет заголовком флажка.
  5. В поле Тип выберите Булево.
  6. При необходимости откройте палитру свойств реквизита (Alt+Enter) и задайте Значение заполнения — например, Истина, если признак почти всегда включён.
  7. Откройте форму объекта на вкладке Формы. В редакторе формы на вкладке Реквизиты раскройте Объект, найдите новый реквизит и перетащите его в дерево элементов.
  8. Платформа создаст элемент вида «Поле флажка». Проверьте это в его свойстве Вид.
  9. Сохраните и выполните Конфигурация → Обновить конфигурацию базы данных (F7).

Обновление структуры базы данных требует монопольного доступа: перед F7 попросите пользователей выйти и сделайте резервную копию.

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

СвойствоЧто даётКогда менять
ВидФлажкаобычный флажок или выключательвыключатель уместен для включения режима, флажок — для признака
ПоложениеЗаголовкаслева, справа, нетв группах настроек заголовок справа читается лучше
Подсказка и ОтображениеПодсказкипояснение рядом с флажкомкогда смысл галочки неочевиден
ТолькоПросмотрфлажок виден, но не меняетсяпризнак выставляется программно
ТриСостояниятретье, «серое» состояниетолько для числовых данных, см. раздел ниже

Заголовок справа от флажка — привычная для пользователя схема «☑ Оплата наличными». Поставьте ПоложениеЗаголовка в значение «Право».

Если конфигурация типовая — расширение

Типовую БП, ЗУП или УТ не стоит снимать с поддержки ради одной галочки. Создайте расширение (Конфигурация → Расширения конфигурации), заимствуйте нужный объект и добавьте реквизит уже в расширении. Затем заимствуйте форму и выведите поле на неё.

После добавления реквизита в расширение база тоже потребует обновления структуры: данные такого реквизита хранятся в отдельной таблице.

Флажок в бизнес-логике: примеры кода

Самый частый сценарий — флажок меняет внешний вид формы. Например, при включённой «Оплате наличными» скрываем банковский счёт.

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

&НаКлиенте
Процедура УстановитьВидимостьБанковскогоСчета()
	Элементы.БанковскийСчет.Видимость = НЕ Объект.ОплатаНаличными;
КонецПроцедуры

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

Обработчик ПриИзменении создаётся из палитры свойств поля: раздел События, кнопка с лупой рядом с ПриИзменении.

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

Флажок в запросе

Булево поле можно ставить в условие напрямую, без сравнения с ИСТИНА:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Док.Ссылка,
|	Док.СуммаДокумента
|ИЗ
|	Документ.ПоступлениеНаличных КАК Док
|ГДЕ
|	Док.ОплатаНаличными
|	И НЕ Док.ПометкаУдаления";

Название документа здесь условное — подставьте свой объект.

Если поле приходит из левого соединения, у строк без пары оно будет NULL. Условие ГДЕ НЕ Т.Флаг такие строки отбросит. Нужно явно:

|ГДЕ
|	НЕ ЕСТЬNULL(Т.Флаг, ЛОЖЬ)

Флажок в отчёте на СКД

В системе компоновки булево поле по умолчанию выводится как «Да» / «Нет». Для отбора выбирайте вид сравнения «Равно» и ставьте галочку в значении.

Если в печатной форме или отчёте нужен другой текст, задайте формат поля: БЛ=Наличные; БИ=Безналичные. Тот же формат работает и в функции Формат():

Текст = Формат(Объект.ОплатаНаличными, "БЛ=Нет; БИ=Да");

Колонка-флажок в табличной части

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

&НаКлиенте
Процедура ОтметитьВсе(Команда)
	Для Каждого Строка Из Объект.Товары Цикл
		Строка.Выбран = Истина;
	КонецЦикла;
КонецПроцедуры

Для снятия всех отметок нужна такая же команда со значением Ложь, для инверсии — Строка.Выбран = НЕ Строка.Выбран. Если строк тысячи, а отмечают их по условию, удобнее выставить признак запросом на сервере и загрузить результат в табличную часть.

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

Типовые ошибки с булевыми полями

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

Ещё две ошибки, которые не видны сразу:

  • 🔀 Составной тип «Булево + что-то ещё». Флажок перестаёт быть флажком, а в запросах приходится проверять тип значения. Если нужен признак — только Булево.
  • 🔁 Двойное отрицание в имени. Реквизит НеИспользоватьСкидку с условием ГДЕ НЕ Т.НеИспользоватьСкидку легко прочитать наоборот. Называйте признак утвердительно: ИспользоватьСкидку.

Булевы поля в больших базах: индексы и запросы

Булево поле само по себе плохо подходит под индекс. У него два значения, и если 90% документов имеют Ложь, индекс по такому полю почти не сужает выборку.

Что работает на практике:

  1. Не индексируйте признак в одиночку, если значения распределены примерно поровну. Свойство Индексировать у реквизита оставьте «Не индексировать».
  2. Индекс полезен при редком значении. Например, флажок «Требует проверки» включён у сотни документов из миллиона, и вы регулярно выбираете именно их. Тогда индекс заметно ускоряет отбор.
  3. Ставьте условие на флажок вместе с более избирательными условиями — период, организация, контрагент. Сначала сужает период, флажок дорезает остаток.
  4. Для часто используемых отборов вынесите признак в регистр сведений с измерениями «Объект» и «Признак» и храните там только записи со значением Истина. Выборка «всех отмеченных» станет чтением маленькой таблицы.

На MS SQL Server булев реквизит хранится в однобайтовом двоичном поле, на PostgreSQL — в поле типа boolean. Места он почти не занимает, поэтому добавлять признаки не страшно. Страшно ставить на каждый из них индекс: каждый индекс замедляет запись.

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

Флажок с тремя состояниями и программное создание поля

У поля флажка есть свойство ТриСостояния. Оно добавляет третье, «серое» состояние, но работает с данными числового типа, а не с Булево. Значения такие:

ЗначениеВид флажкаСмысл
0снятнет
1установленда
2неопределённоене указано / смешанное

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

Порядок настройки:

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

Для хранимых признаков с тремя вариантами перечисление обычно честнее. Число 2 в реквизите документа через год никто не расшифрует без комментария.

Поле флажка, созданное из кода

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	НовыйРеквизит = Новый РеквизитФормы("ПоказыватьАрхив",
		Новый ОписаниеТипов("Булево"), , "Показывать архивные");
	МассивРеквизитов = Новый Массив;
	МассивРеквизитов.Добавить(НовыйРеквизит);
	ИзменитьРеквизиты(МассивРеквизитов);

	Поле = Элементы.Добавить("ПоказыватьАрхив", Тип("ПолеФормы"));
	Поле.Вид = ВидПоляФормы.ПолеФлажка;
	Поле.ПутьКДанным = "ПоказыватьАрхив";
	Поле.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право;
	Поле.УстановитьДействие("ПриИзменении", "ПоказыватьАрхивПриИзменении");

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

&НаКлиенте
Процедура ПоказыватьАрхивПриИзменении(Элемент)
	// здесь, например, меняем отбор динамического списка
КонецПроцедуры

Процедура ПоказыватьАрхивПриИзменении должна существовать в модуле формы, иначе при изменении флажка будет ошибка.

Булевы значения при обмене с внешними системами

Внутри 1С всё просто: Истина / Ложь. Проблемы начинаются на границе — в JSON, XML, CSV и Excel.

ФорматКак 1С пишетКак прочитать в Булево
JSON (ЗаписатьJSON)true / falseПрочитатьJSON сразу даёт Булево
XML / XDTOtrue / false (xs:boolean)XMLЗначение(Тип("Булево"), Строка)
CSV, Excelкак настроитеручное сопоставление строк

XMLСтрока(Истина) возвращает "true", а XMLЗначение(Тип("Булево"), "true") — Истина. Эта пара — самый надёжный способ перевести признак в строку и обратно.

Из Excel и CSV приходит что угодно: «Да», «да», «1», «+», «TRUE». Нормализуйте значение одной функцией:

Функция СтрокаВБулево(Знач Значение) Экспорт
	Значение = НРег(СокрЛП(Значение));
	Возврат Значение = "да"
		ИЛИ Значение = "1"
		ИЛИ Значение = "истина"
		ИЛИ Значение = "true"
		ИЛИ Значение = "+";
КонецФункции

При выгрузке наоборот договоритесь с получателем о формате заранее. Если внешняя система ждёт 0 и 1, преобразуйте явно: ?(Объект.ОплатаНаличными, 1, 0).

В правилах обмена (Конвертация данных, EnterpriseData) булевы реквизиты обычно сопоставляются без настройки. Проверять стоит, если на другой стороне признак хранится числом или строкой.

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

Можно ли сделать булев реквизит обязательным к заполнению?
По смыслу нет: у Булево всегда есть значение, Ложь — тоже значение. Если нужно заставить пользователя сделать выбор, используйте перечисление или проверку в ОбработкаПроверкиЗаполнения.
Как показать булево поле в списке как галочку, а не «Да/Нет»?
В форме списка выведите колонку и проверьте, что её вид — «Поле флажка». В отчётах СКД булево по умолчанию выводится текстом; нужный текст задаётся форматом БЛ и БИ.
Чем «Выключатель» отличается от обычного флажка?
Только внешним видом. Данные те же — Булево. Выключатель выглядит как ползунок и подходит для включения режима или настройки.
Как задать флажку значение по умолчанию «Истина»?
В свойствах реквизита объекта укажите Значение заполнения = Истина. Для реквизита формы присвойте значение в ПриСозданииНаСервере.
Сколько места в базе занимает булев реквизит?
Мало: одно поле на запись, на MS SQL — один байт. Нагрузку создают не сами признаки, а лишние индексы по ним.