Проанализируем ситуацию: из базы 1С были удалены позиции номенклатуры (например, с помощью непосредственного удаления без контроля ссылочной целостности). Бэкапы отсутствуют, а в документах закрытого периода и регистрах вместо нормальных карточек товаров появились битые ссылки вида <Объект не найден> (GUID). При попытке перепровести или изменить такие документы система выдает ошибку, так как период закрыт, а партионный учет может «поехать». Разберем по шагам, как можно грамотно и безопасно решить эту проблему.
Это наиболее безопасный и быстрый метод. Вместо того чтобы пытаться перезаписать старые документы или переносить остатки, мы воссоздадим удаленные элементы справочника с теми же внутренними идентификаторами. Как только в базе появится объект с нужным УИД, все «битые» ссылки во всех закрытых периодах автоматически превратятся в нормальную номенклатуру.
<Объект не найден> (12345678-abcd-...) необходимо извлечь уникальный идентификатор.Номенклатура.УстановитьСсылкуНового() мы привязываем извлеченный УИД к создаваемому объекту.Посмотрим на пример кода, который решает эту задачу:
// Предположим, мы получили УИД битой ссылки в виде строки
СтрокаУИД = "12345678-abcd-1234-abcd-1234567890ab";
НовыйУИД = Новый УникальныйИдентификатор(СтрокаУИД);
// Получаем ссылку с нужным УИД
СсылкаНаВосстанавливаемыйОбъект = Справочники.Номенклатура.ПолучитьСсылку(НовыйУИД);
// Создаем новый элемент
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = "Восстановленная номенклатура (заглушка)";
// Заполняем остальные обязательные реквизиты (ставка НДС, единица измерения и т.д.)
// Самый важный шаг - устанавливаем ссылку до записи
НоваяНоменклатура.УстановитьСсылкуНового(СсылкаНаВосстанавливаемыйОбъект);
НоваяНоменклатура.Записать();
После выполнения этого кода документы закрытого периода снова станут читаемыми, и с остатками можно будет работать (например, списать или перекомплектовать).
Если воссоздавать старые элементы по какой-то причине нельзя, и принято решение перенести все обороты с битых ссылок на одну системную позицию, возникает проблема: как заменить номенклатуру в документах и регистрах закрытого периода без перепроведения документов?
Рассмотрим использование свойства ОбменДанными.Загрузка = Истина. При записи наборов записей регистров с этим флагом платформа отключает большинство проверок бизнес-логики, включая контроль закрытого периода.
// Пример замены битой ссылки в наборе записей регистра накопления
НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
Если Запись.Номенклатура = БитаяСсылка Тогда
Запись.Номенклатура = НоваяСистемнаяНоменклатура;
КонецЕсли;
КонецЦикла;
// Отключаем проверки при записи
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
Важно: Этот метод следует использовать с большой осторожностью, так как изменение измерений в регистрах без перепроведения может нарушить логику партионного учета или привести к расхождениям между регистрами и документами.
Выясним причину, почему данные в файловой базе часто можно спасти даже после Shift+Delete. В файловой архитектуре базы 1Cv8.1CD удаленные записи не стираются физически сразу. Они помечаются как свободное место и остаются в файле до тех пор, пока не будет выполнено Тестирование и исправление (ТИИ) с опцией сжатия таблиц.
Если база файловая, мы можем воспользоваться специализированными утилитами (например, Tool_1CD) для прямого чтения файла базы в обход платформы. Это позволит:
Если прямое чтение файла невозможно (например, база клиент-серверная), проанализируем Журнал регистрации. Даже если бэкапов нет, события удаления могли сохраниться.
Выполните поиск в журнале по УИДу битой ссылки. В представлении объекта часто остается строковое название удаленной номенклатуры. Это самый простой способ идентифицировать удаленный товар перед применением «Способа 1».
Платформа 1С имеет штатный механизм решения подобных проблем. Если на копии базы запустить ТИИ с настройкой «При наличии ссылок на несуществующие объекты – Создавать объекты», система сама сгенерирует элементы справочника для всех битых ссылок. Если подобные регламентные операции или тестирование необходимо выполнять регулярно для нескольких информационных баз, этот процесс можно автоматизировать с помощью программы для пакетного обслуживания и тестирования 1С.
Однако у этого метода есть минус: ТИИ может выполняться очень долго на больших базах, а созданные элементы будут иметь технические наименования. После этого все равно придется разбираться, что это за номенклатура, и наводить порядок.
Чтобы подобная ситуация не повторялась, строго рекомендуется отключить право «Интерактивное удаление» для всех ролей в базе, включая профиль Администратора (Полные права). Объекты должны только помечаться на удаление (клавишей Delete). Окончательное физическое удаление должно производиться исключительно через штатную обработку «Удаление помеченных объектов», которая контролирует ссылочную целостность и физически не позволит удалить номенклатуру, если по ней есть движения в регистрах.