Объект не найден: поиск и лечение битых ссылок в базе 1С

· 10 мин

Содержание

Битую ссылку в 1С определяют по тексту в поле: вместо контрагента или номенклатуры стоит <Объект не найден> (54:80c3001e67f1d4e011e1...). Массово их ищут через Конфигуратор → Администрирование → Тестирование и исправление с флажком проверки ссылочной целостности или запросом с левым соединением, где ссылка есть, а объекта под ней нет.

Типичная ситуация: бухгалтер открывает реализацию за прошлый квартал, а в поле «Контрагент» — набор цифр и букв. Документ не проводится, отчёт по взаиморасчётам показывает строку без названия. Объект кто-то удалил напрямую, или он не пришёл при обмене. Ниже — диагностика по шагам и способы лечения, от безопасного к радикальному.

Какие проблемы со ссылками бывают в 1С

Слово «битая ссылка» в 1С означает разные вещи. От типа зависит, где искать и чем лечить.

ТипКак проявляетсяГде искать причину
🔗 Ссылка на удалённый объект базы<Объект не найден> (N:...) в поле документа или справочникаЖурнал регистрации, обмены, прямое удаление
🧭 Навигационная ссылка e1cib/...При переходе по ссылке — сообщение, что объект не найденОбъект удалён или ссылка взята из другой базы
🌐 Внешний адрес (сайт, веб-сервис, API)Ошибка соединения, код ответа 404 или 500Настройки сети, сертификаты, сам сервис
📁 Путь к файлуФайл не открывается, «не найден путь»Перенос каталога, смена буквы диска, права

Ссылка на объект в 1С хранится как идентификатор: номер таблицы и 16-байтный УИД. Когда запись объекта исчезает из таблицы, а реквизиты других объектов продолжают хранить этот УИД, получается битая ссылка. Платформа не может показать представление и выводит заглушку с числами.

Откуда берутся битые ссылки на объекты:

  • 🗑️ непосредственное удаление объекта (право «Интерактивное удаление» или Удалить() в коде) без контроля ссылок;
  • 🔄 обмен данными: пришёл документ, а его контрагент или номенклатура остались в базе-источнике;
  • 💾 частичное восстановление: загрузили выгрузку отдельных объектов без связанных справочников;
  • ⚡ сбой при записи: аварийное завершение, отказ диска, проблемы с файлом 1Cv8.1CD файловой базы;
  • ✍️ правка таблиц СУБД в обход платформы.

Штатная обработка Администрирование → Обслуживание → Удаление помеченных объектов в БП 3.0 битых ссылок не создаёт: она проверяет, где используется объект, и не удалит его, пока на него ссылаются.

Проверка ссылочной целостности в конфигураторе

Самый полный способ найти битые ссылки по всей базе — встроенное тестирование платформы. Оно проходит по всем таблицам и находит ссылки на несуществующие объекты.

Тестирование и исправление требует монопольного доступа. Все сеансы пользователей нужно завершить, фоновые задания остановить. Делайте это вечером или в выходной. Перед запуском режима исправления сделайте резервную копию базы — выгрузку .dt или копию средствами СУБД.

Порядок действий:

  1. Попросите всех выйти из базы и откройте её в режиме «Конфигуратор».
  2. Откройте Администрирование → Тестирование и исправление.
  3. Отметьте «Проверка логической целостности информационной базы» и «Проверка ссылочной целостности информационной базы». Остальные флажки (реиндексация, пересчёт итогов, сжатие) для диагностики не нужны и удлиняют проверку.
  4. Выберите режим «Только проверка» и нажмите «Выполнить».
  5. Дождитесь окончания. В окне сообщений появится список: в каком объекте и каком реквизите найдена ссылка на несуществующий объект.

Сохраните этот список — он нужен для разбора. Только после этого решайте, исправлять ли автоматически.

Режим исправления: что выбрать

Если запустить «Тестирование и исправление», платформа спросит, как поступать со ссылками на несуществующие объекты:

ВариантЧто сделаетКогда подходит
Не изменятьТолько сообщитСначала нужно разобраться в причине
Создавать объектыСоздаст пустые объекты с тем же УИДСсылок много, данные хотите восстановить позже вручную
Удалять ссылкиОчистит реквизиты, где была битая ссылкаСсылки точно мусорные, восстанавливать нечего

💡 Безопаснее вариант «Создавать объекты». Документы сохраняют связь, потом у созданной заглушки можно заполнить наименование и реквизиты. «Удалять ссылки» стирает информацию безвозвратно: потом уже не узнаешь, какой контрагент стоял в документе.

