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

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

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

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

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

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

Ниже разобраны оба подхода с примерами кода, ограничениями по типам данных, способами проверки результата и типичными ошибками, из-за которых сравнение с пустой ссылкой даёт неожиданный результат.

Способ 1: ПредопределенноеЗначение на клиенте

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

Синтаксис:

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

ПустойКонтрагент = ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка");

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

Строка параметра строится по шаблону: вид объекта.имя объекта.ПустаяСсылка. Обратите внимание: вид указывается в единственном числе — «Справочник», «Документ», «Перечисление», а не «Справочники».

Для перечислений та же функция возвращает и конкретные значения, и пустую ссылку:

СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20");

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

bsl
&НаКлиенте
Процедура ОчиститьКонтрагента(Команда)
	Объект.Контрагент = ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка");
КонецПроцедуры

Ограничения способа

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

Для типов, не являющихся ссылочными (строка, число, дата), функция не применяется — там используются литералы: пустая строка "", ноль, '00010101' для даты.

Способ 2: вызов сервера через общий модуль

Если по какой-то причине ПредопределенноеЗначение() не подходит (например, имя объекта формируется динамически), пустую ссылку получают через серверную функцию в общем модуле с признаками «Сервер» и «Вызов сервера».

Пример такого модуля:

// Общий модуль РаботаСоСсылками, Сервер = Истина, ВызовСервера = Истина

Функция ПустаяСсылкаСправочника(ИмяСправочника) Экспорт

Возврат Справочники[ИмяСправочника].ПустаяСсылка();

КонецФункции

На клиенте вызов выглядит так:

ПустаяСсылка = РаботаСоСсылками.ПустаяСсылкаСправочника("Номенклатура");

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

Сравнение способов получения пустой ссылки

Сравнение вариантов

ПредопределенноеЗначение

Работает на клиенте без обращения к серверу, быстро, подходит для известных имён объектов. Ограничение: имя должно быть задано строкой-константой, известной конфигурации.

Серверная функция в общем модуле

Подходит для динамического имени объекта и нестандартных сценариев. Ограничение: сетевой вызов, медленнее, требует модуля с признаком «Вызов сервера».

ЗначениеЗаполнено() вместо сравнения

Альтернатива, когда пустая ссылка не нужна явно: функция проверяет заполненность любого значения, включая ссылки, без получения пустого значения.

КритерийПредопределенноеЗначениеСерверный вызов
Работает на клиенте напрямуюДаНет, нужен вызов сервера
Производительность в циклеВысокаяНизкая
Динамическое имя объектаНетДа
Требует настройки модулейНетДа

Проверка значения на пустоту

Получив пустую ссылку, её используют для сравнения. Прямое сравнение работает корректно:

Если Объект.Контрагент = ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка") Тогда

Сообщить("Контрагент не заполнен");

КонецЕсли;

Однако чаще вместо сравнения с пустой ссылкой применяют функцию ЗначениеЗаполнено(). Она универсальна: возвращает Ложь для пустых ссылок любого типа, пустых строк, нулевых дат и значения Неопределено. Это избавляет от необходимости знать тип проверяемого реквизита.

Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда

Сообщить("Контрагент не заполнен");

КонецЕсли;

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

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

Сравнение с пустой ссылкой
Норма

Условие «= ПредопределенноеЗначение(...)» срабатывает для незаполненного реквизита

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

Сравнение всегда даёт Ложь — вероятно, тип ссылки не совпадает с типом реквизита

Тип полученного значения
Норма

ТипЗнч() возвращает «СправочникСсылка.Имя»

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

Возвращается Неопределено — ошибка в строке имени объекта

Поведение в веб-клиенте
Норма

ПредопределенноеЗначение работает без серверных вызовов

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

Ошибка при выполнении — проверьте, что код не обращается к менеджеру Справочники

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

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

Поэтому для составных типов сравнение с конкретной пустой ссылкой ненадёжно. Используйте ЗначениеЗаполнено() или проверку на Неопределено:

Если Объект.Плательщик = Неопределено Тогда

// реквизит не заполнен

КонецЕсли;

Также помните, что Неопределено и пустая ссылка — разные значения. Сравнение Неопределено = ПустаяСсылка возвращает Ложь, что является частым источником ошибок в условиях.

Типичные ошибки
01
Вызов Справочники.Имя.ПустаяСсылка() в клиентском коде — ошибка компиляции или выполнения, менеджеры недоступны на клиенте управляемого приложения
02
Множественное число в строке: «Справочники.Номенклатура...» вместо «Справочник.Номенклатура...» — исключение времени выполнения
03
Сравнение составного реквизита с пустой ссылкой одного вида — условие не срабатывает, так как пустое значение составного типа обычно Неопределено
04
Серверный вызов внутри цикла по строкам табличной части — заметное замедление работы формы
05
Сравнение с Неопределено вместо пустой ссылки (и наоборот) — всегда Ложь, логика проверки не работает

Пошаговый порядок действий

Порядок действий
  1. 1
    Определите вид и имя объекта метаданных, для которого нужна пустая ссылка (например, справочник «Номенклатура»)
  2. 2
    В клиентском коде вызовите ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка")
  3. 3
    Если имя объекта формируется динамически — создайте серверную функцию в общем модуле с признаком «Вызов сервера» и вызовите её из клиента
  4. 4
    Для проверки заполненности реквизита используйте ЗначениеЗаполнено() вместо явного сравнения, если тип может меняться
  5. 5
    Проверьте результат в отладчике: тип значения должен соответствовать ожидаемой ссылке

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

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

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

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

Нет. В управляемом приложении менеджеры объектов (Справочники, Документы и т.п.) доступны только на сервере. В клиентском коде используйте ПредопределенноеЗначение() или серверный вызов. В толстом клиенте обычного приложения менеджеры доступны, но этот режим считается устаревшим.

Чем ПредопределенноеЗначение отличается от обращения к менеджеру?

Функция возвращает значение по строковому имени и работает на клиенте без серверного обращения. Менеджер (Справочники.Имя) — это программный объект, доступный только на сервере, но позволяющий работать с именами динамически через индексацию.

Как получить пустую ссылку, если имя справочника хранится в переменной?

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

Почему сравнение с пустой ссылкой не срабатывает для составного реквизита?

Незаполненный реквизит составного типа обычно содержит Неопределено, а не пустую ссылку конкретного вида. Сравнение Неопределено с пустой ссылкой даёт Ложь. Используйте ЗначениеЗаполнено() — она корректно обрабатывает оба случая.

Работает ли ПредопределенноеЗначение в веб-клиенте?

Да, функция доступна в тонком и веб-клиенте и выполняется локально, без обращения к серверу. Это делает её предпочтительным способом в клиентских модулях форм.

Как проверить, что ссылка именно пустая, а не битая?

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

Итог

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

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