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