Объект не найден: поиск и лечение битых ссылок в базе 1С
Содержание
Битую ссылку в 1С определяют по тексту в поле: вместо контрагента или номенклатуры стоит <Объект не найден> (54:80c3001e67f1d4e011e1...). Массово их ищут через Конфигуратор → Администрирование → Тестирование и исправление с флажком проверки ссылочной целостности или запросом с левым соединением, где ссылка есть, а объекта под ней нет.
Типичная ситуация: бухгалтер открывает реализацию за прошлый квартал, а в поле «Контрагент» — набор цифр и букв. Документ не проводится, отчёт по взаиморасчётам показывает строку без названия. Объект кто-то удалил напрямую, или он не пришёл при обмене. Ниже — диагностика по шагам и способы лечения, от безопасного к радикальному.
Какие проблемы со ссылками бывают в 1С
Слово «битая ссылка» в 1С означает разные вещи. От типа зависит, где искать и чем лечить.
| Тип | Как проявляется | Где искать причину |
|---|---|---|
| 🔗 Ссылка на удалённый объект базы | <Объект не найден> (N:...) в поле документа или справочника | Журнал регистрации, обмены, прямое удаление |
🧭 Навигационная ссылка e1cib/... | При переходе по ссылке — сообщение, что объект не найден | Объект удалён или ссылка взята из другой базы |
| 🌐 Внешний адрес (сайт, веб-сервис, API) | Ошибка соединения, код ответа 404 или 500 | Настройки сети, сертификаты, сам сервис |
| 📁 Путь к файлу | Файл не открывается, «не найден путь» | Перенос каталога, смена буквы диска, права |
Ссылка на объект в 1С хранится как идентификатор: номер таблицы и 16-байтный УИД. Когда запись объекта исчезает из таблицы, а реквизиты других объектов продолжают хранить этот УИД, получается битая ссылка. Платформа не может показать представление и выводит заглушку с числами.
Откуда берутся битые ссылки на объекты:
- 🗑️ непосредственное удаление объекта (право «Интерактивное удаление» или
Удалить()в коде) без контроля ссылок; - 🔄 обмен данными: пришёл документ, а его контрагент или номенклатура остались в базе-источнике;
- 💾 частичное восстановление: загрузили выгрузку отдельных объектов без связанных справочников;
- ⚡ сбой при записи: аварийное завершение, отказ диска, проблемы с файлом
1Cv8.1CDфайловой базы; - ✍️ правка таблиц СУБД в обход платформы.
Штатная обработка Администрирование → Обслуживание → Удаление помеченных объектов в БП 3.0 битых ссылок не создаёт: она проверяет, где используется объект, и не удалит его, пока на него ссылаются.
Проверка ссылочной целостности в конфигураторе
Самый полный способ найти битые ссылки по всей базе — встроенное тестирование платформы. Оно проходит по всем таблицам и находит ссылки на несуществующие объекты.
Тестирование и исправление требует монопольного доступа. Все сеансы пользователей нужно завершить, фоновые задания остановить. Делайте это вечером или в выходной. Перед запуском режима исправления сделайте резервную копию базы — выгрузку .dt или копию средствами СУБД.
Порядок действий:
- Попросите всех выйти из базы и откройте её в режиме «Конфигуратор».
- Откройте
Администрирование → Тестирование и исправление. - Отметьте «Проверка логической целостности информационной базы» и «Проверка ссылочной целостности информационной базы». Остальные флажки (реиндексация, пересчёт итогов, сжатие) для диагностики не нужны и удлиняют проверку.
- Выберите режим «Только проверка» и нажмите «Выполнить».
- Дождитесь окончания. В окне сообщений появится список: в каком объекте и каком реквизите найдена ссылка на несуществующий объект.
Сохраните этот список — он нужен для разбора. Только после этого решайте, исправлять ли автоматически.
Режим исправления: что выбрать
Если запустить «Тестирование и исправление», платформа спросит, как поступать со ссылками на несуществующие объекты:
| Вариант | Что сделает | Когда подходит |
|---|---|---|
| Не изменять | Только сообщит | Сначала нужно разобраться в причине |
| Создавать объекты | Создаст пустые объекты с тем же УИД | Ссылок много, данные хотите восстановить позже вручную |
| Удалять ссылки | Очистит реквизиты, где была битая ссылка | Ссылки точно мусорные, восстанавливать нечего |
💡 Безопаснее вариант «Создавать объекты». Документы сохраняют связь, потом у созданной заглушки можно заполнить наименование и реквизиты. «Удалять ссылки» стирает информацию безвозвратно: потом уже не узнаешь, какой контрагент стоял в документе.
Для файловой базы есть ещё утилита chkdbfl.exe в каталоге bin платформы. Она проверяет физическую целостность файла 1Cv8.1CD. Её запускают при подозрении на повреждение файла, а не для поиска логических битых ссылок.
Встроенные проверки в пользовательском режиме
Конфигуратор доступен не всем. В свежих релизах типовых конфигураций на БСП (БП 3.0, ЗУП 3.1, УТ 11) есть подсистема контроля ведения учёта. Среди системных проверок там есть поиск ссылок на несуществующие объекты. Ищите её в Администрирование → Обслуживание; название группы может немного отличаться между релизами.
Плюсы такой проверки:
- ✅ не нужен монопольный режим, база работает;
- ✅ результат виден в карточках проблемных объектов;
- ✅ проверку можно поставить по расписанию.
Для точечной проверки одного объекта откройте его и посмотрите места использования. В типовых конфигурациях эта команда есть в меню «Ещё» формы списка или элемента. Если объект открывается, но в отчётах вместо него пустое поле, — это уже не битая ссылка, а скорее проблема с правами или отбором.
Журнал регистрации: кто и когда удалил объект
Битая ссылка сама по себе не скажет, что было удалено. Журнал регистрации подскажет, если он вёлся с уровнем «Информация» или подробнее.
- Откройте
Администрирование → Обслуживание → Журнал регистрациив пользовательском режиме илиАдминистрирование → Журнал регистрациив конфигураторе. - Установите отбор по событию «Данные. Удаление».
- Ограничьте период: от даты, когда документ был заведомо в порядке, до сегодняшнего дня.
- В колонке «Данные» найдите объект нужного типа. Сравните УИД с тем, что виден в битом поле.
- По колонкам «Пользователь» и «Компьютер» станет понятно, кто удалял.
Если удалений нет, отберите события обмена данными за тот же период. Ошибки загрузки и предупреждения про отсутствующие объекты обычно видны там.
💡 Хвост в скобках (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С, а не от вашего имени.
Как исправить битую ссылку: от мягкого способа к жёсткому
Выбор зависит от того, сколько битых ссылок и есть ли откуда взять данные.
| Способ | Когда применять | Риски |
|---|---|---|
| Выбрать правильный элемент вручную | Битых ссылок единицы | Почти нет; документ нужно перепровести |
| Заменить ссылку на существующий элемент обработкой | Объект пересоздан под новым УИД | Замена затронет все документы, проверьте отбор |
| Перенести удалённый объект из резервной копии | Есть копия, где объект ещё жив | Нужна отдельная база для восстановления |
| Создать объект с тем же УИД | Копии нет, но объект нужен | Реквизиты заполняете заново |
| Тестирование с созданием объектов | Битых ссылок сотни | Монопольный режим, заглушки нужно дозаполнить |
| Тестирование с удалением ссылок | Ссылки мусорные | Информация теряется безвозвратно |
Перенос объекта из резервной копии
Это главный приём, когда объект удалили по ошибке.
- Разверните резервную копию в отдельную базу. Рабочую базу копией не перезаписывайте — потеряете всё введённое после копии.
- Найдите в копии удалённый объект по УИД.
- Выгрузите его в XML универсальной обработкой выгрузки и загрузки данных. Она сохраняет УИД.
- Загрузите файл в рабочую базу. Ссылки в документах сразу оживут.
- Перепроведите документы, где была битая ссылка, если они участвуют в учёте.
Создание объекта с тем же УИД
Если копии нет, создайте новый элемент с прежним идентификатором. Документы увидят его вместо заглушки.
УИД = Новый УникальныйИдентификатор("8a5b2c1d-0e3f-4a6b-9c7d-112233445566");
НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(Справочники.Контрагенты.ПолучитьСсылку(УИД));
НовыйЭлемент.Наименование = "Восстановленный контрагент";
НовыйЭлемент.Записать();
УИД подставьте тот, что получили из битой ссылки через УникальныйИдентификатор(). После записи заполните ИНН, КПП и остальные реквизиты вручную.
Если в базе настроен обмен, восстановленный объект уйдёт в другие базы при следующей синхронизации. Убедитесь, что там он не существует под другим УИД, иначе появятся дубли.
Как не допустить битых ссылок
Большинство случаев — следствие прямого удаления и сбоев обмена. Профилактика закрывает обе дыры.
Отдельно про обмены. Если в базе-приёмнике появились битые ссылки после синхронизации, не правьте их в приёмнике вручную. Найдите объект в базе-источнике и зарегистрируйте его к отправке повторно. Иначе при следующем обмене в приёмник придёт тот же документ с той же битой ссылкой.
Частые вопросы
Можно ли провести документ с битой ссылкой?
Битая ссылка попадёт в отчёт?
<Объект не найден>, а суммы по ней собираются отдельной строкой. Из-за этого не сходятся сальдо по контрагентам и складам.Почему тестирование нашло битые ссылки, а в документах всё выглядит нормально?
Помогут ли пересчёт итогов и реиндексация?
Как узнать, на объект какого типа указывает битая ссылка?
Ссылка.Метаданные().ПолноеИмя() вернёт, например, Справочник.Контрагенты. Это работает, даже если объекта уже нет.