В процессе сопровождения и администрирования баз данных «1С:Предприятие 8» технические специалисты и бухгалтеры часто сталкиваются со странным поведением отчетов: в Оборотно-сальдовой ведомости (ОСВ) по определенному счету отображаются обороты или остатки с субконто вида «Объект не найден...» (битая ссылка с длинным GUID), но при попытке расшифровать эту строку и открыть Карточку счета система показывает абсолютно пустой отчет без каких-либо движений. Ситуация осложняется тем, что база данных может быть огромного объема, период закрыт для редактирования, а полный пересчет итогов через Конфигуратор запустить невозможно из-за высоких рисков повреждения данных или критического времени простоя системы.
В данной статье мы подробно проанализируем, почему возникает этот технический сбой, разберем архитектурные особенности хранения данных в СУБД под управлением платформы «1С:Предприятие» и изучим пошаговые методы точечного решения проблемы без выполнения глобального пересчета итогов всей информационной базы.
Для того чтобы эффективно устранить проблему, нам необходимо понять физическую суть происходящего в базе данных. Оборотно-сальдовая ведомость и Карточка счета — это два принципиально разных отчета с точки зрения получения данных из СУБД:
_AccRgTotals). Платформа хранит в ней уже готовые, предварительно агрегированные суммы по месяцам в разрезе счетов и субконто._AccRg). Она последовательно выбирает физические записи регистра за указанный период, чтобы показать детальную хронологию операций.Если в базе данных происходит сбой (например, аварийное завершение процесса сервера СУБД во время записи транзакции, некорректная работа распределенной информационной базы (РИБ) при обмене данными или грубое программное удаление объектов без контроля ссылочной целостности через ОбменДанными.Загрузка = Истина), возникает рассинхронизация таблиц. В таблице движений проводка физически стерлась или изменилась, а в таблице итогов осталась «фантомная» запись, ссылающаяся на удаленный объект (битый GUID). В результате в ОСВ мы видим остаток по несуществующему объекту, а в Карточке счета движений нет, так как реальные проводки в таблице регистрации отсутствуют.
Прежде чем приступать к программным методам исправления, необходимо проверить, действительно ли ссылка является физически битой. Иногда надпись «Объект не найден (84:bf56...)» отображается у пользователей с ограниченными правами доступа, если в базе активирован механизм RLS (Record Level Security).
Проанализируем ситуацию: если у пользователя нет прав на чтение конкретной организации, контрагента или договора, платформа скрывает от него наименование объекта, заменяя его системной строкой «Объект не найден». При этом в Карточке счета движения также могут скрываться из-за жестких настроек прав.
Что нужно сделать: запустите сеанс «1С:Предприятие» под учетной записью администратора с абсолютно полными правами (где RLS гарантированно отключен) и сформируйте ОСВ заново. Если под администратором вместо битой ссылки отображается реальное название элемента справочника или документа, то база данных физически цела, и проблему следует решать исключительно корректировкой ролей и профилей групп доступа.
Если под полными правами надпись «Объект не найден» сохраняется, нам необходимо локализовать ошибку: выяснить, в каком именно субконто завис фантомный остаток и к какому типу метаданных (справочнику или документу) он изначально принадлежал. Для этого воспользуемся внешней обработкой «Консоль запросов».
Рассмотрим пример запроса к виртуальной таблице остатков регистра бухгалтерии (например, Хозрасчетный) для поиска записей с незаполненными, но физически существующими ссылками в субконто:
ВЫБРАТЬ
ХозрасчетныйОстатки.Счет КАК Счет,
ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
ХозрасчетныйОстатки.Субконто2 КАК Субконто2,
ХозрасчетныйОстатки.Субконто3 КАК Субконто3,
ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &НужныйСчет, , ) КАК ХозрасчетныйОстатки
ГДЕ
(ХозрасчетныйОстатки.Субконто1.Наименование ЕСТЬ NULL И НЕ ХозрасчетныйОстатки.Субконто1 ЕСТЬ NULL)
ИЛИ (ХозрасчетныйОстатки.Субконто2.Наименование ЕСТЬ NULL И НЕ ХозрасчетныйОстатки.Субконто2 ЕСТЬ NULL)
ИЛИ (ХозрасчетныйОстатки.Субконто3.Наименование ЕСТЬ NULL И НЕ ХозрасчетныйОстатки.Субконто3 ЕСТЬ NULL)
Выполнив этот запрос, мы получим точную информацию о том, какое из субконто содержит битую ссылку. В поле типа субконто будет указана конкретная таблица (например, Справочник.Контрагенты или Справочник.ДоговорыКонтрагентов), а также уникальный идентификатор (GUID) удаленного элемента.
Рассмотрим наиболее безопасные и эффективные варианты устранения битых ссылок без выполнения полного пересчета итогов всей информационной базы.
Этот метод является самым экологичным для базы данных, так как мы не вмешиваемся в механизмы итогов напрямую, а лишь восстанавливаем ссылочную целостность справочника. Зная точный GUID удаленного объекта (его можно скопировать из текста ошибки в ОСВ или получить из результата нашего запроса), мы можем принудительно создать новый элемент справочника с этим идентификатором.
Для этого воспользуемся программным кодом во внешней обработке:
// Укажите тип справочника и GUID битой ссылки
ИмяСправочника = "Контрагенты";
СтрокаGUID = "84bf5600-145e-3710-ab11-dda4c605dbe8"; // Пример вашего GUID
УникальныйИд = Новый УникальныйИдентификатор(СтрокаGUID);
НоваяСсылка = Справочники[ИмяСправочника].ПолучитьСсылка(УникальныйИд);
// Проверим, действительно ли объект отсутствует в базе
НайденныйОбъект = НоваяСсылка.ПолучитьОбъект();
Если НайденныйОбъект = Неопределено Тогда
НовыйЭлемент = Справочники[ИмяСправочника].СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);
НовыйЭлемент.Наименование = "_Восстановленный объект (заглушка)";
// При необходимости заполняем другие обязательные реквизиты
НовыйЭлемент.Записать();
Сообщить("Элемент успешно воссоздан с исходным GUID!");
Иначе
Сообщить("Объект с данным GUID уже существует в базе данных!");
КонецЕсли;
После выполнения данного кода надпись «Объект не найден» в ОСВ автоматически изменится на «_Восстановленный объект (заглушка)». Теперь вы можете запустить стандартную обработку «Поиск и замена дублей», объединить этот фантомный объект с актуальным живым элементом справочника, перенеся на него все обороты, а затем безопасно пометить заглушку на удаление.
Если фантомный остаток в ОСВ вызван исключительно логическим сбоем механизма хранения итогов и физических проводок по этой операции действительно никогда не существовало, нам необходимо заставить платформу обновить таблицу _AccRgTotals. Полное тестирование и исправление (ТИИ) делать не нужно. Мы можем выполнить выборочный пересчет только для регистра бухгалтерии.
Пошаговый алгоритм действий:
Хозрасчетный).Если период давно и жестко закрыт, сдана отчетность, а любые манипуляции с итогами вызывают опасения у главного бухгалтера, мы можем скорректировать остаток текущим периодом:
000) или счет прочих доходов и расходов (91.02), предварительно согласовав это с методологами учета.Мы проанализировали специфику возникновения битых ссылок в отчетах 1С и рассмотрели точечные инструменты борьбы с ними. Главное правило при устранении подобных неполадок — всегда предварительно тестировать решения на копии базы данных. Проиграйте сценарий восстановления GUID или выборочного пересчета итогов на копии, убедитесь, что ОСВ и Карточка счета пришли в полное соответствие, и только после успешной проверки переносите изменения в рабочую базу данных.