Каждый администратор и продвинутый пользователь платформы 1С рано или поздно сталкивается с ситуацией, когда в документе вместо понятного значения (например, договора, контрагента или номенклатуры) отображается загадочная надпись: «<Объект не найден>», сопровождаемая длинным набором цифр и букв в скобках. В профессиональной среде разработчиков это явление называют «битой ссылкой».
Давайте подробно разберем, почему возникает эта ошибка, как расшифровать системную информацию внутри битой ссылки, какими способами можно восстановить утерянные данные и как сделать это максимально безопасно для информационной базы, особенно если речь идет о закрытых периодах прошлых лет.
Для того чтобы эффективно бороться с проблемой, нам необходимо понять физическую суть её возникновения. В платформе 1С все ссылки на элементы справочников и документы хранятся в виде уникальных 128-битных идентификаторов — GUID (Globally Unique Identifier). Когда один объект (например, документ «Реализация товаров и услуг») ссылается на другой (например, справочник ДоговорыКонтрагентов), в таблице базы данных записывается именно этот GUID.
Надпись «<Объект не найден>» появляется тогда, когда в базе данных есть ссылка (GUID), но самого объекта с таким уникальным идентификатором в целевой таблице физически не существует. Проанализируем основные причины, приводящие к этому состоянию:
Давайте пошагово разберем методы диагностики и исправления этой ошибки, двигаясь от простых к более сложным техническим инструментам.
Прежде чем приступать к операциям восстановления базы данных, необходимо убедиться, что объект действительно удален, а не скрыт настройками прав доступа. Для этого выполним простую проверку:
ПолныеПрава).Если объект был удален недавно, мы можем легко выяснить, кто это сделал и как этот объект назывался изначально. Для этого воспользуемся штатным механизмом платформы:
Справочник.ДоговорыКонтрагентов.В случае успеха в журнале отобразится запись, где будет указан автор удаления, точное время, а также представление удаленного объекта (например, «Договор №125 от 15.03.2017»). Это поможет нам восстановить текстовые данные по бумажным архивам.
Если журнал регистрации очищен или база восстанавливалась из бэкапа, информацию о договоре придется собирать по крупицам. Обратим внимание на саму битую ссылку. Она выглядит примерно так:
<Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824)
Давайте разберем техническую структуру этой строки. В скобках содержится уникальная информация:
Для того чтобы превратить этот внутренний набор символов в стандартный формат GUID, который понимает платформа 1С при программном обращении, нам нужно перегруппировать байты. Стандартный GUID имеет структуру из пяти групп: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
Давайте посмотрим на алгоритм перевода. Строку bf5600145e3710ab11dda4c605dbe824 длиной 32 символа мы разбиваем на группы и переворачиваем их задом наперед по определенному правилу платформы. В результате несложных манипуляций мы получаем канонический GUID: 05dbe824-a4c6-11dd-bf56-00145e3710ab.
Для продвинутых пользователей и разработчиков приведем пример функции на встроенном языке 1С, которая автоматически выполняет это преобразование:
Функция ПолучитьКаноническийGUID(СтрокаБитойСсылки)
// Находим двоеточие в строке вида "<Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824)"
ПозДвоеточия = Найти(СтрокаБитойСсылки, ":");
Если ПозДвоеточия = 0 Тогда
Возврат "";
КонецЕсли;
// Извлекаем только 32 символа шестнадцатеричного представления
СтрокаИд = Сред(СтрокаБитойСсылки, ПозДвоеточия + 1, 32);
// Перегруппировываем байты в соответствии с внутренним представлением 1С
Группа1 = Сред(СтрокаИд, 25, 8);
Группа2 = Сред(СтрокаИд, 21, 4);
Группа3 = Сред(СтрокаИд, 17, 4);
Группа4 = Сред(СтрокаИд, 1, 4);
Группа5 = Сред(СтрокаИд, 5, 12);
Возврат Группа1 + "-" + Группа2 + "-" + Группа3 + "-" + Группа4 + "-" + Группа5;
КонецФункции
Как только мы выяснили точный GUID удаленного договора (например, 05dbe824-a4c6-11dd-bf56-00145e3710ab), мы можем заново создать элемент в справочнике ДоговорыКонтрагентов именно с этим идентификатором. Как только элемент с таким GUID появится в таблице базы данных, битая ссылка во всех связанных документах прошлых лет автоматически «склеится» и превратится в нормальный отображаемый договор.
Рассмотрим пример кода внешней обработки, с помощью которого мы можем программно создать пустую «заглушку» договора с нужным нам GUID:
Процедура ВосстановитьДоговорПоGUID()
// Задаем вычисленный ранее GUID удаленного объекта
СтрокаGUID = "05dbe824-a4c6-11dd-bf56-00145e3710ab";
НовыйУИД = Новый УникальныйИдентификатор(СтрокаGUID);
// Получаем ссылку на элемент справочника по его уникальному идентификатору
СсылкаНаОбъект = Справочники.ДоговорыКонтрагентов.ПолучитьСсылку(НовыйУИД);
// Проверяем, существует ли физически этот объект в базе данных
Попытка
ОбъектСуществует = (СсылкаНаОбъект.ПолучитьОбъект() <> Неопределено);
Исключение
ОбъектСуществует = Ложь;
КонецПопытки;
Если Не ОбъектСуществует Тогда
// Создаем новый элемент справочника
НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
// Устанавливаем новому объекту предопределенную ссылку со старым GUID
НовыйДоговор.УстановитьСсылкуНового(СсылкаНаОбъект);
// Заполняем обязательные реквизиты, чтобы объект был валидным
НовыйДоговор.Наименование = "Восстановленный договор (по арх. данным)";
// Владельцем договора обязательно должен быть соответствующий Контрагент
НовыйДоговор.Владелец = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
// Записываем объект без проведения лишних проверок
НовыйДоговор.Записать();
Сообщить("Элемент справочника успешно создан с исходным GUID!");
Иначе
Сообщить("Объект с таким идентификатором уже присутствует в системе!");
КонецЕсли;
КонецПроцедуры
После выполнения данного кода откройте документ реализации. Вместо унылой надписи «Объект не найден» вы увидите созданный нами элемент с наименованием «Восстановленный договор». Теперь вы можете зайти в него и отредактировать все реквизиты (дату, номер, тип цен) в соответствии с первичными бумажными документами.
Если у вас нет навыков программирования и вы опасаетесь запускать внешние обработки с кодом, можно воспользоваться мощным встроенным инструментом платформы. Он умеет находить битые ссылки и автоматически генерировать для них пустые элементы-заглушки.
Важное предупреждение: Перед началом любых процедур тестирования и исправления базы данных обязательно создайте резервную копию (бэкап) базы данных! Для файловой базы скопируйте файл 1Cv8.1CD, для клиент-серверной — сделайте бэкап средствами СУБД (MS SQL Server / PostgreSQL) или выгрузите информационную базу в файл .dt через Конфигуратор.
Давайте пошагово выполним тестирование базы:
По окончании процесса платформа предоставит подробный отчет. В нем будет написано, какие именно битые ссылки были обнаружены и в каких справочниках созданы новые пустые элементы. Открыв документ реализации 2017 года в режиме «1С:Предприятие», вы увидите пустую строчку в поле договора. Кликните по ней, откройте карточку созданного договора, заполните ее актуальными данными из бумажного архива и сохраните.
Если у вас или системного администратора все-таки сохранился старый бэкап базы данных (пусть даже за 2017-2018 годы), где этот договор еще существовал, вы можете восстановить его в текущую рабочую базу в первозданном виде со всеми заполненными реквизитами. При этом GUID объекта полностью сохранится.
Для реализации этого метода мы воспользуемся стандартной обработкой от фирмы 1С — «Выгрузка и загрузка данных XML». Ее можно скачать на официальном портале ИТС.
Давайте выполним выгрузку и загрузку по шагам:
ВыгрузкаЗагрузкаДанныхXML.epf через меню Файл — Открыть.Договоры контрагентов и отметьте его галочкой.dogovor.xml) и нажмите кнопку «Выгрузить».ВыгрузкаЗагрузкаДанныхXML.epf.dogovor.xml и нажмите кнопку «Загрузить».Механизм XML-сериализации платформы 1С устроен так, что при загрузке объекта в новую базу он создается с абсолютно тем же уникальным идентификатором (GUID), который был у него в исходной базе. Как только загрузка завершится, битая ссылка в реализации моментально исчезнет, а на ее месте появится оригинальный, заполненный до мельчайших деталей договор.
Когда вы успешно восстановили договор (неважно, каким из перечисленных выше способов — программно по GUID, через тестирование базы или XML-перенос), возникает соблазн открыть документ реализации 2017 года и нажать заветную кнопку «Провести и закрыть». Делать это категорически запрещено!
Давайте проанализируем, почему нельзя перепроводить старые исторические документы:
Как поступить правильно: для того чтобы восстановить визуальное отображение договора в отчетах и документах, достаточно просто записать воссозданный элемент справочника (договор). Сам документ реализации трогать, перезаписывать или проводить не требуется. Поскольку связь между документом и договором осуществляется на уровне ссылки по GUID, появление самого объекта в таблице договоров мгновенно восстанавливает целостность отображения данных во всех отчетах и журналах без изменения движений по регистрам.