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