Для файловой базы есть ещё утилита chkdbfl.exe в каталоге bin платформы. Она проверяет физическую целостность файла 1Cv8.1CD. Её запускают при подозрении на повреждение файла, а не для поиска логических битых ссылок.

Встроенные проверки в пользовательском режиме

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

Плюсы такой проверки:

  • ✅ не нужен монопольный режим, база работает;
  • ✅ результат виден в карточках проблемных объектов;
  • ✅ проверку можно поставить по расписанию.

Для точечной проверки одного объекта откройте его и посмотрите места использования. В типовых конфигурациях эта команда есть в меню «Ещё» формы списка или элемента. Если объект открывается, но в отчётах вместо него пустое поле, — это уже не битая ссылка, а скорее проблема с правами или отбором.

Журнал регистрации: кто и когда удалил объект

Битая ссылка сама по себе не скажет, что было удалено. Журнал регистрации подскажет, если он вёлся с уровнем «Информация» или подробнее.

  1. Откройте Администрирование → Обслуживание → Журнал регистрации в пользовательском режиме или Администрирование → Журнал регистрации в конфигураторе.
  2. Установите отбор по событию «Данные. Удаление».
  3. Ограничьте период: от даты, когда документ был заведомо в порядке, до сегодняшнего дня.
  4. В колонке «Данные» найдите объект нужного типа. Сравните УИД с тем, что виден в битом поле.
  5. По колонкам «Пользователь» и «Компьютер» станет понятно, кто удалял.

Если удалений нет, отберите события обмена данными за тот же период. Ошибки загрузки и предупреждения про отсутствующие объекты обычно видны там.

💡 Хвост в скобках (54:80c3001e67f1d4e011e1...) — это номер таблицы и УИД, но байты в нём переставлены относительно привычной записи GUID. Сравнивать вручную неудобно. Надёжнее получить УИД в коде: Строка(Ссылка.УникальныйИдентификатор()) работает и для битой ссылки.

Как найти битые ссылки в документах и справочниках запросом

Когда известно, какой реквизит подозрительный, быстрее проверить его запросом. Запустите его в консоли запросов (внешняя обработка, нужны права на открытие внешних обработок) или в своей обработке.

Пример: реализации, у которых контрагент ссылается на несуществующий элемент справочника.

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

Логика простая: левое соединение не находит запись в справочнике, поэтому Спр.Ссылка становится NULL. Пустые ссылки отсекаем отдельным условием — пустое поле не битое.

Так же проверяются табличные части. Для товаров в реализации источник будет Документ.РеализацияТоваровУслуг.Товары, соединение — с Справочник.Номенклатура по полю Номенклатура.

Если реквизит составного типа, добавьте в условие соединения ВЫРАЗИТЬ(Док.Реквизит КАК Справочник.Контрагенты) и проверяйте каждый тип отдельно.

Проверка одной ссылки в коде

Для одного значения запрос не нужен:

Если Не Ссылка.Пустая() И Ссылка.ПолучитьОбъект() = Неопределено Тогда
    УИД = Строка(Ссылка.УникальныйИдентификатор());
    Сообщить("Битая ссылка: " + Ссылка.Метаданные().ПолноеИмя() + ", УИД " + УИД);
КонецЕсли;

Метод ПолучитьОбъект() возвращает Неопределено, если записи с таким УИД нет. Код выполняйте на сервере.

Внешние битые ссылки: HTTP-соединения и веб-сервисы

Вторая большая группа — адреса за пределами базы: сайт поставщика, API банка, веб-сервис филиала, URL в реквизите справочника. Здесь «битая» значит «не отвечает» или «отвечает ошибкой».

Сначала проверьте адрес вне 1С: откройте его в браузере на том же компьютере или сервере, где работает код. Для серверного кода проверять нужно с сервера 1С — у него свои настройки прокси и брандмауэра.

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

Программная проверка доступности адреса

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

