«Пустая ссылка» в 1С 8.3: откуда берётся и как найти виновника
Содержание
Пустая ссылка в 1С — это ссылочный реквизит, в котором не выбрано значение: поле «Контрагент», «Склад» или «Договор» есть, а объекта в нём нет. Сама по себе она не ошибка. Ошибка появляется, когда код или проверка заполнения ждут там реальный объект: документ не проводится, отчёт показывает пустую строку, обработка падает с текстом Значение не является значением объектного типа.
Исправление почти всегда сводится к двум шагам: найти, где реквизит остался незаполненным, и либо заполнить его, либо научить код правильно проверять пустоту. Ниже — как это сделать пользователю в режиме Предприятия и программисту в Конфигураторе.
Что такое пустая ссылка и чем она отличается от похожих значений
У каждого справочника, документа, перечисления и плана видов характеристик есть своё «пустое» значение. Оно типизировано: пустая ссылка на контрагента — это не то же самое, что пустая ссылка на склад. Платформа хранит её как ссылку с нулевым уникальным идентификатором.
Путаница начинается, когда пустую ссылку смешивают с другими «ничего» в 1С:
| Значение | Где возникает | Как проверить в коде |
|---|---|---|
| Пустая ссылка | Незаполненный реквизит одного ссылочного типа | Ссылка.Пустая() или ЗначениеЗаполнено(Ссылка) |
Неопределено | Незаполненный реквизит составного типа, результат ПолучитьОбъект() по пустой ссылке | Значение = Неопределено |
NULL | Поле запроса из правой таблицы левого соединения, когда пары нет | ЕСТЬ NULL, ЕСТЬNULL() в запросе |
| Битая ссылка | Ссылка на объект, которого нет в базе | В форме видно <Объект не найден>, код получает Неопределено при ПолучитьОбъект() |
Главное различие: пустая ссылка ни на что не указывает, а битая указывает на удалённый объект. Пустую ссылку заполняют. Битую — восстанавливают или очищают через тестирование базы .
Типичные тексты ошибок
Пользователь редко видит слова «пустая ссылка» напрямую. Обычно она прячется за такими сообщениями:
- 🚫
Поле "Контрагент" не заполнено— сработала проверка заполнения при записи или проведении. - 💥
Значение не является значением объектного типа (Наименование)— код взял объект по пустой ссылке, получилНеопределенои обратился к его свойству. - 🔎
<Объект не найден> (…)в поле формы — это уже битая ссылка, а не пустая. - 📄 Пустая строка или группа без названия в отчёте — в данных есть записи с незаполненным измерением.
Как найти пустую ссылку в режиме Предприятия
Пользователю не нужен Конфигуратор, чтобы понять, какой документ «виноват». Начните с текста сообщения: в нём обычно есть имя поля и ссылка на документ.
Шаг 1. Откройте документ из сообщения
- Кликните по сообщению в окне служебных сообщений — платформа откроет форму и подсветит поле.
- Если поле на закладке, которая сейчас скрыта, пройдите по всем закладкам формы и табличным частям.
- Заполните поле и попробуйте провести документ ещё раз.
В табличной части сообщение указывает номер строки. Пустой склад или номенклатура в 37-й строке из 120 глазами не находится — используйте сортировку колонки: пустые значения встанут в начало или в конец списка.
Шаг 2. Отберите все документы с незаполненным реквизитом
Если проблема массовая (например, после загрузки из банка 50 платёжек без договора), откройте список документов и настройте отбор:
- В командной панели списка нажмите «Ещё» и откройте настройки списка — окно с закладками «Отбор», «Порядок», «Условное оформление».
- На закладке «Отбор» добавьте нужный реквизит.
- Вид сравнения — «Не заполнено».
Список покажет все документы, где реквизит пуст. Их можно поправить по одному или групповой обработкой.
Шаг 3. Проверьте, не битая ли это ссылка
Если вместо пустого поля видно <Объект не найден>, значит объект удалили из базы, а ссылки на него остались. Выбор нового значения из справочника лечит один документ, но не всю базу. Для массового случая нужен Конфигуратор — об этом в разделе про обновление и обмен.
Отладка пустой ссылки в Конфигураторе
Когда ошибка падает из кода, пользовательские методы не помогут. Нужно поймать момент, где пустое значение попадает в вычисления.
Остановка по ошибке
- Запустите отладку (
F5) — откроется Предприятие под отладчиком. - В Конфигураторе включите
Отладка → Остановка по ошибкеи отметьте нужные ошибки или все. - Повторите действие пользователя. Отладчик остановится на строке, где возникло исключение.
На остановке выделите переменную и нажмите Shift+F9 — откроется окно вычисления выражения. Там видно тип значения: пустая ссылка на справочник, Неопределено или NULL.
Если ошибка воспроизводится только на сервере, проверьте, что в параметрах отладки разрешена отладка серверного кода. Без этого точки останова в серверных модулях не срабатывают.
Типовые места в коде
Чаще всего ошибка сидит в одном из трёх мест:
- 🧩 обращение к реквизиту через объект:
Ссылка.ПолучитьОбъект().Наименование— по пустой ссылкеПолучитьОбъект()вернётНеопределено; - 🧩 сравнение с
Неопределеновместо проверки заполненности для реквизита одного ссылочного типа; - 🧩 передача пустого значения в параметр запроса, после чего запрос возвращает ноль строк, а код ждёт хотя бы одну.
Правильная защита — одна строка проверки перед использованием:
Если Не ЗначениеЗаполнено(Документ.Контрагент) Тогда
ОбщегоНазначения.СообщитьПользователю("Не заполнен контрагент в документе " + Документ);
Возврат;
КонецЕсли;
ИННКонтрагента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Документ.Контрагент, "ИНН");
ЗначениеЗаполнено() одинаково понимает пустую ссылку, Неопределено, пустую строку и ноль. Поэтому для проверки «пусто или нет» это самый надёжный вариант. Функции ОбщегоНазначения есть в конфигурациях на Библиотеке стандартных подсистем (БП 3.0, ЗУП 3.1, УТ 11); в своей конфигурации без БСП используйте Сообщить() и прямое обращение к реквизиту.
Как получить пустую ссылку явно
Иногда пустая ссылка нужна намеренно — например, чтобы очистить поле или передать её в запрос:
ПустойКонтрагент = Справочники.Контрагенты.ПустаяСсылка();
Если Документ.Склад = Справочники.Склады.ПустаяСсылка() Тогда
// склад не выбран
КонецЕсли;
Сравнивать ссылку с ПустаяСсылка() надо по тому же типу. Пустая ссылка на склад не равна пустой ссылке на подразделение, и такая проверка тихо вернёт Ложь.
Пустые ссылки в запросах и СКД
В запросах пустая ссылка ведёт себя иначе, чем NULL, и это главный источник «пропавших» строк в отчётах.
Отбор по пустому значению
Пустую ссылку в тексте запроса задают через ЗНАЧЕНИЕ():
ВЫБРАТЬ
Реализация.Ссылка,
Реализация.Номер,
Реализация.Дата
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Договор = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)
И Реализация.Проведен
Такой запрос, выполненный в консоли запросов, сразу даёт список проблемных документов. Это быстрее, чем отбор в каждом журнале.
NULL после соединения
Левое соединение возвращает NULL там, где пары нет. Если потом сравнить это поле с пустой ссылкой, строка не пройдёт ни одно условие:
ВЫБРАТЬ
Товары.Номенклатура,
ЕСТЬNULL(Цены.Цена, 0) КАК Цена
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
ПО Товары.Ссылка = Цены.Номенклатура
ЕСТЬNULL() превращает отсутствие данных в понятное значение. Без неё сумма по колонке в отчёте получится неверной, а условие Цена > 0 отбросит строки молча.
В СКД для поля составного типа пустое значение — это Неопределено, а не пустая ссылка конкретного типа. Отбор «Не заполнено» в настройках отчёта учитывает оба варианта, а ручное условие в тексте запроса — нет.
Пустая группа в отчёте
Если в отчёте на СКД появилась группировка без названия, это записи с пустым измерением. Что сделать:
- Кликните по сумме группы и расшифруйте её до документов.
- Заполните реквизит в найденных документах и перепроведите их.
- Если документов много — найдите их запросом из предыдущего пункта.
Пустые и битые ссылки после обновления и обмена
Два сценария дают массовые пустые ссылки сразу в сотнях документов.
После обновления конфигурации
В новом релизе в документ может добавиться обязательный реквизит. Новые документы заполняются сами, а старые остаются с пустым полем. При перепроведении закрытого периода такие документы выдают Поле "…" не заполнено.
Обычно реквизит заполняют обработчики обновления, которые работают после установки релиза. Если перепроведение запущено, пока они не завершились, ошибки ожидаемы. В конфигурациях на БСП ход обработки данных видно в разделе Администрирование → Обслуживание, в группе про обновление версии программы (ссылка «Результаты обновления программы»). Дождитесь окончания отложенной обработки и повторите перепроведение.
После синхронизации и загрузки
При обмене объект ищется по уникальному идентификатору или по полям поиска. Если сопоставление не прошло, возможны два исхода:
- 📭 реквизит остаётся пустым — правило не нашло объект и не создало его;
- 👻 появляется битая ссылка — в документе записан идентификатор объекта, которого нет в базе-приёмнике.
Сначала исправьте источник: заполните справочник в базе-отправителе или настройте сопоставление объектов в параметрах синхронизации. Потом выполните обмен повторно. Ручная правка в приёмнике без этого не поможет: следующая синхронизация перезапишет документ.
Тестирование и исправление базы
Для битых ссылок у платформы есть штатный инструмент: Администрирование → Тестирование и исправление в Конфигураторе. Для случая ссылок на несуществующие объекты в нём есть выбор действия:
| Вариант | Что произойдёт | Когда выбирать |
|---|---|---|
| Создавать объекты | Платформа создаст объекты-заглушки, ссылки станут рабочими | Нужно сохранить связь, а потом заполнить заглушки вручную |
| Очищать ссылки | Битые ссылки станут пустыми | Связь не важна, реквизит заполните заново |
| Не изменять | Только отчёт о проблемах | Сначала оценить масштаб |
Перед тестированием и исправлением сделайте выгрузку информационной базы в .dt. Режим требует монопольного доступа: всех пользователей придётся отключить, запускать проверку лучше вне рабочего времени.
Начните с варианта «Не изменять» и посмотрите отчёт. Если битых ссылок десяток — проще восстановить объекты из копии. Если сотни — выбирайте «Создавать объекты»: заглушку можно переименовать и заполнить, а очищенную ссылку восстановить уже нельзя.
Как не допускать пустых ссылок
Профилактика дешевле разбора последствий. Что работает на практике:
- ✅ Проверка заполнения в метаданных. В свойствах реквизита установите «Проверка заполнения: Выдавать ошибку». Платформа не даст записать документ с пустым полем. В типовой конфигурации делайте это расширением, а не правкой основной конфигурации.
- ✅ Значения по умолчанию. Основной склад, организация и договор в настройках пользователя закрывают большую часть пустых полей в новых документах.
- ✅
ЗначениеЗаполнено()в коде. Не сравнивайте ссылки сНеопределено, если реквизит одного типа. Проверка через функцию работает для любых пустых значений. - ✅ Запрет непосредственного удаления. Пользователи помечают объекты на удаление, а удаляет их администратор через «Удаление помеченных объектов». Обработка проверит ссылки и не удалит используемое — так битые ссылки не появляются.
- ✅ Контроль после обмена. Раз в неделю прогоняйте запрос на пустые договоры и контрагентов по документам, пришедшим через синхронизацию.
Частые вопросы
Почему `Ссылка = Неопределено` возвращает Ложь, хотя поле пустое?
Неопределено. Используйте ЗначениеЗаполнено() или метод Пустая().