Битые ссылки, удалённые объекты и кэш: откуда в базе 1С берётся «Объект не найден»
Содержание
Ошибка «Объект не найден» в 1С почти всегда означает одно: в базе есть ссылка на запись, которой физически нет. Документ или справочник ссылается на контрагента, номенклатуру или договор, а сам элемент удалён, не загрузился при обмене или повреждён. Решение — найти битую ссылку, восстановить объект или очистить ссылку. Реже причина в кэше клиента или сервера и в параллельной работе пользователей.
Рецепт ниже общий для платформы 1С:Предприятие 8.3 и не зависит от конфигурации: одинаково работает в Бухгалтерии 3.0, ЗУП 3.1, УТ 11. Различаются только пути к служебным обработкам, их я указываю для БП 3.0.
Как выглядит ошибка и на что она указывает
Сообщение встречается в трёх видах, и каждый подсказывает своё направление поиска.
- 🔗 В поле формы вместо значения стоит
<Объект не найден> (231:a1b2c3d4e5f60718293a4b5c6d7e8f90). Это классическая битая ссылка. Число до двоеточия — внутренний номер типа объекта, после — идентификатор пропавшей записи. - 🧾 При проведении или записи появляется окно с текстом вроде
Ошибка при вызове метода контекста (Записать): Объект не найден. Значит, код программы попытался прочитать реквизиты объекта по ссылке и не нашёл его. - 🌐 При переходе по навигационной ссылке (
e1cib/data/...) из письма, задачи или избранного. Объект удалили после того, как ссылку сохранили.
Сама запись в базе при этом не «потерялась» случайно. У каждой битой ссылки есть история: кто-то удалил элемент, обмен принёс документ раньше справочника, база пострадала при сбое. Эту историю и нужно восстановить, иначе ошибка вернётся.
Какие объекты чаще всего «пропадают»
| Что ссылается | На что ссылается | Типичная история |
|---|---|---|
| Документы реализации и поступления | Контрагенты, договоры, номенклатура | Элемент удалили непосредственно, минуя контроль ссылок |
| Документы, пришедшие по обмену | Справочники другой базы | Документ выгрузили, справочник — нет |
| Регистры сведений и накопления | Удалённые документы-регистраторы | Сбой при записи или ручная правка таблиц |
| Настройки отчётов, избранное | Любые объекты | Объект удалили после сохранения настройки |
| Реквизиты составного типа | Объекты удалённых или переименованных видов | Доработка конфигурации без переноса данных |
Ищем источник в журнале регистрации
Журнал регистрации отвечает на два вопроса: кто и когда удалил объект, и в какой операции возникла ошибка. Начинайте с него, особенно если ошибка появилась недавно.
Где открыть журнал
- В БП 3.0 и других конфигурациях на БСП:
Администрирование → Обслуживание → Журнал регистрации. - В Конфигураторе:
Администрирование → Журнал регистрации.
Что искать
- Установите отбор по периоду: от последнего дня, когда всё работало, до первого появления ошибки.
- Отберите уровень «Ошибка» и найдите записи с текстом «Объект не найден». В колонке «Данные» будет документ, при работе с которым возникла ошибка.
- Теперь отберите события удаления данных за тот же период. В записи будет пользователь, компьютер и представление удалённого объекта.
- Если удаления в журнале нет, проверьте события обмена данными и загрузки. Объект мог вообще не приходить в базу.
💡 Представление удалённого объекта в журнале — это его наименование на момент удаления. По нему проще всего найти этот же элемент в резервной копии.
Журнал хранит историю ровно столько, сколько разрешено в настройках. Если в Конфигураторе в Администрирование → Настройка журнала регистрации стоит сокращение журнала, старые удаления уже не найти. Тогда остаётся резервная копия.
Поиск битых ссылок и их устранение
Когда известен хотя бы один «сломанный» документ, задача — найти все остальные такие же и решить, что с ними делать. Вариантов три: восстановить объект, создать объект-заглушку с тем же идентификатором или очистить ссылку.
Запрос, который находит битые ссылки
Битую ссылку выдаёт простой признак: при обращении к реквизиту через точку запрос возвращает NULL. У существующего элемента пометка удаления всегда заполнена, у несуществующего — нет. Пример для реализаций и контрагентов, выполняется в консоли запросов:
ВЫБРАТЬ
Док.Ссылка КАК Документ,
Док.Контрагент КАК БитаяСсылка
ИЗ
Документ.РеализацияТоваровУслуг КАК Док
ГДЕ
Док.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
И Док.Контрагент.ПометкаУдаления ЕСТЬ NULL
Подставьте свой документ и реквизит. Для табличной части обращайтесь к ней как к таблице: Документ.РеализацияТоваровУслуг.Товары КАК Стр и проверяйте Стр.Номенклатура.ПометкаУдаления ЕСТЬ NULL.
Способ 1. Восстановить объект из резервной копии
Самый чистый путь, если копия свежая и объект в ней есть.
- Разверните копию в отдельную базу (никогда поверх рабочей).
- Найдите в ней пропавший элемент по наименованию из журнала.
- Перенесите его в рабочую базу с сохранением ссылки. Подойдёт обработка выгрузки-загрузки данных в формате XML: она переносит объект с тем же уникальным идентификатором, и все документы «оживают».
Копирование через буфер обмена или ручной ввод не помогут: новый элемент получит новый идентификатор, а документы так и останутся со старой ссылкой.
Способ 2. Создать объект-заглушку с тем же идентификатором
Если копии нет, создайте элемент программно, присвоив ему ссылку пропавшего объекта. Идентификатор берётся из текста <Объект не найден> (231:...), но записан там во внутреннем порядке байтов. Строку из 32 символов нужно переставить в обычный вид GUID:
// Хвост = строка после двоеточия, 32 символа без скобок
Хвост = "a1b2c3d4e5f60718293a4b5c6d7e8f90";
СтрокаГУИД = Сред(Хвост, 25, 8) + "-" + Сред(Хвост, 21, 4) + "-"
+ Сред(Хвост, 17, 4) + "-" + Сред(Хвост, 1, 4) + "-" + Сред(Хвост, 5, 12);
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаГУИД));
Элемент = Справочники.Контрагенты.СоздатьЭлемент();
Элемент.УстановитьСсылкуНового(Ссылка);
Элемент.Наименование = "Восстановлен: " + СтрокаГУИД;
Элемент.ОбменДанными.Загрузка = Истина;
Элемент.Записать();
Код выполняется на сервере, во внешней обработке или в режиме «Выполнить код». После записи откройте документ с ошибкой: в поле должен появиться «Восстановлен: …». Если поле по-прежнему пустое или с ошибкой, проверьте тип: ссылка может указывать на другой справочник.
Затем заполните заглушку нормальными данными (ИНН, наименование) или замените её на правильный элемент через поиск и замену дублей.
Способ 3. Тестирование и исправление в Конфигураторе
Штатный инструмент платформы для массовой обработки: Конфигуратор → Администрирование → Тестирование и исправление.
- Отметьте «Проверка логической целостности информационной базы» и «Проверка ссылочной целостности информационной базы».
- Для случая «При наличии ссылок на несуществующие объекты» выберите действие.
- Сначала запустите режим «Тестирование» без исправления и изучите протокол: он покажет масштаб.
- Только потом — «Тестирование и исправление».
| Действие | Когда выбирать | Риск |
|---|---|---|
| Не изменять | Первый прогон, оценка масштаба | Нет |
| Создавать объекты | Ссылок много, нужно сохранить связи | Появятся пустые элементы, их надо разбирать вручную |
| Очищать ссылки | Связь не важна (старые настройки, черновики) | Реквизиты обнулятся, проведённые документы могут измениться |
Перед тестированием и исправлением сделайте полную резервную копию базы. Режим исправления требует монопольного доступа: все пользователи должны выйти, их сеансы оборвутся. Запускайте вне рабочего времени.
💡 Режим «Очищать ссылки» в проведённых документах опасен: документ останется проведённым с пустым контрагентом, а отчёты и сверки разъедутся. Для учётных документов почти всегда лучше «Создавать объекты».
Кэш и целостность файлов базы
Если битых ссылок запрос не находит, а ошибка воспроизводится, подозревайте кэш. Клиент 1С хранит у себя копию метаданных и части данных. После обновления, восстановления из копии или замены базы с тем же путём этот кэш может указывать на объекты, которых в базе уже нет.
Очистка кэша клиента
- Закройте все окна 1С на компьютере пользователя.
- Запустите 1С с параметром
/ClearCache. Его можно дописать в строку запуска базы: в окне выбора базИзменить → Дополнительные параметры запуска. - Если не помогло, удалите папки кэша вручную: содержимое
%APPDATA%\1C\1cv8и%LOCALAPPDATA%\1C\1cv8, кроме файлов списка баз (ibases.v8i) и подпапок с настройками, если не хотите их терять.
Кэш клиента затрагивает только этого пользователя. Чистить его можно в любое время, сеансы других не страдают.
Повреждение самой базы
Битые ссылки массово, в разных справочниках, без следов удаления в журнале — признак физического повреждения. Для файловой базы это сбой питания, обрыв сети при работе по общей папке, антивирус, блокирующий файл 1Cv8.1CD. В таком случае логическая проверка бессильна, сначала нужна физическая.
Блокировки и параллельные сеансы
Ошибка возникает и в совершенно здоровой базе, когда два пользователя работают с одним объектом. Типичный сценарий:
- Бухгалтер открыл документ и оставил форму на час.
- Коллега за это время удалил документ через удаление помеченных или перезаписал его обменом с новой версией.
- Бухгалтер жмёт «Записать» — форма держит ссылку на объект, которого больше нет.
Здесь ничего чинить в базе не нужно. Закройте форму без записи, обновите список и откройте документ заново. Если он действительно удалён — его надо восстановить или ввести снова.
Как проверить, кто сейчас работает в базе
Администрирование → Обслуживание → Активные пользователив БП 3.0 — список сеансов с компьютерами и временем начала.- В Конфигураторе:
Администрирование → Активные пользователи. - Для серверной базы — консоль администрирования кластера, ветка сеансов нужной информационной базы, или
rac session listс указанием кластера и базы.
💡 Удаление помеченных объектов запускайте, когда в базе никто не работает с удаляемыми документами. Встроенная обработка удаления в БСП проверяет ссылки и не даст удалить элемент, на который кто-то ссылается. Битые ссылки появляются, когда объект удаляют непосредственно (через Shift+Del при наличии прав или кодом), минуя эту проверку.
Права на непосредственное удаление
Самый надёжный способ предотвратить новые битые ссылки — забрать у пользователей право интерактивного непосредственного удаления. В типовых конфигурациях на БСП его нет у обычных профилей, но в доработанных базах и у пользователей с полными правами оно остаётся. Пусть удалением занимается один администратор через штатную обработку.
Файловая база и клиент-серверная: в чём разница
Причины ошибки одинаковые, а инструменты диагностики и цена ошибки — разные.
| Что проверяем | Файловая база | Клиент-серверная база |
|---|---|---|
| Физическая целостность | Утилита chdbfl.exe из папки bin платформы, база должна быть закрыта всеми | Средства СУБД (проверка базы в SQL Server или PostgreSQL) |
| Логическая и ссылочная | Тестирование и исправление в Конфигураторе | То же, плюс можно искать битые ссылки запросом без монопольного режима |
| Кэш | Только клиентский | Клиентский и кэш сервера 1С |
| Сеансы | Активные пользователи | Консоль кластера, rac session list |
Кэш сервера 1С
В клиент-серверном режиме сервер хранит свой сеансовый кэш в каталоге кластера (папки snccntx* внутри srvinfo\reg_1541). Если ошибка «Объект не найден» появилась у всех пользователей сразу после восстановления базы из копии или после переноса, а битых ссылок нет — очистка этого кэша часто помогает.
- Предупредите пользователей: остановка службы обрывает все сеансы на сервере, во всех базах кластера. Делайте это вечером или в выходной.
- Остановите службу «Агент сервера 1С:Предприятия 8.3».
- Переименуйте папки
snccntx*(не удаляйте сразу — так проще откатиться). - Запустите службу и проверьте вход в базу.
- Если всё работает, через пару дней удалите переименованные папки.
Остальное содержимое srvinfo не трогайте: там реестр кластера со списком баз и настройками.
Для файловой базы
Утилита chdbfl.exe лежит в каталоге установленной платформы, например C:\Program Files\1cv8\8.3.24.1691\bin\ (номер версии у вас свой). Порядок:
- Все пользователи выходят из базы, делаете копию файла
1Cv8.1CD. - Запускаете утилиту, указываете путь к файлу базы.
- Сначала проверка без исправления, затем с флажком исправления ошибок.
- После — Тестирование и исправление в Конфигураторе со ссылочной проверкой.
Если база лежит в сетевой папке и с ней работают несколько человек, задумайтесь о переходе на клиент-серверный вариант или хотя бы о стабильной локальной сети. Физические повреждения файловой базы — частый источник «необъяснимых» битых ссылок.
Как не получить ошибку снова
Отдельно про обмены. Если между базами настроена синхронизация, проверьте, что приёмник получает справочники раньше или вместе с документами. При выборочной выгрузке «только документы за период» ссылки на новых контрагентов неизбежно окажутся битыми.