Как удалить документ из журнала в 1С при ошибке «Возможно запись была изменена или удалена!»

Программист IT и автоматизация бизнеса
← На главную

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

Рассмотрим причинно-следственную связь этой ошибки и разберём по шагам эффективные методы её устранения средствами платформы 1С.

Причина возникновения ошибки

Выясним причину такого поведения системы. При вызове процедур пометки на удаление или непосредственного удаления платформой 1С используется механизм оптимистической блокировки. В основной таблице объекта в базе данных хранится специальное служебное поле — версия объекта (счётчик изменений).

Когда вы пытаетесь записать или удалить документ, платформа сравнивает версию объекта в памяти сеанса с версией записи в таблице СУБД. Если запись в основной таблице документов физически отсутствует (при этом ссылка на неё осталась в журнале или регистрах) либо повреждена, платформа не может сопоставить версии и блокирует операцию.

Решение 1. Тестирование и исправление информационной базы (ТИИ)

Первый и наиболее безопасный метод решения проблемы — использование штатного сервиса платформы «Тестирование и исправление информационной базы».

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

В результате процедура ТИИ либо восстановит целостность основной таблицы документа, либо очистит осиротевшие ссылки из журналов и регистров.

Решение 2. Программное воссоздание записи по GUID с последующим удалением

Если ТИИ не применимо или не решило проблему, разберём программный способ восстановления целостности объекта. Идея состоит в том, чтобы программно создать полноценную запись в базе данных с тем же уникальным идентификатором (GUID), после чего удалить документ в штатном режиме.

Проанализируем пример кода обработки, выполняющей восстановление и удаление:


// 1. Получаем уникальный идентификатор "битого" документа
GUIDОбъекта = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); // Укажите реальный GUID ссылки

// 2. Формируем ссылку на документ нужного типа
СсылкаНаДокумент = Документы.ИмяВашегоДокумента.ПолучитьСсылку(GUIDОбъекта);

// 3. Создаем новый объект документа и связываем его с имеющейся ссылкой
НовыйДокумент = Документы.ИмяВашегоДокумента.СоздатьДокумент();
НовыйДокумент.УстановитьСсылкуНового(СсылкаНаДокумент);

// 4. Отключаем обработчики событий через режим загрузки данных
НовыйДокумент.ОбменДанными.Загрузка = Истина;

// 5. Записываем объект в базу для создания физической записи и инициализации версии
НовыйДокумент.Записать();

// 6. Удаляем объект непосредственно
НовыйДокумент.Удалить();

Установка свойства ОбменДанными.Загрузка = Истина позволяет обойти проверки в модуле объекта и подписки на события при вызове метода Записать(). После записи в таблице СУБД появляется корректное значение поля версии, что позволяет успешно выполнить метод Удалить().

Решение 3. Очистка кэша и завершение фоновых сеансов

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

  1. Завершим все сеансы работы пользователей с информационной базой через консоль кластера 1С.
  2. Очистим локальный кэш на рабочем компьютере, удалив папку информационной базы из каталогов %AppData%\1C\1cv8\ и %LocalAppData%\1C\1cv8\.
  3. Перезапустим службу сервера 1С:Предприятия для сброса внутренних серверных блокировок.
  4. Повторим попытку непосредственного удаления объекта через сервис УдалитьОбъекты().

Использование описанных подходов позволяет восстановить структуру данных 1С и полностью удалить некорректные записи из журналов без прямого вмешательства в таблицы СУБД на уровне SQL.

← На главную