В процессе эксплуатации конфигурации 1С:Управление торговлей 10.3 или других решений на платформе 1С пользователи и администраторы могут столкнуться с ситуацией, когда в табличных частях документов вместо наименования номенклатуры отображается строка вида <Объект не найден> (76:81284439c454299411e5a5837bef5410). Нередко данная проблема сопровождается сбоем при открытии журнала регистрации: sqlite3_step failed: database disk image is malformed.
Разберем детально, почему возникают подобные нарушения ссылочной целостности, как найти утерянные позиции и восстановить работоспособность базы данных.
Проанализируем основные факторы, приводящие к появлению потерянных ссылок:
ОбъектНоменклатуры.Удалить() удаляет запись из таблицы справочника напрямую, игнорируя проверку ссылочной целостности. В результате все проведенные документы продолжают хранить ссылку на несуществующую запись.ОбменДанными.Загрузка = Истина. В этом режиме платформа отключает контроль ссылочной целостности. Если в пакете обмена не передана сама номенклатура или нарушен алгоритм сопоставления, документ записывается с пустым или фиктивным идентификатором ссылки.1Cv8.lgd.Перед выполнением любых восстановительных операций обязательно зафиксируем состояние базы данных:
1Cv8.1CD и каталог 1Cv8Log в безопасное место).chdbfl.exe, которая находится в каталоге bin установленной платформы 1С:Предприятие. Утилита позволяет устранить повреждения страниц файловой таблицы до запуска конфигуратора.Если при попытке открыть журнал регистрации возникает ошибка database disk image is malformed, значит, файл SQLite 1Cv8.lgd поврежден. Рассмотрим два пути решения проблемы:
1Cv8Log и переименуем файл 1Cv8.lgd (например, в 1Cv8_corrupted.lgd). При следующем запуске платформа 1С автоматически создаст новый чистый файл журнала.sqlite3 для экспорта и повторного импорта дампа:
sqlite3 1Cv8.lgd ".dump" | sqlite3 1Cv8_fixed.lgd
После успешного выполнения команды заменим исходный файл 1Cv8.lgd полученным файлом 1Cv8_fixed.lgd.В строке <Объект не найден> (76:81284439c454299411e5a5837bef5410) содержится внутренний идентификатор ссылки. Разберем способы восстановления элемента:
Способ А. Тестирование и исправление в конфигураторе
Откроем конфигуратор, перейдем в меню Администрирование > Тестирование и исправление..., установим флаг Проверка ссылочной целостности информационной базы, а в блоке переключателей При наличии ссылок на несуществующие объекты выберем вариант Создавать объекты.
В результате платформа автоматически создаст элементы справочника с нужными ссылками. Однако созданные элементы будут абсолютно пустыми (без наименования, артикула, единиц измерения и ставок НДС). Их потребуется идентифицировать и заполнить вручную или программно.
Способ Б. Точечное программное создание объекта с оригинальным GUID
Если из резервной копии базы данных удалось выяснить наименование и реквизиты удаленного товара, восстановим его в рабочей базе программно с сохранением его исходного УникальныйИдентификатор. При этом во всех существующих документах ссылка восстановится автоматически без необходимости их перепроведения:
// Создаем ссылку по известному УИД из резервной копии
ИдентификаторОбъекта = Новый УникальныйИдентификатор("81284439-c454-2994-11e5-a5837bef5410");
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(ИдентификаторОбъекта);
// Создаем и записываем новый элемент с принудительной установкой ссылки
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
НовыйОбъект.Наименование = "Восстановленная позиция номенклатуры";
НовыйОбъект.НаименованиеПолное = "Восстановленная позиция номенклатуры (полное)";
НовыйОбъект.БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796"); // шт
НовыйОбъект.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;
НовыйОбъект.Записать();
Способ В. Перенос элементов через универсальный обмен XML
Развернем архивную копию базы, в которой номенклатура еще присутствовала. С помощью типовой обработки ВыгрузкаЗагрузкаДанныхXML выгрузим только справочник Номенклатура (или конкретные нужные позиции с установленным отбором) и загрузим полученный XML-файл в рабочую базу. Механизм XML-выгрузки сохраняет исходные УникальныйИдентификатор всех объектов, благодаря чему битые ссылки будут полностью закрыты восстановленными данными со всеми реквизитами.