Что делать, если документы исчезли из базы 1С и отображаются как «Объект не найден»?

Системный администратор 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

Ситуация, когда документы внезапно пропадают из списков 1С, но при этом записи об их создании присутствуют в Журнале регистрации, является критической для любого бизнеса. Особенно часто это встречается в клиент-серверных вариантах работы. В данной статье мы подробно разберем, почему возникает состояние «Объект не найден», как провести глубокую диагностику системы и какие шаги предпринять для восстановления данных.

Анализ первичных признаков: Журнал регистрации против Базы Данных

Первым делом проанализируем состояние системы. Если в Журнале регистрации (ЖР) зафиксированы события «Добавление» и «Проведение», но при попытке открыть документ из самого журнала или по ссылке система выдает ошибку «Объект не найден», это означает следующее: в таблице регистрации событий запись сохранилась, а физическая запись в таблице документов СУБД (например, _Document150) отсутствует или помечена как удаленная без сохранения ссылочной целостности.

Рассмотрим основные причины такого расхождения:

  1. Непосредственное удаление: Кто-то из пользователей или внешняя обработка выполнили удаление объекта программным методом Удалить(), который не проверяет ссылки и может не оставить явного следа в ЖР, если запись событий была сбойна или отключена.
  2. Откат транзакции (Rollback): Запись в Журнал регистрации часто попадает чуть раньше, чем завершается транзакция в SQL. Если в момент фиксации произошел сбой (вылет процесса rphost, обрыв связи со скулем), SQL откатывает данные, а ЖР уже «считает», что документ создан.
  3. Восстановление базы из копии: Системный администратор мог восстановить вчерашний бэкап поверх текущей базы («на прод»), из-за чего данные за текущий день просто исчезли.

Шаг 1. Поиск «фантомных» данных через консоль запросов

Прежде чем паниковать, нам нужно выяснить, действительно ли данные удалены физически или они просто скрыты фильтрами, RLS (Restricted Least Privilege) или ошибками индексов. Обычный список документов может не отображать записи из-за наложенных отборов.

Используем консоль запросов. Напишем простой запрос, который обращается напрямую к таблице документов, игнорируя настройки форм:


ВЫБРАТЬ
    ПлатежноеПоручение.Ссылка,
    ПлатежноеПоручение.Номер,
    ПлатежноеПоручение.Дата,
    ПлатежноеПоручение.ПометкаУдаления
ИЗ
    Документ.ПлатежноеПоручение КАК ПлатежноеПоручение
ГДЕ
    ПлатежноеПоручение.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

Если запрос возвращает пустой результат или те самые «битые ссылки» (строки с текстом «Объект не найден»), значит, физически данных в основной таблице нет. Если же в консоли документы видны, а в списке нет — проверяем настройки RLS и права доступа пользователя.

Шаг 2. Проверка прав доступа и RLS

Разберем ситуацию, когда документ физически есть, но пользователь его не видит. В 1С механизм RLS (Ограничение доступа на уровне записей) может быть настроен так, что при изменении какого-либо реквизита (например, «Организация» или «Подразделение») документ мгновенно исчезает из видимости сотрудника. Выясним, не менялись ли роли пользователей в ближайшее время. Попробуем зайти в базу под учетной записью с полными правами и проверить наличие документов.

Шаг 3. Анализ логов SQL-сервера и транзакций

Поскольку проблема массовая (пропали все документы за день), проанализируем действия на стороне СУБД. Нам необходимо проверить логи SQL Server Management Studio (SSMS). Выясним, не проводились ли операции RESTORE DATABASE в рабочее время.

Также стоит обратить внимание на дисковую подсистему. Если база лежит на SSD, возможны ошибки контроллера, приводящие к повреждению страниц данных. Выполним команду проверки целостности:

DBCC CHECKDB ('Имя_Вашей_Базы') WITH NO_INFOMSGS, ALL_ERRORMSGS;

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

Шаг 4. Расследование человеческого фактора: «Перебивка» документов

Проанализируем еще одну интересную гипотезу. Иногда сотрудники, вместо того чтобы создавать новый документ, находят старый (например, за прошлый год) и просто меняют в нем дату и данные. В этом случае в Журнале регистрации вы увидите создание нового ГУИДа (если это было копирование) или изменение старого. Но если документ был просто отредактирован, его старая версия исчезнет. Проверим ЖР на предмет событий «Изменение» для документов за другие периоды.

Шаг 5. Работа с битыми ссылками и восстановление

Если мы подтвердили, что документы исчезли, но ссылки на них остались в регистрах (например, в движениях по денежным средствам), мы можем попытаться частично восстановить информацию. Рассмотрим алгоритм:

  1. Найдем в Журнале регистрации уникальный идентификатор (GUID) пропавшего документа. Он выглядит примерно так: 84d76296-1c21-11ef-b15c-00155d013103.
  2. Используем программный код для создания «заглушки» объекта с тем же GUID. Это позволит нам хотя бы открыть документ и увидеть его движения в регистрах.

Пример кода для восстановления ссылки (выполнять в обработке):


Идентификатор = Новый УникальныйИдентификатор("84d76296-1c21-11ef-b15c-00155d013103");
СсылкаНаДок = Документы.ПлатежноеПоручение.ПолучитьСсылку(Идентификатор);

// Проверим, существует ли объект физически
Если СсылкаНаДок.ПолучитьОбъект() = Неопределено Тогда
    НовыйОбъект = Документы.ПлатежноеПоручение.СоздатьДокумент();
    НовыйОбъект.УстановитьСсылкуНового(СсылкаНаДок);
    НовыйОбъект.Дата = ТекущаяДата(); // Укажите примерную дату из ЖР
    НовыйОбъект.Записать();
    Сообщить("Создана пустая заготовка для битой ссылки");
КонецЕсли;

После создания такой «пустышки» мы сможем запустить стандартный отчет «Движения документа». Если записи в регистрах накопления сохранились (что бывает при некорректном непосредственном удалении), мы сможем восстановить сумму, контрагента и назначение платежа, после чего заполнить документ заново.

Выясним причину отсутствия записей об удалении

Почему в Журнале регистрации нет записей об удалении? Рассмотрим две ситуации:

Ситуация А: Удаление произошло через SQL-запрос DELETE FROM .... В этом случае сервер 1С вообще не знает об операции, и в ЖР ничего не будет. Это повод проверить безопасность доступа к SQL-серверу.

Ситуация Б: Использование внешних обработок или расширений. Некоторые обработки обмена с «Клиент-Банком» могут иметь в коде инструкции по очистке дублей. Если в коде используется метод Объект.Удалить(), и при этом в настройках Журнала регистрации установлен уровень логирования «Только ошибки», событие удаления может не записаться.

Итоговые рекомендации

Для предотвращения подобных ситуаций в будущем рекомендуем:

← На главную