«Объект не найден» в базе 1С: где искать потерянные ссылки и как их вернуть

· 10 мин

Содержание

Битую ссылку в 1С проще всего найти так: запустите Конфигуратор в монопольном режиме, откройте Администрирование → Тестирование и исправление, включите флажок «Проверка ссылочной целостности информационной базы» и режим «Только проверка». Платформа пройдёт по всем таблицам и выведет в окно сообщений каждый реквизит, который указывает на несуществующий объект. В пользовательском режиме битая ссылка видна как текст <Объект не найден> (45:8f6a00155d01080111e7c63c15a9e5f0) в поле документа, строке отчёта или списке.

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

Что такое битая ссылка в 1С и почему она появляется

В базе 1С документ хранит не имя контрагента, а его внутренний идентификатор — 16 байт GUID. Если элемента с таким идентификатором в таблице справочника больше нет, ссылка «повисает». Документ открывается, но в поле вместо названия стоит <Объект не найден>.

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

  • 🗑️ Непосредственное удаление. Пользователь с правом интерактивного удаления стёр элемент кнопкой Shift+Del или командой «Удалить» без пометки. Контроль ссылок при этом не выполняется.
  • 🔄 Обмен данными. В РИБ или по правилам конвертации пришёл документ, а справочник, на который он ссылается, не выгрузили или отфильтровали.
  • 📥 Загрузка из XML или .dt частями. Перенесли документы из одной базы в другую без связанных справочников.
  • 🧑‍💻 Код с отключёнными проверками. Обработка удалила объект через Удалить() с ОбменДанными.Загрузка = Истина.
  • 💥 Аварии. Сбой записи, восстановление базы из неполной копии, повреждение файла 1Cv8.1CD.
  • ✂️ Свёртка базы. Старые документы удалили, а регистры сведений или настройки продолжают на них ссылаться.

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

Как прочитать сообщение «Объект не найден»

Текст в скобках — готовая улика. Возьмём пример: <Объект не найден> (17:8f6a00155d01080111e7c63c15a9e5f0).

ЧастьЧто означает
17Внутренний номер типа объекта. Обычно совпадает с номером таблицы в СУБД: _Reference17, _Document17
8f6a…e5f032 шестнадцатеричных символа — идентификатор объекта в том порядке байтов, в котором он лежит в таблице

Чтобы получить привычный GUID для поиска средствами 1С, строку переставляют по блокам. Из 32 символов берут:

  1. Символы 25–32 → первый блок GUID.
  2. Символы 21–24 → второй блок.
  3. Символы 17–20 → третий блок.
  4. Символы 1–4 → четвёртый блок.
  5. Символы 5–16 → пятый блок.

Для примера выше получится 15a9e5f0-c63c-11e7-8f6a-00155d010801. По этому GUID объект ищут в резервной копии и восстанавливают с той же ссылкой. Для SQL переставлять ничего не нужно: строка из скобок со значком 0x впереди — это значение поля _IDRRef.

Тип объекта по номеру определяют через ПолучитьСтруктуруХраненияБазыДанных(): функция возвращает соответствие имён таблиц СУБД и объектов метаданных. Найдите в результате таблицу с номером 17 — и станет понятно, какой это справочник.

Способ 1 и 2: ищем битые ссылки в формах, отчётах и «Всех функциях»

Просмотр документов и отчётов

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

Для массового поиска удобнее отчёты. Оборотно-сальдовая ведомость по счёту с разворотом по субконто показывает строку <Объект не найден>, если проводки ссылаются на удалённого контрагента, договор или номенклатуру. Так видно не только факт, но и сумму, которая «висит» на потерянном объекте.

  • 📊 ОСВ по счетам 60, 62, 76 — потерянные контрагенты и договоры.
  • 📦 ОСВ по счетам 10, 41, 43 — потерянная номенклатура.
  • 🧾 Отчёт по проводкам с отбором по счёту — конкретные документы с битым субконто.

Двойной щелчок по сумме в строке <Объект не найден> открывает расшифровку, а из неё — сами документы.

Режим «Все функции»

Часть данных не видна из обычного меню: регистры сведений, служебные справочники, планы обмена. Их открывают через «Все функции».

  1. Откройте главное меню (кнопка с тремя полосками в левом верхнем углу).
  2. Перейдите в Сервис → Параметры и включите флажок «Отображать команду “Все функции”».
  3. В главном меню появится пункт Все функции. В нём раскройте нужную ветку: Справочники, Регистры сведений, Регистры накопления.
  4. Откройте список и просмотрите колонки: битые значения показаны как <Объект не найден>.

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

Способ 3: проверка ссылочной целостности в Конфигураторе

Это штатный инструмент платформы, и он проверяет все таблицы сразу.

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

Результат появится в окне сообщений Конфигуратора. Для каждой проблемы указан объект и реквизит, где найдена ссылка на несуществующий элемент. Скопируйте список в файл: он понадобится для разбора.

Режимы исправления

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

РежимЧто сделает платформаКогда выбиратьРиск
Создавать объектыСоздаст элементы-заглушки с той же ссылкойОбъекты нужны, их потом заполнят или заменятЗаглушки без реквизитов, их надо разобрать вручную
Удалять ссылкиОчистит реквизиты, где была битая ссылкаСсылки точно не нужны: мусор после обмена или свёрткиДанные о том, на что ссылался документ, теряются навсегда
Не изменятьТолько сообщит о проблемеХотите исправить вручную или кодомНет

Режим «Удалять ссылки» на рабочей базе без копии — плохая идея: документы останутся без контрагентов и договоров, а восстановить связь будет не из чего.

