Как убрать «битую» ссылку в журнале документов 1С, если сам документ уже удален?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Почему ссылка остается в журнале, если документ удален?

Для начала проанализируем техническую сторону вопроса. Вопреки распространенному мнению, журнал документов в 1С — это не просто виртуальное представление (вьюха), собирающее данные из разных таблиц в реальном времени. На уровне СУБД (SQL Server, PostgreSQL и др.) журнал документов представляет собой отдельную физическую таблицу (обычно она имеет префикс _DocumentJournal).

Платформа 1С дублирует в эту таблицу ключевые данные из всех документов, входящих в журнал: дату, номер, тип документа, пометку удаления, состояние проведения и значения общих реквизитов. Это сделано для обеспечения высокой скорости работы: системе проще прочитать одну плоскую таблицу, чем выполнять тяжелое соединение (JOIN) десятков таблиц разных видов документов.

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

  1. Сбои транзакций: если в момент удаления документа произошел обрыв соединения с сервером БД или принудительное завершение процесса rphost, основная транзакция могла зафиксироваться частично.
  2. Прямые SQL-запросы: если кто-то из администраторов удалял данные напрямую через DELETE в консоли SQL, механизмы платформы 1С не смогли отработать очистку связанных таблиц.
  3. Ошибки обмена данными: при некорректной работе РИБ (распределенных информационных баз) или универсального обмена в базу могут «прилететь» записи журналов без самих объектов.

Разберем способы решения этой проблемы по шагам.

Способ 1. Тестирование и исправление ссылочной целостности

Первым делом рассмотрим стандартный механизм платформы. Если мы обнаружили «битую» ссылку, необходимо запустить процедуру Тестирование и исправление.

Выполним следующие действия:

  1. Создадим резервную копию базы данных (обязательно!).
  2. Зайдем в Конфигуратор — Администрирование — Тестирование и исправление...
  3. Установим флаг «Проверка ссылочной целостности».
  4. В переключателях при наличии ссылок на несуществующие объекты выберем «Очищать ссылки» или «Удалять объект» (в данном контексте это поможет очистить запись в журнале).

Этот метод эффективен, но на больших базах данных он может занимать часы или даже сутки, так как платформа будет проверять абсолютно все ссылки в системе. Если время ограничено, перейдем к более быстрым методам.

Способ 2. Принудительная реструктуризация таблицы журнала

Рассмотрим метод, который помог автору обсуждаемой темы. Суть заключается в том, чтобы заставить платформу 1С полностью пересоздать физическую таблицу журнала в базе данных. Когда структура таблицы меняется, 1С выгружает из нее данные, пересоздает схему и загружает данные обратно, основываясь на актуальных объектах документов.

Алгоритм действий:

  1. В конфигураторе найдем «проблемный» журнал документов.
  2. Перейдем на закладку «Данные».
  3. Добавим в состав журнала какой-нибудь новый реквизит или (что проще) изменим свойство Индексирование у одного из существующих дополнительных реквизитов (например, установим «Индексировать»).
  4. Выполним обновление конфигурации базы данных (клавиша F7).

Во время обновления произойдет реструктуризация таблицы _DocumentJournal. Поскольку физически документа-источника нет, при заполнении новой таблицы «фантомная» запись просто не будет создана. После этого изменения в конфигураторе можно откатить назад — лишний индекс нам не нужен, а таблица уже будет «чистой».

Способ 3. Создание и удаление «объекта-дубля»

Проанализируем еще один интересный подход: попробовать «обмануть» систему, создав объект с тем же идентификатором GUID, который застрял в журнале.

Сначала нам нужно выяснить UUID битой ссылки. Это можно сделать программно или через навигационную ссылку. Рассмотрим пример кода, который поможет создать документ с конкретным идентификатором:


// Предположим, мы узнали UUID битой ссылки
НужныйИдентификатор = Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000");
ТипДокумента = Документы.РеализацияТоваровУслуг; // Замените на ваш тип

// Попробуем создать объект с этим GUID
НовыйДокумент = ТипДокумента.СоздатьДокумент();
НовыйДокумент.УстановитьСсылкуНового(ТипДокумента.ПолучитьСсылку(НужныйИдентификатор));
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Записать();

// Теперь, когда объект физически существует и связан с журналом, удаляем его окончательно
НовыйДокумент.Удалить();

Важное замечание: как отметил автор темы, этот способ может не сработать и выдать «Ошибку индекса». Это происходит потому, что в таблице журнала запись с таким GUID уже существует в виде «мусора», и при попытке записи нового документа система пытается вставить в индекс журнала дублирующее значение. Если вы столкнулись с такой ошибкой, используйте Способ 2 (реструктуризацию).

Способ 4. Проверка утилитой ChDBFL (для файловых баз)

Если ваша база работает в файловом варианте, причиной проблемы может быть повреждение внутреннего индекса файла .1CD. В этом случае стандартные средства конфигуратора могут не видеть проблему на логическом уровне.

Проанализируем шаги по исправлению файла:

  1. Завершим работу всех пользователей.
  2. Найдем в папке установки платформы (обычно C:\Program Files\1cv8\номер_версии\bin) утилиту chdbfl.exe.
  3. Запустим её, выберем файл базы данных и установим флаг «Исправлять обнаруженные ошибки».

Утилита проверит физическую целостность таблиц и перестроит индексы, что часто помогает избавиться от «фантомов» в журналах.

Выясним причину через SQL (для клиент-серверного варианта)

Если у вас есть доступ к SQL-серверу, мы можем убедиться, что проблема именно в журнале. Выполним простой запрос (на примере MS SQL Server):


-- Поиск записи в таблице журнала по представлению ссылки
SELECT * FROM _DocumentJournalXXX 
WHERE _DocumentJournalXXX._DocumentTRef = 0x... -- Здесь код типа документа
AND _DocumentJournalXXX._DocumentRRef = 0x... -- Здесь идентификатор объекта

Если запрос возвращает строку, а аналогичный запрос к основной таблице документа _DocumentYYY ничего не находит — мы имеем дело с классической рассинхронизацией. В этом случае самым безопасным и правильным методом для программиста 1С будет именно Способ 2 (изменение структуры журнала в конфигураторе), так как он задействует штатные механизмы платформы для исправления ситуации.

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

← На главную