Почему запрос 1С возвращает Документ.Менеджер.Наименование = NULL в платформе 8.3.27, если в 8.3.26 он возвращал = ""?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← К списку

Давайте вместе разберемся в этом вопросе, который часто вызывает путаницу среди разработчиков 1С. Мы проанализируем, почему в разных версиях платформы вы могли наблюдать различные результаты при обращении к реквизитам пустых ссылок в запросах, и как правильно обрабатывать такие ситуации.

Прежде всего, выясним основную причину наблюдаемого поведения. В системе 1С:Предприятие значение NULL и пустая строка "" — это принципиально разные понятия. NULL означает полное отсутствие значения, в то время как пустая строка — это конкретное значение строкового типа, не содержащее символов.

Рассмотрим подробнее, как это относится к нашему случаю с реквизитом Менеджер.Наименование.

Корректное поведение языка запросов 1С при обращении к реквизитам пустых ссылок

Мы должны понимать, что изначально и всегда язык запросов 1С работает следующим образом: если родительское значение является пустой ссылкой, то обращение через точку к любому его реквизиту должно возвращать NULL. Это фундаментальное правило.

  1. Проанализируем пример запроса:

    
    ВЫБРАТЬ ПЕРВЫЕ 100 
        ЗаказПоставщику.Ссылка КАК Ссылка,
        ЗаказПоставщику.Менеджер КАК Менеджер,
        ЗаказПоставщику.Менеджер.Наименование КАК МенеджерНаименование,
        ТИПЗНАЧЕНИЯ(ЗаказПоставщику.Менеджер) как т1,
        ТИПЗНАЧЕНИЯ(ЗаказПоставщику.Менеджер.Наименование) как т2
    ИЗ
        Документ.ЗаказПоставщику КАК ЗаказПоставщику
    

    В этом запросе, если реквизит ЗаказПоставщику.Менеджер является пустой ссылкой, то ЗаказПоставщику.Менеджер.Наименование должен вернуть NULL. Это подтверждается тестированием на различных версиях платформы, включая 8.3.24.1761 и 8.3.25.1546.

  2. Разберем ситуацию с NULL и пустой ссылкой:

    • NULL — это типообразующее значение, которое означает отсутствие значения в выборке из базы данных. Оно часто возникает при левом/правом соединении, когда не находится соответствующей записи, или, как в нашем случае, при обращении к реквизитам для пустой ссылки.
    • Пустая ссылка для ссылочных типов (например, для объекта СправочникСсылка.Пользователи) — это ссылка, которая указывает на тип данных, но не имеет уникального идентификатора конкретного значения.

    Таким образом, когда ЗаказПоставщику.Менеджер — это пустая ссылка, попытка получить .Наименование от нее логически приводит к отсутствию значения, то есть к NULL.

  3. Выясним причину наблюдаемого расхождения:

    Многочисленные тесты и подтверждения других разработчиков показывают, что поведение, при котором Документ.Менеджер.Наименование возвращает NULL для пустой ссылки Менеджер, является стандартным и корректным для большинства версий платформы 1С:Предприятие. Вероятнее всего, наблюдение о получении "" в 8.3.26 было ошибочным или связано с особенностями конкретной конфигурации, данных или условий выполнения запроса. Платформы 8.3.26 и 8.3.27 не содержат явных изменений в документации, которые бы меняли это базовое поведение языка запросов.

Как правильно обрабатывать NULL-значения в запросах

Для того чтобы избежать нежелательных NULL-значений в результате запроса и привести их к более удобному для дальнейшей обработки виду (например, к пустой строке), мы используем специальную функцию языка запросов 1С.

  1. Используем функцию ЕСТЬNULL():

    Самым правильным и рекомендуемым способом обработки NULL-значений является функция ЕСТЬNULL(). Она позволяет заменить NULL на любое другое указанное вами значение. Рассмотрим пример:

    
    ВЫБРАТЬ
        ЗаказПоставщику.Ссылка КАК Заказ,                        
        ЕСТЬNULL(ЗаказПоставщику.Менеджер.Наименование, "") КАК Наименование
    ИЗ Документ.ЗаказПоставщику КАК ЗаказПоставщику
    

    В этом запросе, если ЗаказПоставщику.Менеджер.Наименование вернет NULL (что произойдет, если Менеджер — пустая ссылка), то вместо NULL мы получим пустую строку "". Это позволяет унифицировать результаты и упростить дальнейшую обработку данных.

  2. Важные нюансы при использовании ЕСТЬNULL():

    Мы должны помнить о приведении типов. Тип заменяющего выражения может быть приведен к типу проверяемого выражения. Например, если проверяемое выражение имеет тип Строка(5), а заменяющее Строка(10), то результат будет обрезан до 5 символов. Всегда учитывайте типы данных для корректной работы.

  3. Почему ЕСТЬNULL() предпочтительнее ВЫБОР:

    Хотя теоретически можно было бы использовать оператор ВЫБОР для проверки на NULL, функция ЕСТЬNULL() специально предназначена для этой цели и является более лаконичной и производительной для данной задачи. Мы рекомендуем использовать именно ее.

В заключение, мы подтверждаем, что поведение запроса, возвращающего NULL при обращении к реквизиту пустой ссылки, является стандартным и корректным для платформы 1С:Предприятие. Если вы наблюдали иное поведение в какой-либо версии, это, скорее всего, было исключение или ошибочное наблюдение. Всегда используйте ЕСТЬNULL() для надежной обработки потенциальных NULL-значений в ваших запросах.

← К списку