Как исправить битые ссылки (Объект не найден) в закрытом периоде после удаления номенклатуры?

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

Проанализируем ситуацию: из базы 1С были удалены позиции номенклатуры (например, с помощью непосредственного удаления без контроля ссылочной целостности). Бэкапы отсутствуют, а в документах закрытого периода и регистрах вместо нормальных карточек товаров появились битые ссылки вида <Объект не найден> (GUID). При попытке перепровести или изменить такие документы система выдает ошибку, так как период закрыт, а партионный учет может «поехать». Разберем по шагам, как можно грамотно и безопасно решить эту проблему.

Способ 1: Программное воссоздание элемента с тем же УИД (GUID)

Это наиболее безопасный и быстрый метод. Вместо того чтобы пытаться перезаписать старые документы или переносить остатки, мы воссоздадим удаленные элементы справочника с теми же внутренними идентификаторами. Как только в базе появится объект с нужным УИД, все «битые» ссылки во всех закрытых периодах автоматически превратятся в нормальную номенклатуру.

  1. Из битой ссылки <Объект не найден> (12345678-abcd-...) необходимо извлечь уникальный идентификатор.
  2. Далее мы создаем новый элемент справочника Номенклатура.
  3. С помощью метода УстановитьСсылкуНового() мы привязываем извлеченный УИД к создаваемому объекту.

Посмотрим на пример кода, который решает эту задачу:


// Предположим, мы получили УИД битой ссылки в виде строки
СтрокаУИД = "12345678-abcd-1234-abcd-1234567890ab";
НовыйУИД = Новый УникальныйИдентификатор(СтрокаУИД);

// Получаем ссылку с нужным УИД
СсылкаНаВосстанавливаемыйОбъект = Справочники.Номенклатура.ПолучитьСсылку(НовыйУИД);

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

// Самый важный шаг - устанавливаем ссылку до записи
НоваяНоменклатура.УстановитьСсылкуНового(СсылкаНаВосстанавливаемыйОбъект);
НоваяНоменклатура.Записать();

После выполнения этого кода документы закрытого периода снова станут читаемыми, и с остатками можно будет работать (например, списать или перекомплектовать).

Способ 2: Перенос движений с обходом контроля закрытого периода

Если воссоздавать старые элементы по какой-то причине нельзя, и принято решение перенести все обороты с битых ссылок на одну системную позицию, возникает проблема: как заменить номенклатуру в документах и регистрах закрытого периода без перепроведения документов?

Рассмотрим использование свойства ОбменДанными.Загрузка = Истина. При записи наборов записей регистров с этим флагом платформа отключает большинство проверок бизнес-логики, включая контроль закрытого периода.


// Пример замены битой ссылки в наборе записей регистра накопления
НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл
    Если Запись.Номенклатура = БитаяСсылка Тогда
        Запись.Номенклатура = НоваяСистемнаяНоменклатура;
    КонецЕсли;
КонецЦикла;

// Отключаем проверки при записи
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();

Важно: Этот метод следует использовать с большой осторожностью, так как изменение измерений в регистрах без перепроведения может нарушить логику партионного учета или привести к расхождениям между регистрами и документами.

Способ 3: Восстановление данных из файловой базы (Tool_1CD)

Выясним причину, почему данные в файловой базе часто можно спасти даже после Shift+Delete. В файловой архитектуре базы 1Cv8.1CD удаленные записи не стираются физически сразу. Они помечаются как свободное место и остаются в файле до тех пор, пока не будет выполнено Тестирование и исправление (ТИИ) с опцией сжатия таблиц.

Если база файловая, мы можем воспользоваться специализированными утилитами (например, Tool_1CD) для прямого чтения файла базы в обход платформы. Это позволит:

  1. Найти таблицы справочника номенклатуры.
  2. Прочитать текстовые поля удаленных элементов по их GUID.
  3. Узнать точные наименования, артикулы и другие реквизиты, чтобы восстановить карточку товара в ее первозданном виде, а не в виде безымянной заглушки.

Способ 4: Поиск информации в Журнале регистрации

Если прямое чтение файла невозможно (например, база клиент-серверная), проанализируем Журнал регистрации. Даже если бэкапов нет, события удаления могли сохраниться.

Выполните поиск в журнале по УИДу битой ссылки. В представлении объекта часто остается строковое название удаленной номенклатуры. Это самый простой способ идентифицировать удаленный товар перед применением «Способа 1».

Способ 5: Тестирование и исправление (ТИИ)

Платформа 1С имеет штатный механизм решения подобных проблем. Если на копии базы запустить ТИИ с настройкой «При наличии ссылок на несуществующие объекты – Создавать объекты», система сама сгенерирует элементы справочника для всех битых ссылок. Если подобные регламентные операции или тестирование необходимо выполнять регулярно для нескольких информационных баз, этот процесс можно автоматизировать с помощью программы для пакетного обслуживания и тестирования 1С.

Однако у этого метода есть минус: ТИИ может выполняться очень долго на больших базах, а созданные элементы будут иметь технические наименования. После этого все равно придется разбираться, что это за номенклатура, и наводить порядок.

Профилактика: запрет непосредственного удаления

Чтобы подобная ситуация не повторялась, строго рекомендуется отключить право «Интерактивное удаление» для всех ролей в базе, включая профиль Администратора (Полные права). Объекты должны только помечаться на удаление (клавишей Delete). Окончательное физическое удаление должно производиться исключительно через штатную обработку «Удаление помеченных объектов», которая контролирует ссылочную целостность и физически не позволит удалить номенклатуру, если по ней есть движения в регистрах.

← На главную