Разработка и Конфигурация · 10 мин
Как получить пустую ссылку на клиенте 1С
Разбираем, как получить пустую ссылку на клиенте 1С: ПредопределенноеЗначение, метод ПустаяСсылка, проверка результата, типичные ошибки и примеры кода.
Пустая ссылка в 1С — это значение ссылки соответствующего типа, у которого не задан идентификатор объекта. Она нужна для сравнений («заполнено ли поле»), инициализации реквизитов, сброса значений и построения запросов. На сервере получить её просто: Справочники.Номенклатура.ПустаяСсылка(). На клиенте управляемого приложения этот путь закрыт — менеджеры объектов там недоступны.
Задача решается двумя рабочими способами: через функцию ПредопределенноеЗначение(), которая работает прямо в клиентском коде, и через вызов серверной функции, возвращающей ссылку. Выбор зависит от типа объекта, режима работы (тонкий клиент, веб-клиент, толстый клиент) и требований к производительности.
Ниже разобраны оба подхода с примерами кода, ограничениями по типам данных, способами проверки результата и типичными ошибками, из-за которых сравнение с пустой ссылкой даёт неожиданный результат.
Способ 1: ПредопределенноеЗначение на клиенте
Самый простой и рекомендуемый способ — функция ПредопределенноеЗначение() глобального контекста. Она доступна и на клиенте, и на сервере, и не требует обращения к серверу, что важно для производительности форм.
Синтаксис:
ПустаяНоменклатура = ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка");
ПустойКонтрагент = ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка");
ПустойДокумент = ПредопределенноеЗначение("Документ.РеализацияТоваровУслуг.ПустаяСсылка");
Строка параметра строится по шаблону: вид объекта.имя объекта.ПустаяСсылка. Обратите внимание: вид указывается в единственном числе — «Справочник», «Документ», «Перечисление», а не «Справочники».
Для перечислений та же функция возвращает и конкретные значения, и пустую ссылку:
СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20");
ПустаяСтавка = ПредопределенноеЗначение("Перечисление.СтавкиНДС.ПустаяСсылка");
&НаКлиенте
Процедура ОчиститьКонтрагента(Команда)
Объект.Контрагент = ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка");
КонецПроцедурыОграничения способа
Функция ПредопределенноеЗначение() работает только с именами, известными на этапе компиляции конфигурации — строка должна соответствовать реально существующему объекту метаданных. Если имя справочника указано с ошибкой, будет выдано исключение времени выполнения.
Для типов, не являющихся ссылочными (строка, число, дата), функция не применяется — там используются литералы: пустая строка "", ноль, '00010101' для даты.
Способ 2: вызов сервера через общий модуль
Если по какой-то причине ПредопределенноеЗначение() не подходит (например, имя объекта формируется динамически), пустую ссылку получают через серверную функцию в общем модуле с признаками «Сервер» и «Вызов сервера».
Пример такого модуля:
// Общий модуль РаботаСоСсылками, Сервер = Истина, ВызовСервера = Истина
Функция ПустаяСсылкаСправочника(ИмяСправочника) Экспорт
Возврат Справочники[ИмяСправочника].ПустаяСсылка();
КонецФункции
На клиенте вызов выглядит так:
ПустаяСсылка = РаботаСоСсылками.ПустаяСсылкаСправочника("Номенклатура");
Минус очевиден: каждый вызов — это обращение к серверу. В циклах и при массовой обработке строк табличной части такой подход заметно замедляет форму. Поэтому серверный вызов оправдан для разового получения значения, а для сравнений в клиентском коде лучше кэшировать результат в переменной формы.
Сравнение способов получения пустой ссылки
Сравнение вариантов
Работает на клиенте без обращения к серверу, быстро, подходит для известных имён объектов. Ограничение: имя должно быть задано строкой-константой, известной конфигурации.
Подходит для динамического имени объекта и нестандартных сценариев. Ограничение: сетевой вызов, медленнее, требует модуля с признаком «Вызов сервера».
Альтернатива, когда пустая ссылка не нужна явно: функция проверяет заполненность любого значения, включая ссылки, без получения пустого значения.
| Критерий | ПредопределенноеЗначение | Серверный вызов |
|---|---|---|
| Работает на клиенте напрямую | Да | Нет, нужен вызов сервера |
| Производительность в цикле | Высокая | Низкая |
| Динамическое имя объекта | Нет | Да |
| Требует настройки модулей | Нет | Да |
Проверка значения на пустоту
Получив пустую ссылку, её используют для сравнения. Прямое сравнение работает корректно:
Если Объект.Контрагент = ПредопределенноеЗначение("Справочник.Контрагенты.ПустаяСсылка") Тогда
Сообщить("Контрагент не заполнен");
КонецЕсли;
Однако чаще вместо сравнения с пустой ссылкой применяют функцию ЗначениеЗаполнено(). Она универсальна: возвращает Ложь для пустых ссылок любого типа, пустых строк, нулевых дат и значения Неопределено. Это избавляет от необходимости знать тип проверяемого реквизита.
Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда
Сообщить("Контрагент не заполнен");
КонецЕсли;
Как проверить результат
Условие «= ПредопределенноеЗначение(...)» срабатывает для незаполненного реквизита
Сравнение всегда даёт Ложь — вероятно, тип ссылки не совпадает с типом реквизита
ТипЗнч() возвращает «СправочникСсылка.Имя»
Возвращается Неопределено — ошибка в строке имени объекта
ПредопределенноеЗначение работает без серверных вызовов
Ошибка при выполнении — проверьте, что код не обращается к менеджеру Справочники
Пустая ссылка для составных типов и Неопределено
Если реквизит имеет составной тип (например, «СправочникСсылка.Контрагенты, СправочникСсылка.Организации»), пустая ссылка одного конкретного вида может не совпасть с текущим пустым значением реквизита. Незаполненный составной реквизит часто содержит Неопределено, а не пустую ссылку какого-либо вида.
Поэтому для составных типов сравнение с конкретной пустой ссылкой ненадёжно. Используйте ЗначениеЗаполнено() или проверку на Неопределено:
Если Объект.Плательщик = Неопределено Тогда
// реквизит не заполнен
КонецЕсли;
Также помните, что Неопределено и пустая ссылка — разные значения. Сравнение Неопределено = ПустаяСсылка возвращает Ложь, что является частым источником ошибок в условиях.
Пошаговый порядок действий
- 1Определите вид и имя объекта метаданных, для которого нужна пустая ссылка (например, справочник «Номенклатура»)
- 2В клиентском коде вызовите ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка")
- 3Если имя объекта формируется динамически — создайте серверную функцию в общем модуле с признаком «Вызов сервера» и вызовите её из клиента
- 4Для проверки заполненности реквизита используйте ЗначениеЗаполнено() вместо явного сравнения, если тип может меняться
- 5Проверьте результат в отладчике: тип значения должен соответствовать ожидаемой ссылке
После выполнения шагов откройте отладку и убедитесь, что полученное значение имеет ожидаемый тип: ТипЗнч(Значение) должен вернуть тип вида «СправочникСсылка.Номенклатура». Если возвращается Неопределено — ищите ошибку в строке имени объекта.
В формах, где пустая ссылка используется многократно (например, при обработке каждой строки табличной части), сохраните её в переменную при создании формы и дальше сравнивайте с переменной. Это убирает повторные вызовы и делает код читабельнее.
Частые вопросы
Можно ли на клиенте написать Справочники.Номенклатура.ПустаяСсылка()?
Нет. В управляемом приложении менеджеры объектов (Справочники, Документы и т.п.) доступны только на сервере. В клиентском коде используйте ПредопределенноеЗначение() или серверный вызов. В толстом клиенте обычного приложения менеджеры доступны, но этот режим считается устаревшим.
Чем ПредопределенноеЗначение отличается от обращения к менеджеру?
Функция возвращает значение по строковому имени и работает на клиенте без серверного обращения. Менеджер (Справочники.Имя) — это программный объект, доступный только на сервере, но позволяющий работать с именами динамически через индексацию.
Как получить пустую ссылку, если имя справочника хранится в переменной?
Через серверную функцию: Справочники[ИмяСправочника].ПустаяСсылка(). ПредопределенноеЗначение тоже принимает переменную со строкой, но строка должна точно соответствовать существующему объекту, иначе будет исключение.
Почему сравнение с пустой ссылкой не срабатывает для составного реквизита?
Незаполненный реквизит составного типа обычно содержит Неопределено, а не пустую ссылку конкретного вида. Сравнение Неопределено с пустой ссылкой даёт Ложь. Используйте ЗначениеЗаполнено() — она корректно обрабатывает оба случая.
Работает ли ПредопределенноеЗначение в веб-клиенте?
Да, функция доступна в тонком и веб-клиенте и выполняется локально, без обращения к серверу. Это делает её предпочтительным способом в клиентских модулях форм.
Как проверить, что ссылка именно пустая, а не битая?
Пустая ссылка имеет нулевой уникальный идентификатор и корректно сравнивается с ПустаяСсылка(). Битая ссылка (на удалённый объект) сама по себе не пуста — ЗначениеЗаполнено() для неё вернёт Истина. Обнаружить битую ссылку можно только попыткой получить объект на сервере: если ПолучитьОбъект() вернул Неопределено, объект отсутствует в базе.
Что важно запомнить
На клиенте управляемого приложения пустую ссылку получают через ПредопределенноеЗначение("Вид.Имя.ПустаяСсылка") — быстро и без сервера. Для динамических имён используют серверную функцию. Для проверки заполненности надёжнее всего ЗначениеЗаполнено(), особенно с составными типами, где пустое значение — это Неопределено.