К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить пустую ссылку в 1С

Как получить пустую ссылку в 1С: метод ПустаяСсылка(), сравнение с Неопределено, проверка заполненности, работа с составными типами и типичные ошибки разработчиков.

Пустая ссылка в 1С — это значение ссылочного типа, которое указывает на несуществующий объект базы данных. Она нужна, чтобы явно показать: реквизит не заполнен, объект не выбран, переменная ещё не инициализирована конкретным элементом. Путаница между пустой ссылкой, значением Неопределено и NULL из запросов — один из самых частых источников ошибок в коде 1С.

Получить пустую ссылку можно несколькими способами: через метод ПустаяСсылка() менеджера объекта, через значение по умолчанию переменной ссылочного типа, а также через функции проверки и преобразования. Выбор способа зависит от того, известен ли тип заранее, работаете ли вы с составным типом данных и где выполняется код — на сервере, на клиенте или в запросе.

Что такое пустая ссылка и чем она отличается от Неопределено и NULL

Пустая ссылка — это значение конкретного ссылочного типа (справочника, документа, плана счетов и т.д.), у которого внутренний идентификатор состоит из нулей. Она имеет тип, но не указывает ни на один реальный объект. Например, реквизит «Контрагент» нового документа до выбора пользователем содержит именно пустую ссылку типа СправочникСсылка.Контрагенты.

Неопределено — это значение без типа, которое платформа подставляет, когда тип реквизита составной и ни один из типов не инициализирован, либо когда функция не вернула значение. NULL — значение из мира запросов: оно появляется при левом соединении, если в присоединяемой таблице не нашлось строки. Сравнение пустой ссылки с NULL через «=» даст ложь, хотя логически оба значения «пустые».

Это различие критично на практике: условие «Если Ссылка = Неопределено» не сработает для пустой ссылки справочника, а условие «Если РезультатЗапроса.Ссылка = ПустаяСсылка» не отловит NULL из левого соединения. Каждый случай требует своей проверки.

Получение пустой ссылки через метод ПустаяСсылка()

Основной и самый надёжный способ — вызвать метод ПустаяСсылка() у менеджера соответствующего объекта метаданных. Метод доступен на сервере и на клиенте, не обращается к базе данных и работает быстро.

bsl
ПустойКонтрагент = Справочники.Контрагенты.ПустаяСсылка();
ПустойДокумент = Документы.РеализацияТоваровУслуг.ПустаяСсылка();
ПустойСчет = ПланыСчетов.Хозрасчетный.ПустаяСсылка();
ПустойУзел = ПланыОбмена.Полный.ПустаяСсылка();

Метод есть у всех ссылочных типов: справочников, документов, планов видов характеристик, планов счетов, планов видов расчёта, планов обмена, бизнес-процессов и задач. Перечисления имеют похожий метод ПустаяСсылка(), хотя формально перечисление — не ссылочный, а перечислимый тип.

Если тип объекта известен только в виде строки (например, при универсальных обработках), используйте менеджер по имени:

bsl
ИмяТипа = "Номенклатура";
ПустаяСсылка = Справочники[ИмяТипа].ПустаяСсылка();

Получение пустой ссылки динамически по типу или по существующей ссылке

Частая задача: есть переменная со значением неизвестного заранее ссылочного типа, и нужна пустая ссылка того же типа. Прямого универсального метода «ПустаяСсылка() по значению» в платформе нет, поэтому используют обходные приёмы.

Первый приём — через метаданные: определить объект метаданных по ссылке, получить его имя и вид, затем обратиться к соответствующему менеджеру. Второй приём — через метод Новый() не подходит для ссылочных типов, поэтому обычно пишут небольшую функцию-обёртку:

bsl
Функция ПустаяСсылкаПоТипу(ЛюбаяСсылка) Экспорт
    МетаданныеОбъекта = ЛюбаяСсылка.Метаданные();
    ИмяМенеджера = МетаданныеОбъекта.Имя;
    Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ЛюбаяСсылка)) Тогда
        Возврат Справочники[ИмяМенеджера].ПустаяСсылка();
    ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(ЛюбаяСсылка)) Тогда
        Возврат Документы[ИмяМенеджера].ПустаяСсылка();
    КонецЕсли;
    Возврат Неопределено;
