Пустые ссылки в запросах 1С - распространенная проблема разработчиков. В статье мы разберем, что такое пустая ссылка, зачем она нужна и как ее правильно использовать в запросах 1С для повышения эффективности работы.
Понятие пустой ссылки в 1С
Пустая ссылка в 1С - это ссылка на объект (справочник, документ, перечисление), которая не указывает на конкретную запись в этом объекте. Такая ссылка содержит только информацию о типе объекта, но не имеет уникального идентификатора записи.
Различают следующие виды пустых ссылок:
- Пустая ссылка на справочник
- Пустая ссылка на документ
- Пустая ссылка на перечисление
Пустые ссылки часто возникают в следующих ситуациях:
- При создании нового объекта (документа, элемента справочника) до заполнения реквизитов
- При выполнении соединения таблиц, когда не находится связанная запись
- При обработке данных с незаполненными реквизитами
Например, при выборке документов вместе со связанными контрагентами могут возникать пустые ссылки на контрагентов, если в документе контрагент не задан.
Зачем нужны пустые ссылки в 1С
Использование пустых ссылок в 1С дает следующие преимущества:
- Повышает читаемость и оптимизирует код, избавляя от множества проверок на пустоту
- Позволяет избежать ошибок при обращении к свойствам несуществующих объектов
- Упрощает сравнение ссылок на равенство или неравенство
- Дает возможность заменить отсутствующие данные на значения по умолчанию
Рассмотрим подробнее каждое из этих преимуществ.
Проверки на пустоту ссылки типа Если ЗначениеЗаполнено(Ссылка) Тогда... загромождают код и ухудшают его восприятие. Замена ссылки на пустую позволяет этого избежать.
Обращение к свойствам пустой ссылки не вызовет ошибку, в отличие от обращения к свойствам неопределенной переменной.
Пустые ссылки можно сравнивать на равенство, например, проверить, что реквизит не заполнен:
Если Ссылка = Значение(Справочник.ПустаяСсылка) Тогда
А при отсутствии данных пустую ссылку можно заменить на некое значение по умолчанию, например, нулевую дату или пустую строку.
Особенно актуально использование пустых ссылок в запросах 1С. Рассмотрим основные приемы работы с пустыми ссылками в запросах.
Во-первых, пустая ссылка позволяет фильтровать данные по незаполненному реквизиту. Например, отобрать документы, где не указан контрагент:
ВЫБРАТЬ Из Документ.ПриходТовара КАК Док ГДЕ Док.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
Во-вторых, можно вывести в запросе пустую ссылку, если не найдено связанное значение:
ВЫБРАТЬ Док.Дата, Док.Контрагент ИЗ Документ.ПриходТовара КАК Док ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Конт ПО Док.Контрагент = Конт.Ссылка
В-третьих, пустую ссылку можно подставить вместо NULL при необходимости:
ВЫБРАТЬ Док.Дата, ЕСТЬНУЛЛ(Док.Контрагент, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК Контрагент ИЗ Документ.ПриходТовара КАК Док
Таким образом, пустые ссылки - это мощный и гибкий инструмент оптимизации запросов 1С.
Способы задания пустой ссылки в 1С
Рассмотрим основные способы задания пустой ссылки в 1С:
Программно через ПустаяСсылка()
В программном коде пустую ссылку можно получить вызовом метода ПустаяСсылка() у нужного объекта:
ПустаяСсылка = Справочники.Контрагенты.ПустаяСсылка();
Этот способ удобен при формировании параметров запроса.
В запросе через ЗНАЧЕНИЕ
В тексте запроса пустую ссылку задают через конструкцию ЗНАЧЕНИЕ():
ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
Это наиболее распространенный вариант.
Через параметр запроса
Пустую ссылку можно передать в запрос через параметр:
ГДЕ Ссылка = &ПустаяСсылка
А затем установить этот параметр перед выполнением запроса.
Особенности задания пустой ссылки в разных версиях 1С
Реализация пустых ссылок имеет некоторые отличия в разных версиях платформы 1С:
В версии 8.3
Доступна функция ПустаяСсылка() для всех ссылочных типов.
В запросах используется ЗНАЧЕНИЕ().
В платформе 8.3 пустые ссылки реализованы максимально полно.
В версии 8.2
Нет функции ПустаяСсылка(), можно только через ЗНАЧЕНИЕ().
Не для всех типов есть поддержка пустых ссылок.
В версии 8.1
Отсутствует единый механизм пустых ссылок.
Используются разные приемы для разных объектов.
Рекомендации по выбору способа задания пустой ссылки
При выборе оптимального способа задания пустой ссылки в 1С рекомендуется:
- В программном коде использовать ПустаяСсылка()
- В запросах применять ЗНАЧЕНИЕ() как наиболее универсальный метод
- Для передачи в параметрах запроса генерировать значение через ПустаяСсылка()
- Учитывать особенности версии платформы 1С
Придерживаясь этих рекомендаций, можно гибко и эффективно использовать пустые ссылки в 1С для оптимизации решений.
Проверка на пустую ссылку в запросе 1С
Чтобы проверить ссылку на пустоту в запросе 1С, используются специальные операторы и конструкции языка запросов.
Оператор ЕСТЬНУЛЛ
Оператор ЕСТЬНУЛЛ возвращает истину, если выражение имеет значение NULL:
ЕСТЬНУЛЛ(Ссылка)
Позволяет проверить пустую ссылку в условии запроса.
Конструкция НЕ ЕСТЬНУЛЛ
Логическая противоположность оператору ЕСТЬНУЛЛ:
НЕ ЕСТЬНУЛЛ(Ссылка)
Вернет истину, если ссылка не пустая.
Особенности проверки для разных типов
Для чисел и строк проверка аналогичная:
ЕСТЬНУЛЛ(ЧислоИлиСтрока)
Для дат используется сравнение с НачалоДня(1, 1, 1):
Дата = НачалоДня(1, 1, 1)
Проверка через функцию ЕстьНулл()
Функция ЕстьНулл(Значение, Замена) возвращает Замену для NULL:
ЕстьНулл(Ссылка, ПустаяСсылка())
Удобно для замены NULL в выборке.
Использование пустой ссылки в запросе 1С
Рассмотрим типовые примеры использования пустых ссылок непосредственно в запросах 1С.
В условии запроса
Отбор по пустому значению реквизита:
ГДЕ Ссылка = ЗНАЧЕНИЕ(Справочник.ПустаяСсылка)
В полях выборки
Подстановка пустой ссылки для не найденного значения:
ВЫБРАТЬ ЗНАЧЕНИЕ(Справочник.ПустаяСсылка) КАК ПустаяСсылка
В соединениях и объединениях
Использование в левом соединении, когда нет связанных данных:
ЛЕВОЕ СОЕДИНЕНИЕ Документы КАК Док ПО Док.Контрагент = Контр.Ссылка
Пустые ссылки позволяют гибко управлять выборкой данных в запросах 1С.
Замена NULL на значения по умолчанию
Одно из распространенных применений пустых ссылок в 1С - замена NULL на некое значение по умолчанию.
Пример для числового значения
Для числового поля вместо NULL можно подставить 0:
ВЫБРАТЬ ЕСТЬНУЛЛ(Док.Количество, 0) КАК Количество ИЗ Документ.ПриходТовара КАК Док
Пример для ссылки
Вместо пустой ссылки на контрагента подставить какого-то конкретного:
ВЫБРАТЬ ЕСТЬНУЛЛ(Док.Контрагент, Справочник.Контрагенты.НайтиПоКоду("ОсновнойПоставщик")) КАК Контрагент ИЗ Документ.ПриходТовара КАК Док
Пример для даты
Замена пустой даты на текущую:
ВЫБРАТЬ ЕСТЬНУЛЛ(Док.Дата, ТекущаяДата()) КАК Дата ИЗ Документ.ПриходТовара КАК Док
Подобные приемы позволяют исключить неопределенные NULL из выборки.
Рекомендации по применению пустых ссылок
Используя пустые ссылки в 1C, рекомендуется придерживаться следующих правил:
- Применять для оптимизации кода и улучшения читаемости
- Не злоупотреблять, чтобы не снизить понятность логики
- Добавлять комментарии при неочевидном использовании
- Учитывать особенности реализации в разных версиях ПО 1С
- Тестировать запросы с пустыми ссылками на реальных данных
Следуя этим рекомендациям, вы сможете эффективно применять пустые ссылки для улучшения запросов в своих задачах по 1С.
Типичные ошибки при работе с пустыми ссылками в 1С
Рассмотрим наиболее распространенные ошибки при использовании пустых ссылок в 1С и способы их избежать.
Неверное задание пустой ссылки
Например, указание ЗНАЧЕНИЕ() без ссылки на объект или вызов ПустаяСсылка у нессылочного типа.
Ошибки в проверках на пустые значения
Например, НЕ ЕСТЬНУЛЛ вместо ЕСТЬНУЛЛ или наоборот.
Некорректное использование в запросах
Например, фильтрация по пустой ссылке во внутреннем соединении.
Чтобы избежать таких ошибок, следует внимательно проверять код, покрываются ли запросы тестами и проводить регулярный code review.