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