При разработке отчетов или обработок на платформе 1С:Предприятие мы часто сталкиваемся с необходимостью фильтрации данных в регистрах сведений, где поле Значение имеет составной тип данных. Одной из частых проблем является попытка наложить условие на это поле, используя операторы, которые не поддерживаются для составных типов или приводят к ошибкам исполнения.
В языке запросов 1С обычные конструкции, такие как ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ или прямое сравнение с логическими значениями, могут вызвать ошибку, если поле имеет составной тип. Это происходит потому, что СУБД требует строгой типизации данных для выполнения эффективного поиска в индексе. Попытка применить логическое условие напрямую к полю, которое может содержать ссылки на справочники, документы или примитивные типы, часто приводит к невозможности трансляции такого запроса в SQL.
Наиболее эффективным и лаконичным способом решения данной задачи является использование оператора ВЫРАЗИТЬ. Этот метод заставляет интерпретатор запросов явно привести данные к нужному типу. Если значение в поле не соответствует заданному типу, результатом будет NULL, что в контексте логического условия ГДЕ интерпретируется как ЛОЖЬ.
Рассмотрим практический пример, как отобрать записи, где значение свойства имеет тип Булево и равно Истина:
ВЫБРАТЬ
ЗначенияСвойствОбъектов.Объект,
ЗначенияСвойствОбъектов.Свойство,
ЗначенияСвойствОбъектов.Значение
ИЗ
РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
ЗначенияСвойствОбъектов.Свойство.Код = "000016330"
И ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Значение КАК Булево)
ВЫРАЗИТЬ берет на себя проверку типа на этапе выполнения. Если в ячейке находится, например, СправочникСсылка.Номенклатура, то приведение к Булево даст NULL, и строка будет корректно исключена из выборки.ВЫРАЗИТЬ лучше оптимизирует план выполнения, так как понимает конкретный тип данных, с которым нужно работать в рамках условия.Хотя решение через ВЫРАЗИТЬ работает стабильно, при работе с большими объемами данных (сотни тысяч и миллионы записей) стоит учитывать следующие нюансы:
Свойство.Код в условии ГДЕ может спровоцировать полное сканирование таблицы. Если есть возможность, используйте для отбора по свойству предопределенную ссылку или параметр, полученный заранее.Свойство), поместите их во временную таблицу, а затем примените фильтр по Значение.Значение = Истина в составных полях может быть непредсказуемым из-за внутренних особенностей хранения данных в различных СУБД (MS SQL, PostgreSQL и др.). Всегда отдавайте предпочтение явным проверкам типа.Применяя данные подходы, вы сможете создавать надежные и быстрые отчеты, которые не будут приводить к избыточной нагрузке на сервер базы данных и позволят избежать ошибок при обработке составных типов данных.