КонецФункции

Для описания типов можно использовать метод ПривестиЗначение(): если привести Неопределено к описанию типов с одним ссылочным типом, результатом будет пустая ссылка этого типа. Это удобно, когда тип хранится в ОписаниеТипов, например в реквизитах обработки.

bsl
ОписаниеТипа = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
ПустаяСсылка = ОписаниеТипа.ПривестиЗначение(Неопределено);

Проверка: является ли ссылка пустой

Проверить пустоту ссылки можно тремя способами. Первый — метод Пустая() у самой ссылки: он возвращает Истина, если ссылка пустая. Второй — сравнение с ПустаяСсылка() соответствующего менеджера. Третий — универсальная функция ЗначениеЗаполнено(), которая корректно обрабатывает и Неопределено, и пустые строки, и пустые даты.

bsl
Если Контрагент.Пустая() Тогда
    // ссылка пустая
КонецЕсли;

Если Контрагент = Справочники.Контрагенты.ПустаяСсылка() Тогда
    // тот же результат
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Контрагент) Тогда
    // пустая ссылка, Неопределено или NULL — всё отловлено
КонецЕсли;

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

Маршрут решения

Как выбрать способ проверки

Тип переменной точно известен и ссылочныйИспользуйте метод Пустая() — коротко и читаемо
Реквизит составного типа или тип неизвестенИспользуйте ЗначениеЗаполнено() — безопасно для Неопределено и NULL
Проверка в запросе с левым соединениемИспользуйте ЕСТЬNULL или условие ЕСТЬ NULL, сравнение с пустой ссылкой не отловит NULL
Нужна пустая ссылка конкретного типа для сравненияПолучите её через Менеджер.ПустаяСсылка() и передайте параметром

Пустая ссылка в запросах

В тексте запроса пустую ссылку нельзя написать литералом — её передают параметром. Получить значение можно заранее методом ПустаяСсылка() и передать в Запрос.УстановитьПараметр(). Это стандартный приём для отбора документов с незаполненным реквизитом.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Контрагент = &ПустойКонтрагент";
Запрос.УстановитьПараметр("ПустойКонтрагент", Справочники.Контрагенты.ПустаяСсылка());

Обратите внимание: если реквизит составного типа и в базе хранится пустая ссылка другого типа (например, пустая ссылка справочника «Организации» вместо «Контрагенты»), условие «= &ПустойКонтрагент» её не найдёт. Для составных реквизитов надёжнее проверять через ЗначениеЗаполнено в коде либо перечислять все возможные пустые значения.

В языке запросов также доступна конструкция ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) — она позволяет получить пустую ссылку прямо в тексте запроса без параметра. Это удобно в консоли запросов и динамических списках.

Типичные ошибки и ограничения

Самая распространённая ошибка — сравнение пустой ссылки с Неопределено через «=». Эти значения не равны, условие молча не срабатывает, и логика программы идёт по неверной ветке. Вторая частая проблема — попытка вызвать метод Пустая() у значения Неопределено, что приводит к ошибке выполнения.

Ещё одна ловушка — «битая ссылка»: объект был удалён, а ссылка на него осталась в реквизитах. Такая ссылка не пустая, проверка Пустая() вернёт Ложь, но попытка получить объект даст ошибку или пустые данные. Отличить битую ссылку можно через запрос к базе: если выборка по ссылке не вернула строк, объект не существует.

Типичные ошибки
01
Сравнение с Неопределено вместо проверки Пустая() — условие не сработает для пустой ссылки
02
Вызов Пустая() у значения Неопределено — ошибка выполнения в реквизитах составного типа
03
Сравнение с NULL из запроса через «=» — NULL не равен ничему, включая сам себя
04
Использование строки "" вместо пустой ссылки — приведёт к ошибке преобразования типов или некорректным данным
05
Проверка только Пустая() без учёта битых ссылок — удалённые объекты проходят проверку как заполненные

Практические сценарии использования

Инициализация переменных и возвращаемых значений

