Как исправить битые ссылки Объект не найден в номенклатуре и восстановить журнал регистрации в 1С

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе эксплуатации конфигурации 1С:Управление торговлей 10.3 или других решений на платформе 1С пользователи и администраторы могут столкнуться с ситуацией, когда в табличных частях документов вместо наименования номенклатуры отображается строка вида <Объект не найден> (76:81284439c454299411e5a5837bef5410). Нередко данная проблема сопровождается сбоем при открытии журнала регистрации: sqlite3_step failed: database disk image is malformed.

Разберем детально, почему возникают подобные нарушения ссылочной целостности, как найти утерянные позиции и восстановить работоспособность базы данных.

Причины появления битых ссылок в базе данных

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

  1. Непосредственное интерактивное или программное удаление. Если у пользователей или внешних обработок есть административные права, вызов метода ОбъектНоменклатуры.Удалить() удаляет запись из таблицы справочника напрямую, игнорируя проверку ссылочной целостности. В результате все проведенные документы продолжают хранить ссылку на несуществующую запись.
  2. Особенности работы механизмов обмена данными. При интеграции с сайтами (например, на CMS 1С-Битрикс) или другими информационными базами запись документов часто происходит с установленным флагом ОбменДанными.Загрузка = Истина. В этом режиме платформа отключает контроль ссылочной целостности. Если в пакете обмена не передана сама номенклатура или нарушен алгоритм сопоставления, документ записывается с пустым или фиктивным идентификатором ссылки.
  3. Сбои файловой структуры 1CD и журнала регистрации. В файловых информационных базах при многопользовательском доступе по локальной сети, внезапных отключениях электропитания или сетевых сбоях могут повреждаться внутренние таблицы. Это приводит как к потере строк метаданных, так и к повреждению файла журнала регистрации 1Cv8.lgd.

Шаг 1. Создание резервной копии и проверка целостности базы

Перед выполнением любых восстановительных операций обязательно зафиксируем состояние базы данных:

  1. Создадим полную копию каталога информационной базы (скопируем файл 1Cv8.1CD и каталог 1Cv8Log в безопасное место).
  2. Запустим утилиту проверки физической целостности chdbfl.exe, которая находится в каталоге bin установленной платформы 1С:Предприятие. Утилита позволяет устранить повреждения страниц файловой таблицы до запуска конфигуратора.

Шаг 2. Восстановление журнала регистрации SQLite

Если при попытке открыть журнал регистрации возникает ошибка database disk image is malformed, значит, файл SQLite 1Cv8.lgd поврежден. Рассмотрим два пути решения проблемы:

  1. Быстрый сброс журнала. Если история действий пользователей не критична, завершим все сеансы работы с 1С, перейдем в папку базы данных в каталог 1Cv8Log и переименуем файл 1Cv8.lgd (например, в 1Cv8_corrupted.lgd). При следующем запуске платформа 1С автоматически создаст новый чистый файл журнала.
  2. Восстановление данных через утилиту SQLite. Если журнал необходимо сохранить, воспользуемся консольной утилитой sqlite3 для экспорта и повторного импорта дампа: sqlite3 1Cv8.lgd ".dump" | sqlite3 1Cv8_fixed.lgd После успешного выполнения команды заменим исходный файл 1Cv8.lgd полученным файлом 1Cv8_fixed.lgd.

Шаг 3. Восстановление удаленной номенклатуры по уникальному идентификатору

В строке <Объект не найден> (76:81284439c454299411e5a5837bef5410) содержится внутренний идентификатор ссылки. Разберем способы восстановления элемента:

Способ А. Тестирование и исправление в конфигураторе

Откроем конфигуратор, перейдем в меню Администрирование > Тестирование и исправление..., установим флаг Проверка ссылочной целостности информационной базы, а в блоке переключателей При наличии ссылок на несуществующие объекты выберем вариант Создавать объекты.

В результате платформа автоматически создаст элементы справочника с нужными ссылками. Однако созданные элементы будут абсолютно пустыми (без наименования, артикула, единиц измерения и ставок НДС). Их потребуется идентифицировать и заполнить вручную или программно.

Способ Б. Точечное программное создание объекта с оригинальным GUID

Если из резервной копии базы данных удалось выяснить наименование и реквизиты удаленного товара, восстановим его в рабочей базе программно с сохранением его исходного УникальныйИдентификатор. При этом во всех существующих документах ссылка восстановится автоматически без необходимости их перепроведения:


// Создаем ссылку по известному УИД из резервной копии
ИдентификаторОбъекта = Новый УникальныйИдентификатор("81284439-c454-2994-11e5-a5837bef5410");
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(ИдентификаторОбъекта);

// Создаем и записываем новый элемент с принудительной установкой ссылки
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);

НовыйОбъект.Наименование = "Восстановленная позиция номенклатуры";
НовыйОбъект.НаименованиеПолное = "Восстановленная позиция номенклатуры (полное)";
НовыйОбъект.БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796"); // шт
НовыйОбъект.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;

НовыйОбъект.Записать();

Способ В. Перенос элементов через универсальный обмен XML

Развернем архивную копию базы, в которой номенклатура еще присутствовала. С помощью типовой обработки ВыгрузкаЗагрузкаДанныхXML выгрузим только справочник Номенклатура (или конкретные нужные позиции с установленным отбором) и загрузим полученный XML-файл в рабочую базу. Механизм XML-выгрузки сохраняет исходные УникальныйИдентификатор всех объектов, благодаря чему битые ссылки будут полностью закрыты восстановленными данными со всеми реквизитами.

← На главную