Ситуация, когда документы внезапно пропадают из списков 1С, но при этом записи об их создании присутствуют в Журнале регистрации, является критической для любого бизнеса. Особенно часто это встречается в клиент-серверных вариантах работы. В данной статье мы подробно разберем, почему возникает состояние «Объект не найден», как провести глубокую диагностику системы и какие шаги предпринять для восстановления данных.
Первым делом проанализируем состояние системы. Если в Журнале регистрации (ЖР) зафиксированы события «Добавление» и «Проведение», но при попытке открыть документ из самого журнала или по ссылке система выдает ошибку «Объект не найден», это означает следующее: в таблице регистрации событий запись сохранилась, а физическая запись в таблице документов СУБД (например, _Document150) отсутствует или помечена как удаленная без сохранения ссылочной целостности.
Рассмотрим основные причины такого расхождения:
Удалить(), который не проверяет ссылки и может не оставить явного следа в ЖР, если запись событий была сбойна или отключена.rphost, обрыв связи со скулем), SQL откатывает данные, а ЖР уже «считает», что документ создан.Прежде чем паниковать, нам нужно выяснить, действительно ли данные удалены физически или они просто скрыты фильтрами, RLS (Restricted Least Privilege) или ошибками индексов. Обычный список документов может не отображать записи из-за наложенных отборов.
Используем консоль запросов. Напишем простой запрос, который обращается напрямую к таблице документов, игнорируя настройки форм:
ВЫБРАТЬ
ПлатежноеПоручение.Ссылка,
ПлатежноеПоручение.Номер,
ПлатежноеПоручение.Дата,
ПлатежноеПоручение.ПометкаУдаления
ИЗ
Документ.ПлатежноеПоручение КАК ПлатежноеПоручение
ГДЕ
ПлатежноеПоручение.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
Если запрос возвращает пустой результат или те самые «битые ссылки» (строки с текстом «Объект не найден»), значит, физически данных в основной таблице нет. Если же в консоли документы видны, а в списке нет — проверяем настройки RLS и права доступа пользователя.
Разберем ситуацию, когда документ физически есть, но пользователь его не видит. В 1С механизм RLS (Ограничение доступа на уровне записей) может быть настроен так, что при изменении какого-либо реквизита (например, «Организация» или «Подразделение») документ мгновенно исчезает из видимости сотрудника. Выясним, не менялись ли роли пользователей в ближайшее время. Попробуем зайти в базу под учетной записью с полными правами и проверить наличие документов.
Поскольку проблема массовая (пропали все документы за день), проанализируем действия на стороне СУБД. Нам необходимо проверить логи SQL Server Management Studio (SSMS). Выясним, не проводились ли операции RESTORE DATABASE в рабочее время.
Также стоит обратить внимание на дисковую подсистему. Если база лежит на SSD, возможны ошибки контроллера, приводящие к повреждению страниц данных. Выполним команду проверки целостности:
DBCC CHECKDB ('Имя_Вашей_Базы') WITH NO_INFOMSGS, ALL_ERRORMSGS;
Эта команда покажет, есть ли логические повреждения таблиц. Если ошибки обнаружены, это объясняет, почему ссылки «битые» — указатель в индексе есть, а страница данных повреждена.
Проанализируем еще одну интересную гипотезу. Иногда сотрудники, вместо того чтобы создавать новый документ, находят старый (например, за прошлый год) и просто меняют в нем дату и данные. В этом случае в Журнале регистрации вы увидите создание нового ГУИДа (если это было копирование) или изменение старого. Но если документ был просто отредактирован, его старая версия исчезнет. Проверим ЖР на предмет событий «Изменение» для документов за другие периоды.
Если мы подтвердили, что документы исчезли, но ссылки на них остались в регистрах (например, в движениях по денежным средствам), мы можем попытаться частично восстановить информацию. Рассмотрим алгоритм:
84d76296-1c21-11ef-b15c-00155d013103.Пример кода для восстановления ссылки (выполнять в обработке):
Идентификатор = Новый УникальныйИдентификатор("84d76296-1c21-11ef-b15c-00155d013103");
СсылкаНаДок = Документы.ПлатежноеПоручение.ПолучитьСсылку(Идентификатор);
// Проверим, существует ли объект физически
Если СсылкаНаДок.ПолучитьОбъект() = Неопределено Тогда
НовыйОбъект = Документы.ПлатежноеПоручение.СоздатьДокумент();
НовыйОбъект.УстановитьСсылкуНового(СсылкаНаДок);
НовыйОбъект.Дата = ТекущаяДата(); // Укажите примерную дату из ЖР
НовыйОбъект.Записать();
Сообщить("Создана пустая заготовка для битой ссылки");
КонецЕсли;
После создания такой «пустышки» мы сможем запустить стандартный отчет «Движения документа». Если записи в регистрах накопления сохранились (что бывает при некорректном непосредственном удалении), мы сможем восстановить сумму, контрагента и назначение платежа, после чего заполнить документ заново.
Почему в Журнале регистрации нет записей об удалении? Рассмотрим две ситуации:
Ситуация А: Удаление произошло через SQL-запрос DELETE FROM .... В этом случае сервер 1С вообще не знает об операции, и в ЖР ничего не будет. Это повод проверить безопасность доступа к SQL-серверу.
Ситуация Б: Использование внешних обработок или расширений. Некоторые обработки обмена с «Клиент-Банком» могут иметь в коде инструкции по очистке дублей. Если в коде используется метод Объект.Удалить(), и при этом в настройках Журнала регистрации установлен уровень логирования «Только ошибки», событие удаления может не записаться.
Для предотвращения подобных ситуаций в будущем рекомендуем:
RESTORE и DROP на уровне SQL Server.dbcc checkdb, особенно если используете SSD-накопители потребительского класса.