Функция АдресДоступен(Сервер, Ресурс, Защищенное = Истина) Экспорт
    Попытка
        SSL = ?(Защищенное, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено);
        Соединение = Новый HTTPСоединение(Сервер, , , , , 10, SSL);
        Запрос = Новый HTTPЗапрос(Ресурс);
        Ответ = Соединение.Получить(Запрос);
        Возврат Ответ.КодСостояния < 400;
    Исключение
        ЗаписьЖурналаРегистрации("ПроверкаВнешнихАдресов",
            УровеньЖурналаРегистрации.Предупреждение, , ,
            Сервер + Ресурс + ": " + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;
КонецФункции

Шестой параметр конструктора — таймаут в секундах. Без него зависший сервис держит сеанс долго. Сервер передаётся без https://, ресурс — с начальной косой чертой: АдресДоступен("example.ru", "/api/status").

Для веб-сервисов SOAP первая точка отказа — загрузка WSDL. Если конструктор WSОпределения с адресом описания падает с ошибкой, сервис недоступен или адрес WSDL изменился. Если описание загрузилось, а вызов операции даёт ошибку, проблема уже в данных или правах.

Ссылки на файлы

Пути вида \\server\docs\... ломаются при переносе каталога. Проверка в коде — Новый Файл(Путь).Существует(). Помните: серверный код видит диски и сетевые папки от имени пользователя, под которым запущена служба сервера 1С, а не от вашего имени.

Как исправить битую ссылку: от мягкого способа к жёсткому

Выбор зависит от того, сколько битых ссылок и есть ли откуда взять данные.

СпособКогда применятьРиски
Выбрать правильный элемент вручнуюБитых ссылок единицыПочти нет; документ нужно перепровести
Заменить ссылку на существующий элемент обработкойОбъект пересоздан под новым УИДЗамена затронет все документы, проверьте отбор
Перенести удалённый объект из резервной копииЕсть копия, где объект ещё живНужна отдельная база для восстановления
Создать объект с тем же УИДКопии нет, но объект нуженРеквизиты заполняете заново
Тестирование с созданием объектовБитых ссылок сотниМонопольный режим, заглушки нужно дозаполнить
Тестирование с удалением ссылокСсылки мусорныеИнформация теряется безвозвратно

Перенос объекта из резервной копии

Это главный приём, когда объект удалили по ошибке.

  1. Разверните резервную копию в отдельную базу. Рабочую базу копией не перезаписывайте — потеряете всё введённое после копии.
  2. Найдите в копии удалённый объект по УИД.
  3. Выгрузите его в XML универсальной обработкой выгрузки и загрузки данных. Она сохраняет УИД.
  4. Загрузите файл в рабочую базу. Ссылки в документах сразу оживут.
  5. Перепроведите документы, где была битая ссылка, если они участвуют в учёте.

Создание объекта с тем же УИД

Если копии нет, создайте новый элемент с прежним идентификатором. Документы увидят его вместо заглушки.

УИД = Новый УникальныйИдентификатор("8a5b2c1d-0e3f-4a6b-9c7d-112233445566");
НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(Справочники.Контрагенты.ПолучитьСсылку(УИД));
НовыйЭлемент.Наименование = "Восстановленный контрагент";
НовыйЭлемент.Записать();

УИД подставьте тот, что получили из битой ссылки через УникальныйИдентификатор(). После записи заполните ИНН, КПП и остальные реквизиты вручную.

Если в базе настроен обмен, восстановленный объект уйдёт в другие базы при следующей синхронизации. Убедитесь, что там он не существует под другим УИД, иначе появятся дубли.

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

Большинство случаев — следствие прямого удаления и сбоев обмена. Профилактика закрывает обе дыры.

Профилактика битых ссылок
Выполнено: 0 / 7

Отдельно про обмены. Если в базе-приёмнике появились битые ссылки после синхронизации, не правьте их в приёмнике вручную. Найдите объект в базе-источнике и зарегистрируйте его к отправке повторно. Иначе при следующем обмене в приёмник придёт тот же документ с той же битой ссылкой.

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

Можно ли провести документ с битой ссылкой?
Обычно нет: проверка заполнения или движения по регистрам требуют реальный объект. Сначала замените ссылку или восстановите объект, потом проводите.
Битая ссылка попадёт в отчёт?
Да. В отчётах на её месте будет та же заглушка <Объект не найден>, а суммы по ней собираются отдельной строкой. Из-за этого не сходятся сальдо по контрагентам и складам.
Почему тестирование нашло битые ссылки, а в документах всё выглядит нормально?
Ссылка может стоять в реквизите, которого нет на форме, в табличной части, регистре сведений или в истории изменений. Смотрите полный путь объекта и реквизита в сообщениях проверки.
Помогут ли пересчёт итогов и реиндексация?
Нет. Они восстанавливают итоги регистров и индексы, а удалённая запись объекта от этого не появится. Для битых ссылок нужна именно проверка ссылочной целостности.
Как узнать, на объект какого типа указывает битая ссылка?
В коде: Ссылка.Метаданные().ПолноеИмя() вернёт, например, Справочник.Контрагенты. Это работает, даже если объекта уже нет.