Ситуация, когда важный документ внезапно исчезает из информационной базы 1С:ERP, а стандартный Журнал регистрации не показывает событий удаления, может вызвать панику как у пользователей, так и у администраторов. В данной статье мы подробно разберем, почему так происходит, как провести расследование и какие технические лазейки позволяют данным «испаряться» бесследно.
Прежде чем переходить к сложным техническим манипуляциям с СУБД, проанализируем психологию пользователей и особенности интерфейса 1С. В большинстве случаев «исчезновение» является следствием изменения ключевых реквизитов, по которым настроен поиск или фильтр в списке документов.
Рассмотрим основные причины мнимого исчезновения:
Еще — Установить стандартные настройки).Если вы ищете в журнале регистрации по конкретному номеру документа, вы можете совершить ошибку. Разберем механизм работы ЖР: если номер документа был изменен, то во всех записях журнала (даже старых) платформа может отображать уже новое представление объекта.
Посмотрим на ситуацию глубже: в Журнале регистрации есть две важные колонки — Данные и Представление. Если объект изменен, ссылка остается прежней, а текстовое представление меняется. Рекомендуется:
Данные.Изменение. Возможно, именно там вы увидите, как документ с номером «А» стал документом с номером «Б».Если у вас сохранилась копия базы, где документ точно был, или вы можете достать его УИД из других источников (например, из связанных регистров), это лучший способ доказать факт удаления или изменения. Рассмотрим пошаговый алгоритм:
СсылкаНаОбъект = Документы.ЗаказПокупателя.НайтиПоНомеру("001");
УИД = Строка(СсылкаНаОбъект.УникальныйИдентификатор());
Сообщить(УИД);
НужныйУИД = Новый УникальныйИдентификатор("здесь-ваш-uuid");
Ссылка = Документы.ЗаказПокупателя.ПолучитьСсылку(НужныйУИД);
Объект = Ссылка.ПолучитьОбъект();
Если Объект = Неопределено Тогда
Сообщить("Документ действительно удален физически.");
Иначе
Сообщить("Документ существует! Его номер: " + Объект.Номер);
КонецЕсли;
Если документ действительно удален, но в ЖР нет записи Данные.Удаление, проанализируем способы, которыми это можно сделать намеренно или случайно в обход стандартных механизмов платформы.
Это один из самых изощренных способов. Журнал регистрации является сервисом конкретного кластера. Если администратор подключит базу ко второму (временному) кластеру, выполнит там удаление объектов и вернет базу в основной кластер, в основном журнале регистрации не останется вообще никаких записей — ни о входе пользователя, ни об удалении. Платформа 1С просто «не увидит» этих событий, так как они писались в файлы ЖР другого кластера.
Если у злоумышленника есть доступ к СУБД (Microsoft SQL Server или PostgreSQL), он может выполнить команду DELETE напрямую в таблицах базы данных. Рассмотрим последствия:
В этом случае следы можно найти только в логах транзакций самой СУБД (LDF-файлы для MS SQL), если включена Full Recovery Model.
Администратор может временно перевести базу в монопольный режим, зайти в Конфигуратор и установить уровень регистрации событий в значение Не регистрировать. После удаления документов настройка возвращается назад. Это оставляет косвенный след — в самом ЖР будет виден разрыв по времени или запись об изменении настроек журнала, но самих фактов удаления вы не найдете.
Журнал регистрации в старом формате (.lgp) — это набор текстовых файлов. Их можно отредактировать обычным Блокнотом или удалить часть строк, соответствующих определенному времени или пользователю. После этого платформа продолжит работать с файлом как ни в чем не бывало. В новом формате (.lgdb на базе SQLite) сделать это сложнее, но при наличии специальных утилит для работы с БД SQLite — вполне реально.
Бытует мнение, что действия через COM-соединение не пишутся в журнал. Проанализируем это: на самом деле пишутся, но под тем пользователем, который указан в строке подключения. Однако существуют специфические обработки (например, «Удаление объектов без проверки ссылочной целостности»), которые при определенных условиях или ошибках платформы могут отрабатывать некорректно в плане логирования. Тем не менее, стандартный метод Объект.Удалить() всегда должен оставлять след при включенном ЖР.
Чтобы исключить подобные ситуации в будущем, разберем необходимые административные меры:
Интерактивное удаление и Удаление. Используйте только Пометку на удаление.НСИ и администрирование — Общие настройки — История изменений). Даже если документ удалят из базы, его предыдущие версии останутся в регистре сведений Версии объектов. Это позволит не только увидеть, кто последним менял документ, но и полностью восстановить его данные.db_owner в SQL, если это не требуется для обновлений. Ограничьте возможность прямого выполнения запросов к таблицам 1С.Подведем итог: если документ «исчез», в 90% случаев это результат изменения его даты, номера или случайного удаления пользователем с расширенными правами. В остальных 10% случаев речь идет о техническом обходе Журнала регистрации или сбоях файловой системы. Использование Версионирования объектов является самым надежным способом защиты от бесследной потери данных в 1С:ERP.