«Пустая ссылка» в 1С 8.3: откуда берётся и как найти виновника

· 9 мин

Содержание

Пустая ссылка в 1С — это ссылочный реквизит, в котором не выбрано значение: поле «Контрагент», «Склад» или «Договор» есть, а объекта в нём нет. Сама по себе она не ошибка. Ошибка появляется, когда код или проверка заполнения ждут там реальный объект: документ не проводится, отчёт показывает пустую строку, обработка падает с текстом Значение не является значением объектного типа.

Исправление почти всегда сводится к двум шагам: найти, где реквизит остался незаполненным, и либо заполнить его, либо научить код правильно проверять пустоту. Ниже — как это сделать пользователю в режиме Предприятия и программисту в Конфигураторе.

Что такое пустая ссылка и чем она отличается от похожих значений

У каждого справочника, документа, перечисления и плана видов характеристик есть своё «пустое» значение. Оно типизировано: пустая ссылка на контрагента — это не то же самое, что пустая ссылка на склад. Платформа хранит её как ссылку с нулевым уникальным идентификатором.

Путаница начинается, когда пустую ссылку смешивают с другими «ничего» в 1С:

ЗначениеГде возникаетКак проверить в коде
Пустая ссылкаНезаполненный реквизит одного ссылочного типаСсылка.Пустая() или ЗначениеЗаполнено(Ссылка)
НеопределеноНезаполненный реквизит составного типа, результат ПолучитьОбъект() по пустой ссылкеЗначение = Неопределено
NULLПоле запроса из правой таблицы левого соединения, когда пары нетЕСТЬ NULL, ЕСТЬNULL() в запросе
Битая ссылкаСсылка на объект, которого нет в базеВ форме видно <Объект не найден>, код получает Неопределено при ПолучитьОбъект()

Главное различие: пустая ссылка ни на что не указывает, а битая указывает на удалённый объект. Пустую ссылку заполняют. Битую — восстанавливают или очищают через тестирование базы .

Типичные тексты ошибок

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

  • 🚫 Поле "Контрагент" не заполнено — сработала проверка заполнения при записи или проведении.
  • 💥 Значение не является значением объектного типа (Наименование) — код взял объект по пустой ссылке, получил Неопределено и обратился к его свойству.
  • 🔎 <Объект не найден> (…) в поле формы — это уже битая ссылка, а не пустая.
  • 📄 Пустая строка или группа без названия в отчёте — в данных есть записи с незаполненным измерением.

Как найти пустую ссылку в режиме Предприятия

Пользователю не нужен Конфигуратор, чтобы понять, какой документ «виноват». Начните с текста сообщения: в нём обычно есть имя поля и ссылка на документ.

Шаг 1. Откройте документ из сообщения

  1. Кликните по сообщению в окне служебных сообщений — платформа откроет форму и подсветит поле.
  2. Если поле на закладке, которая сейчас скрыта, пройдите по всем закладкам формы и табличным частям.
  3. Заполните поле и попробуйте провести документ ещё раз.

В табличной части сообщение указывает номер строки. Пустой склад или номенклатура в 37-й строке из 120 глазами не находится — используйте сортировку колонки: пустые значения встанут в начало или в конец списка.

Шаг 2. Отберите все документы с незаполненным реквизитом

Если проблема массовая (например, после загрузки из банка 50 платёжек без договора), откройте список документов и настройте отбор:

  1. В командной панели списка нажмите «Ещё» и откройте настройки списка — окно с закладками «Отбор», «Порядок», «Условное оформление».
  2. На закладке «Отбор» добавьте нужный реквизит.
  3. Вид сравнения — «Не заполнено».

Список покажет все документы, где реквизит пуст. Их можно поправить по одному или групповой обработкой.

Шаг 3. Проверьте, не битая ли это ссылка

Если вместо пустого поля видно <Объект не найден>, значит объект удалили из базы, а ссылки на него остались. Выбор нового значения из справочника лечит один документ, но не всю базу. Для массового случая нужен Конфигуратор — об этом в разделе про обновление и обмен.

Диагностика: выберите симптом

Отладка пустой ссылки в Конфигураторе

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

Остановка по ошибке

  1. Запустите отладку (F5) — откроется Предприятие под отладчиком.
  2. В Конфигураторе включите Отладка → Остановка по ошибке и отметьте нужные ошибки или все.
  3. Повторите действие пользователя. Отладчик остановится на строке, где возникло исключение.

На остановке выделите переменную и нажмите Shift+F9 — откроется окно вычисления выражения. Там видно тип значения: пустая ссылка на справочник, Неопределено или NULL.

Если ошибка воспроизводится только на сервере, проверьте, что в параметрах отладки разрешена отладка серверного кода. Без этого точки останова в серверных модулях не срабатывают.

Типовые места в коде

Чаще всего ошибка сидит в одном из трёх мест:

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

Правильная защита — одна строка проверки перед использованием:

Если Не ЗначениеЗаполнено(Документ.Контрагент) Тогда
    ОбщегоНазначения.СообщитьПользователю("Не заполнен контрагент в документе " + Документ);
    Возврат;
КонецЕсли;

ИННКонтрагента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Документ.Контрагент, "ИНН");

ЗначениеЗаполнено() одинаково понимает пустую ссылку, Неопределено, пустую строку и ноль. Поэтому для проверки «пусто или нет» это самый надёжный вариант. Функции ОбщегоНазначения есть в конфигурациях на Библиотеке стандартных подсистем (БП 3.0, ЗУП 3.1, УТ 11); в своей конфигурации без БСП используйте Сообщить() и прямое обращение к реквизиту.

Как получить пустую ссылку явно