Самый безопасный вариант для бухгалтерской базы — «Создавать объекты». После него в справочнике появятся элементы с названием вида «Объект не найден (…)». Их можно найти по названию, заполнить или заменить на правильные через обработку поиска и замены дублей.

На большой базе тестирование идёт часами. Планируйте его на нерабочее время: всё это время пользователи не смогут войти.

Способ 4 и 5: запрос на языке 1С и внешние обработки

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

Запрос к конкретному реквизиту

Приём простой: если ссылка не пустая, а разыменованное поле объекта возвращает NULL, значит, объекта в таблице нет. Пример для документа реализации в 1С:Бухгалтерии 3.0:

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

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

Ту же проверку в коде делают одной строкой. На сервере у битой ссылки метод ПолучитьОбъект() возвращает Неопределено:

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

Внешние обработки

Перебирать вручную все реквизиты всех объектов долго. Для этого пишут или берут готовые внешние обработки: они проходят по метаданным, строят запрос для каждого ссылочного реквизита и собирают результат в таблицу «объект — реквизит — битое значение».

Перед запуском чужой обработки:

  • 🔍 откройте её в Конфигураторе и посмотрите, что она делает, особенно команды записи и удаления;
  • 🧪 запустите сначала на копии базы;
  • 📝 убедитесь, что в обработке есть режим «только отчёт», без автоматического исправления.

В типовых конфигурациях на БСП есть свой механизм проверок учёта: в разделе Администрирование → Обслуживание ищите контроль ведения учёта. Состав проверок зависит от конфигурации и релиза, поэтому посмотрите список проверок в своей базе, прежде чем на него полагаться.

Способ 6: SQL-запрос для клиент-серверной базы

Администратор может найти битые ссылки прямо в СУБД, не нагружая сервер 1С. Это удобно на базах в сотни гигабайт, где тестирование в Конфигураторе идёт ночь.

Сначала узнайте имена таблиц и полей через ПолучитьСтруктуруХраненияБазыДанных(). Допустим, документ хранится в _Document567, реквизит «Контрагент» — поле _Fld1234RRef, справочник контрагентов — _Reference45. Запрос для MS SQL Server:

SELECT d._IDRRef, d._Number, d._Date_Time, d._Fld1234RRef
FROM _Document567 d
LEFT JOIN _Reference45 r ON r._IDRRef = d._Fld1234RRef
WHERE r._IDRRef IS NULL
  AND d._Fld1234RRef <> 0x00000000000000000000000000000000;

Найти конкретный потерянный объект по сообщению тоже можно. Строку из скобок подставляют как есть: WHERE _IDRRef = 0x8F6A00155D01080111E7C63C15A9E5F0.

Что учесть:

  • 🧩 У реквизитов составного типа три поля: тип значения, номер таблицы и сама ссылка. Связывать нужно с учётом номера таблицы.
  • 🐘 В PostgreSQL имена таблиц в нижнем регистре, а пустая ссылка сравнивается как значение типа bytea.
  • 📖 Добавьте к запросу WITH (NOLOCK) в MS SQL, если не хотите мешать пользователям, но помните: так можно увидеть незафиксированные данные.

Используйте SQL только для чтения. Запись в таблицы 1С средствами СУБД обходит всю логику платформы и легко ломает базу окончательно.

Способ 7: регулярная проверка без участия человека

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

"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" DESIGNER /S "srv1c\buh" /N "Admin" /P "пароль" /IBCheckAndRepair -LogAndRefsIntegrity -TestOnly /Out "D:\logs\check_refs.txt"
  • /IBCheckAndRepair — запуск тестирования и исправления.
  • -LogAndRefsIntegrity — проверка логической и ссылочной целостности.
  • -TestOnly — только проверка, без изменений.
  • /Out — файл, куда попадут сообщения.

Номер платформы в пути замените на свой. Для файловой базы вместо /S используют /F "D:\Bases\Buh".

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

Второй вариант автоматизации — регламентное задание в конфигурации, которое раз в неделю выполняет запросы из способа 4 по ключевым реквизитам и пишет результат в журнал регистрации. Это не требует монопольного доступа, но покрывает только те реквизиты, которые вы перечислили.

Как исправить найденные битые ссылки

Порядок зависит от того, нужен ли потерянный объект.

Что делать с найденной битой ссылкой?

Код для восстановления элемента-заглушки по GUID. Выполняется на сервере, например во внешней обработке:

УИД = Новый УникальныйИдентификатор("15a9e5f0-c63c-11e7-8f6a-00155d010801");
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(УИД);
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
    Объект = Справочники.Контрагенты.СоздатьЭлемент();
    Объект.УстановитьСсылкуНового(Ссылка);
    Объект.Наименование = "Восстановлен по битой ссылке - проверить";
    Объект.ОбменДанными.Загрузка = Истина;
    Объект.Записать();
КонецЕсли;

ОбменДанными.Загрузка = Истина отключает проверки заполнения: у заглушки нет ИНН и других обязательных реквизитов. Потом элемент нужно открыть и заполнить нормально.

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

  • 🔒 Отберите у пользователей право интерактивного удаления. Пусть удаляют только через пометку и обработку Удаление помеченных объектов — она проверяет, используется ли объект.
  • 🔄 В правилах обмена проверяйте, что вместе с документами выгружаются справочники, на которые они ссылаются.
  • 💾 Перед свёрткой и массовой загрузкой делайте копию и после операции запускайте проверку ссылочной целостности в режиме «Только проверка».

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

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