Хороший тон — инициализировать переменную ссылочного типа пустой ссылкой, а не Неопределено, если тип известен. Тогда вызывающий код может безопасно вызывать методы ссылки без дополнительных проверок типа.

Очистка реквизита объекта

Чтобы очистить реквизит объекта, присвойте ему пустую ссылку соответствующего типа. Для составного реквизита можно присвоить Неопределено — тогда значение станет «тип не выбран». После изменения не забудьте вызвать Записать(), иначе изменения останутся только в памяти.

Значение по умолчанию в форме

При программном заполнении формы пустую ссылку используют как признак «значение не выбрано»: например, чтобы показать пользователю пустое поле вместо подставленного по умолчанию элемента. В обработчиках выбора проверяйте результат через ЗначениеЗаполнено() перед дальнейшей обработкой.

Как проверить результат

После получения пустой ссылки убедитесь, что значение имеет ожидаемый тип и действительно пустое. Быстрая проверка — вывести ТипЗнч() и результат Пустая() в сообщение или посмотреть значение в отладчике: пустая ссылка отображается с пустым представлением, но с типом.

Контрольные точки

Как проверить результат

Тип значения через ТипЗнч()
Норма

СправочникСсылка.<Имя> или ДокументСсылка.<Имя>

Тревожный признак

Неопределено при ожидаемом ссылочном типе

Метод Пустая()
Норма

Возвращает Истина

Тревожный признак

Ошибка выполнения — значит значение не ссылочного типа

Сравнение с Менеджер.ПустаяСсылка()
Норма

Равенство Истина

Тревожный признак

Ложь при визуально пустом значении — вероятно NULL или другой тип

Представление в отладчике
Норма

Пустая строка представления с указанным типом

Тревожный признак

Значение вида «Объект не найден» — это битая ссылка, а не пустая

Итог

Что важно запомнить

Пустую ссылку получают через Менеджер.ПустаяСсылка() или приведение Неопределено к описанию типов. Проверяют методом Пустая() для известных типов и ЗначениеЗаполнено() для составных. Пустая ссылка, Неопределено и NULL — три разных «пустых» значения, и смешивать их нельзя.

Частые вопросы

Чем пустая ссылка отличается от битой ссылки?

Пустая ссылка никогда не указывала на объект — это начальное значение реквизита. Битая ссылка раньше указывала на существующий объект, который потом удалили. Проверка Пустая() для битой ссылки вернёт Ложь, поэтому её выявляют запросом: если выборка по ссылке пуста — объект отсутствует.

Можно ли получить пустую ссылку, не зная типа заранее?

Да. Если есть значение-образец, определите его метаданные и вызовите ПустаяСсылка() у соответствующего менеджера. Если есть только описание типов, используйте ОписаниеТипов.ПривестиЗначение(Неопределено) — для одиночного ссылочного типа результатом будет пустая ссылка.

Что вернёт сравнение пустой ссылки с Неопределено?

Ложь. Это разные значения: пустая ссылка имеет конкретный ссылочный тип, а Неопределено — безтиповое значение. Для надёжной проверки «пустоты» независимо от вида используйте функцию ЗначениеЗаполнено().

Как передать пустую ссылку в запрос?

Через параметр: Запрос.УстановитьПараметр("Пустой", Справочники.Номенклатура.ПустаяСсылка()). Альтернатива — конструкция ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) прямо в тексте запроса, тогда параметр не нужен.

Почему ЗначениеЗаполнено возвращает Ложь для NULL из запроса?

NULL считается незаполненным значением, поэтому функция корректно возвращает Ложь. Это удобно: одна проверка отлавливает и пустую ссылку, и Неопределено, и NULL. Но если нужно различить именно NULL, используйте сравнение «ЕСТЬ NULL» в запросе или проверку Значение = NULL в коде.

Как очистить реквизит составного типа?

Присвойте реквизиту Неопределено — тогда значение станет «тип не выбран», либо пустую ссылку одного из допустимых типов, если нужно сохранить конкретный тип. После присвоения вызовите метод Записать() у объекта, иначе изменение не сохранится в базе.