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