Как восстановить битые ссылки на номенклатуру в документах после сбоя базы и работы chdbfl.exe

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

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

Анализируем причину проблемы: почему «пропала» номенклатура?

Разберем ситуацию глубже. Когда мы запускаем chdbfl.exe, утилита проверяет физическую структуру таблиц. Если она находит запись в таблице документов, которая ссылается на несуществующую запись в таблице справочника номенклатуры, она может либо оставить ссылку «как есть» (битая ссылка), либо «вылечить» файл, удалив поврежденные записи.

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

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

Шаг 1. Получение уникального идентификатора (GUID) битой ссылки

Прежде чем приступать к восстановлению, нам нужно понять, «что именно» ищет документ. Если в поле номенклатуры мы видим <Объект не найден> (84:b1ea00055d4b0a0211e289094770678d), то цифры и буквы в скобках — это и есть ключ к спасению. Это внутренний идентификатор в шестнадцатеричном формате.

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


// Пример получения GUID из битой ссылки, выбранной в документе
СсылкаНаБитыйОбъект = ДокументОбъект.Товары[0].Номенклатура; 
Если СсылкаНаБитыйОбъект.ПолучитьОбъект() = Неопределено Тогда
    НужныйGUID = СсылкаНаБитыйОбъект.УникальныйИдентификатор();
    Сообщить("Идентификатор для восстановления: " + НужныйGUID);
КонецЕсли;

Если же у вас есть доступ к архивной копии, где эта номенклатура еще «жива», мы можем программно получить GUID прямо оттуда. Это самый надежный метод, так как он гарантирует 100% совпадение ссылок.

Шаг 2. Программное восстановление объекта с нужным GUID

Основная ошибка многих пользователей — создание нового элемента справочника вручную через интерфейс. При обычном создании система генерирует новый случайный GUID, который никогда не совпадет со старым. Чтобы «подклеить» номенклатуру к старым документам, мы должны использовать метод УстановитьСсылкуНового().

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


// Предположим, мы получили GUID из бэкапа или из текста ошибки
Тек GUIDСтрокой = "11e28909-4770-678d-84b1-ea00055d4b02"; // пример формата
НужныйGUID = Новый УникальныйИдентификатор(ТекGUIDСтрокой);

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

// Самый важный момент: привязываем будущую запись к конкретному GUID
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(НужныйGUID);
НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);

// Заполняем остальные реквизиты, чтобы карточка не была пустой
НовыйЭлемент.Наименование = "Восстановленная номенклатура (проверить данные!)";
// Здесь можно заполнить Артикул, Единицу измерения и прочее из бэкапа

Попытка
    НовыйЭлемент.Записать();
    Сообщить("Объект успешно восстановлен с сохранением ссылки!");
Исключение
    Сообщить("Ошибка записи: " + ОписаниеОшибки());
КонецПопытки;

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

Шаг 3. Использование штатного «Тестирования и исправления»

Если объектов пропало много и вы не хотите восстанавливать каждый программно, можно воспользоваться встроенным механизмом 1С. Рассмотрим, как это сделать правильно:

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

Что произойдет? Система сама найдет все битые ссылки и создаст в справочнике Номенклатура пустые элементы с названиями типа «Объект восстановлен...». Вам останется только зайти в эти карточки и заполнить их актуальными данными (наименование, счета учета, ставки НДС), ориентируясь на архивную копию базы.

Почему не стоит массово перегружать документы?

Часто звучит совет: «Просто выгрузите документы из бэкапа и загрузите в рабочую базу». Рассмотрим, почему это может быть опасно:

Вывод: Лучшая стратегия — это восстановление именно справочника Номенклатура с сохранением GUID. Это «точечное» вмешательство, которое не затрагивает логику проведения документов и позволяет сохранить все данные учета в целостности.

Резюме и рекомендации

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

  1. Проверьте, остались ли ссылки в документах (красные строки) или они очистились полностью (пустые поля).
  2. Если ссылки остались — восстановите объекты программно через УстановитьСсылкуНового(), взяв идентификаторы из битых ссылок или бэкапа.
  3. Если ссылок много — используйте «Тестирование и исправление» в режиме создания объектов.
  4. Никогда не выполняйте «Очистку ссылок» в ТиИ, если не уверены, что эти данные вам больше не понадобятся.

Помните, что регулярное создание резервных копий — это единственный способ гарантированно избежать потери данных. В случае сбоя всегда начинайте восстановление на копии базы, чтобы отработать алгоритм и не усугубить ситуацию в рабочей среде.

← На главную