Давайте вместе разберемся в этом вопросе, который часто вызывает путаницу среди разработчиков 1С. Мы проанализируем, почему в разных версиях платформы вы могли наблюдать различные результаты при обращении к реквизитам пустых ссылок в запросах, и как правильно обрабатывать такие ситуации.
Прежде всего, выясним основную причину наблюдаемого поведения. В системе 1С:Предприятие значение NULL и пустая строка "" — это принципиально разные понятия. NULL означает полное отсутствие значения, в то время как пустая строка — это конкретное значение строкового типа, не содержащее символов.
Рассмотрим подробнее, как это относится к нашему случаю с реквизитом Менеджер.Наименование.
Мы должны понимать, что изначально и всегда язык запросов 1С работает следующим образом: если родительское значение является пустой ссылкой, то обращение через точку к любому его реквизиту должно возвращать NULL. Это фундаментальное правило.
Проанализируем пример запроса:
ВЫБРАТЬ ПЕРВЫЕ 100
ЗаказПоставщику.Ссылка КАК Ссылка,
ЗаказПоставщику.Менеджер КАК Менеджер,
ЗаказПоставщику.Менеджер.Наименование КАК МенеджерНаименование,
ТИПЗНАЧЕНИЯ(ЗаказПоставщику.Менеджер) как т1,
ТИПЗНАЧЕНИЯ(ЗаказПоставщику.Менеджер.Наименование) как т2
ИЗ
Документ.ЗаказПоставщику КАК ЗаказПоставщику
В этом запросе, если реквизит ЗаказПоставщику.Менеджер является пустой ссылкой, то ЗаказПоставщику.Менеджер.Наименование должен вернуть NULL. Это подтверждается тестированием на различных версиях платформы, включая 8.3.24.1761 и 8.3.25.1546.
Разберем ситуацию с NULL и пустой ссылкой:
NULL — это типообразующее значение, которое означает отсутствие значения в выборке из базы данных. Оно часто возникает при левом/правом соединении, когда не находится соответствующей записи, или, как в нашем случае, при обращении к реквизитам для пустой ссылки.СправочникСсылка.Пользователи) — это ссылка, которая указывает на тип данных, но не имеет уникального идентификатора конкретного значения.Таким образом, когда ЗаказПоставщику.Менеджер — это пустая ссылка, попытка получить .Наименование от нее логически приводит к отсутствию значения, то есть к NULL.
Выясним причину наблюдаемого расхождения:
Многочисленные тесты и подтверждения других разработчиков показывают, что поведение, при котором Документ.Менеджер.Наименование возвращает NULL для пустой ссылки Менеджер, является стандартным и корректным для большинства версий платформы 1С:Предприятие. Вероятнее всего, наблюдение о получении "" в 8.3.26 было ошибочным или связано с особенностями конкретной конфигурации, данных или условий выполнения запроса. Платформы 8.3.26 и 8.3.27 не содержат явных изменений в документации, которые бы меняли это базовое поведение языка запросов.
Для того чтобы избежать нежелательных NULL-значений в результате запроса и привести их к более удобному для дальнейшей обработки виду (например, к пустой строке), мы используем специальную функцию языка запросов 1С.
Используем функцию ЕСТЬNULL():
Самым правильным и рекомендуемым способом обработки NULL-значений является функция ЕСТЬNULL(). Она позволяет заменить NULL на любое другое указанное вами значение. Рассмотрим пример:
ВЫБРАТЬ
ЗаказПоставщику.Ссылка КАК Заказ,
ЕСТЬNULL(ЗаказПоставщику.Менеджер.Наименование, "") КАК Наименование
ИЗ Документ.ЗаказПоставщику КАК ЗаказПоставщику
В этом запросе, если ЗаказПоставщику.Менеджер.Наименование вернет NULL (что произойдет, если Менеджер — пустая ссылка), то вместо NULL мы получим пустую строку "". Это позволяет унифицировать результаты и упростить дальнейшую обработку данных.
Важные нюансы при использовании ЕСТЬNULL():
Мы должны помнить о приведении типов. Тип заменяющего выражения может быть приведен к типу проверяемого выражения. Например, если проверяемое выражение имеет тип Строка(5), а заменяющее Строка(10), то результат будет обрезан до 5 символов. Всегда учитывайте типы данных для корректной работы.
Почему ЕСТЬNULL() предпочтительнее ВЫБОР:
Хотя теоретически можно было бы использовать оператор ВЫБОР для проверки на NULL, функция ЕСТЬNULL() специально предназначена для этой цели и является более лаконичной и производительной для данной задачи. Мы рекомендуем использовать именно ее.
В заключение, мы подтверждаем, что поведение запроса, возвращающего NULL при обращении к реквизиту пустой ссылки, является стандартным и корректным для платформы 1С:Предприятие. Если вы наблюдали иное поведение в какой-либо версии, это, скорее всего, было исключение или ошибочное наблюдение. Всегда используйте ЕСТЬNULL() для надежной обработки потенциальных NULL-значений в ваших запросах.