Иногда пустая ссылка нужна намеренно — например, чтобы очистить поле или передать её в запрос:

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

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

Сравнивать ссылку с ПустаяСсылка() надо по тому же типу. Пустая ссылка на склад не равна пустой ссылке на подразделение, и такая проверка тихо вернёт Ложь.

Пустые ссылки в запросах и СКД

В запросах пустая ссылка ведёт себя иначе, чем NULL, и это главный источник «пропавших» строк в отчётах.

Отбор по пустому значению

Пустую ссылку в тексте запроса задают через ЗНАЧЕНИЕ():

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

Такой запрос, выполненный в консоли запросов, сразу даёт список проблемных документов. Это быстрее, чем отбор в каждом журнале.

NULL после соединения

Левое соединение возвращает NULL там, где пары нет. Если потом сравнить это поле с пустой ссылкой, строка не пройдёт ни одно условие:

ВЫБРАТЬ
    Товары.Номенклатура,
    ЕСТЬNULL(Цены.Цена, 0) КАК Цена
ИЗ
    Справочник.Номенклатура КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
        ПО Товары.Ссылка = Цены.Номенклатура

ЕСТЬNULL() превращает отсутствие данных в понятное значение. Без неё сумма по колонке в отчёте получится неверной, а условие Цена > 0 отбросит строки молча.

В СКД для поля составного типа пустое значение — это Неопределено, а не пустая ссылка конкретного типа. Отбор «Не заполнено» в настройках отчёта учитывает оба варианта, а ручное условие в тексте запроса — нет.

Пустая группа в отчёте

Если в отчёте на СКД появилась группировка без названия, это записи с пустым измерением. Что сделать:

  1. Кликните по сумме группы и расшифруйте её до документов.
  2. Заполните реквизит в найденных документах и перепроведите их.
  3. Если документов много — найдите их запросом из предыдущего пункта.

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

Два сценария дают массовые пустые ссылки сразу в сотнях документов.

После обновления конфигурации

В новом релизе в документ может добавиться обязательный реквизит. Новые документы заполняются сами, а старые остаются с пустым полем. При перепроведении закрытого периода такие документы выдают Поле "…" не заполнено.

Обычно реквизит заполняют обработчики обновления, которые работают после установки релиза. Если перепроведение запущено, пока они не завершились, ошибки ожидаемы. В конфигурациях на БСП ход обработки данных видно в разделе Администрирование → Обслуживание, в группе про обновление версии программы (ссылка «Результаты обновления программы»). Дождитесь окончания отложенной обработки и повторите перепроведение.

После синхронизации и загрузки

При обмене объект ищется по уникальному идентификатору или по полям поиска. Если сопоставление не прошло, возможны два исхода:

  • 📭 реквизит остаётся пустым — правило не нашло объект и не создало его;
  • 👻 появляется битая ссылка — в документе записан идентификатор объекта, которого нет в базе-приёмнике.

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

Тестирование и исправление базы

Для битых ссылок у платформы есть штатный инструмент: Администрирование → Тестирование и исправление в Конфигураторе. Для случая ссылок на несуществующие объекты в нём есть выбор действия:

ВариантЧто произойдётКогда выбирать
Создавать объектыПлатформа создаст объекты-заглушки, ссылки станут рабочимиНужно сохранить связь, а потом заполнить заглушки вручную
Очищать ссылкиБитые ссылки станут пустымиСвязь не важна, реквизит заполните заново
Не изменятьТолько отчёт о проблемахСначала оценить масштаб

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

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

Как не допускать пустых ссылок

Профилактика дешевле разбора последствий. Что работает на практике:

  • ✅ Проверка заполнения в метаданных. В свойствах реквизита установите «Проверка заполнения: Выдавать ошибку». Платформа не даст записать документ с пустым полем. В типовой конфигурации делайте это расширением, а не правкой основной конфигурации.
  • ✅ Значения по умолчанию. Основной склад, организация и договор в настройках пользователя закрывают большую часть пустых полей в новых документах.
  • ✅ ЗначениеЗаполнено() в коде. Не сравнивайте ссылки с Неопределено, если реквизит одного типа. Проверка через функцию работает для любых пустых значений.
  • ✅ Запрет непосредственного удаления. Пользователи помечают объекты на удаление, а удаляет их администратор через «Удаление помеченных объектов». Обработка проверит ссылки и не удалит используемое — так битые ссылки не появляются.
  • ✅ Контроль после обмена. Раз в неделю прогоняйте запрос на пустые договоры и контрагентов по документам, пришедшим через синхронизацию.
Еженедельная проверка базы на пустые ссылки
Выполнено: 0 / 5

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

Почему `Ссылка = Неопределено` возвращает Ложь, хотя поле пустое?
У реквизита одного ссылочного типа пустое значение — пустая ссылка, а не Неопределено. Используйте ЗначениеЗаполнено() или метод Пустая().
Можно ли удалить объект, на который есть ссылки?
Непосредственное удаление пропустит проверку, и ссылки станут битыми. Помечайте объект на удаление и удаляйте через штатную обработку — она покажет, где он используется.
Чем «Очищать ссылки» хуже «Создавать объекты» в тестировании?
Очистка необратима: связь документа с удалённым объектом теряется. Заглушку можно переименовать и восстановить по ней историю.
Пустая ссылка занимает место в базе?
Нет. Это служебное значение с нулевым идентификатором, отдельной записи в таблице справочника у неё нет.
Почему в отчёте пустая строка есть, а в списке документов отбор «Не заполнено» ничего не находит?
Пустое значение может быть в табличной части или в движениях регистра, а не в шапке. Расшифруйте сумму отчёта до документа или регистратора.