В процессе работы с базами данных 1С (особенно после сбоев сети, нештатного завершения сеансов или частичного удаления записей) может возникнуть ситуация, когда в журнале документов остаётся «битая» ссылка. Такой документ не имеет номера, заполнен лишь частично и при попытке непосредственного удаления выдаёт ошибку: «Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно запись была изменена или удалена!)».
Рассмотрим причинно-следственную связь этой ошибки и разберём по шагам эффективные методы её устранения средствами платформы 1С.
Выясним причину такого поведения системы. При вызове процедур пометки на удаление или непосредственного удаления платформой 1С используется механизм оптимистической блокировки. В основной таблице объекта в базе данных хранится специальное служебное поле — версия объекта (счётчик изменений).
Когда вы пытаетесь записать или удалить документ, платформа сравнивает версию объекта в памяти сеанса с версией записи в таблице СУБД. Если запись в основной таблице документов физически отсутствует (при этом ссылка на неё осталась в журнале или регистрах) либо повреждена, платформа не может сопоставить версии и блокирует операцию.
Первый и наиболее безопасный метод решения проблемы — использование штатного сервиса платформы «Тестирование и исправление информационной базы».
В результате процедура ТИИ либо восстановит целостность основной таблицы документа, либо очистит осиротевшие ссылки из журналов и регистров.
Если ТИИ не применимо или не решило проблему, разберём программный способ восстановления целостности объекта. Идея состоит в том, чтобы программно создать полноценную запись в базе данных с тем же уникальным идентификатором (GUID), после чего удалить документ в штатном режиме.
Проанализируем пример кода обработки, выполняющей восстановление и удаление:
// 1. Получаем уникальный идентификатор "битого" документа
GUIDОбъекта = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); // Укажите реальный GUID ссылки
// 2. Формируем ссылку на документ нужного типа
СсылкаНаДокумент = Документы.ИмяВашегоДокумента.ПолучитьСсылку(GUIDОбъекта);
// 3. Создаем новый объект документа и связываем его с имеющейся ссылкой
НовыйДокумент = Документы.ИмяВашегоДокумента.СоздатьДокумент();
НовыйДокумент.УстановитьСсылкуНового(СсылкаНаДокумент);
// 4. Отключаем обработчики событий через режим загрузки данных
НовыйДокумент.ОбменДанными.Загрузка = Истина;
// 5. Записываем объект в базу для создания физической записи и инициализации версии
НовыйДокумент.Записать();
// 6. Удаляем объект непосредственно
НовыйДокумент.Удалить();
Установка свойства ОбменДанными.Загрузка = Истина позволяет обойти проверки в модуле объекта и подписки на события при вызове метода Записать(). После записи в таблице СУБД появляется корректное значение поля версии, что позволяет успешно выполнить метод Удалить().
Иногда ошибка несоответствия версий вызывается рассинхронизацией кэша клиентского приложения 1С или зависшей фоновой сессией. Посмотрим на последовательность действий для исключения кэширования:
%AppData%\1C\1cv8\ и %LocalAppData%\1C\1cv8\.УдалитьОбъекты().Использование описанных подходов позволяет восстановить структуру данных 1С и полностью удалить некорректные записи из журналов без прямого вмешательства в таблицы СУБД на уровне SQL.