В процессе работы с информационными базами 1С:Предприятие специалисты часто сталкиваются с ситуацией, когда в табличных частях документов или реквизитах объектов вместо понятного названия элемента отображается надпись «<Объект не найден>...» или поле остается совершенно пустым. На первый взгляд проблемы кажутся идентичными, однако с точки зрения платформы 1С это принципиально разные состояния данных, требующие различных подходов к исправлению. В этой статье мы подробно разберем, как диагностировать эти состояния и какими методами можно восстановить корректную работу системы.
Прежде чем приступать к активным действиям, нам необходимо четко классифицировать проблему. Проанализируем, что именно хранится в базе данных в обоих случаях:
Пустая() вернет значение Истина. Такое состояние обычно возникает, когда пользователь просто не выбрал значение в поле.Пустая() в этом случае вернет Ложь.Рассмотрим ситуацию, когда в вашей табличной части присутствуют именно такие «фантомные» записи. Сопоставить пустые ссылки с элементами можно только путем прямого выбора или программной подстановки. С битыми ссылками ситуация интереснее: их можно «оживить».
Если нам известно, на какой именно существующий элемент справочника должна указывать битая ссылка, мы можем воспользоваться механизмом замены. Рассмотрим работу с типовой обработкой «Поиск и замена значений» (или аналогичными инструментами из БСП, такими как ОбщегоНазначения.ЗаменитьСсылки).
Алгоритм действий следующий:
Важный нюанс: стандартная обработка замены иногда «отказывается» видеть битые ссылки. В этом случае мы переходим к более продвинутым методам.
Проанализируем ситуацию: у нас есть битая ссылка с конкретным GUID, который отображается в тексте <Объект не найден> (83:af3100...). Мы можем программно создать новый элемент справочника и «назначить» ему этот идентификатор. После этого во всех документах ссылка автоматически станет «живой».
Разберем пример кода для реализации этой задачи. Предположим, битая ссылка относится к справочнику Номенклатура:
// 1. Получаем строку GUID из текста ошибки или программно
СтрокаGUID = "af310050-56a3-11eb-b53e-00155d011103";
НужныйGUID = Новый УникальныйИдентификатор(СтрокаGUID);
// 2. Формируем ссылку на основе этого идентификатора
СсылкаНаОбъект = Справочники.Номенклатура.ПолучитьСсылку(НужныйGUID);
// 3. Проверяем, действительно ли объекта нет (на всякий случай)
Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
// Создаем новый объект
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
// Ключевой момент: устанавливаем предопределенную ссылку до записи
НовыйЭлемент.УстановитьСсылкуНового(СсылкаНаОбъект);
НовыйЭлемент.Наименование = "Восстановленный объект (" + СтрокаGUID + ")";
НовыйЭлемент.Записать();
Сообщить("Объект успешно восстановлен!");
КонецЕсли;
После выполнения этого кода битая ссылка в табличной части вашего документа перестанет быть битой. Вместо <Объект не найден> появится элемент с наименованием «Восстановленный объект...». Теперь вы можете либо оставить его, заполнив реквизиты, либо слить его с уже существующим правильным элементом через стандартный поиск и замену дублей.
Выясним, как решить проблему массово, если битых ссылок очень много. В платформу 1С встроен мощный инструмент «Тестирование и исправление информационной базы». Рассмотрим настройки, которые нам помогут:
ПустаяСсылка(). Это удобно, если данные не важны и их нужно просто «почистить».Внимание: перед запуском этой процедуры обязательно создайте резервную копию базы данных!
Посмотрим на пример того, как программно найти все строки в табличной части, содержащие битые ссылки. Обычное сравнение Ссылка = ЗНАЧЕНИЕ(Справочник.Имя.ПустаяСсылка) здесь не сработает. Эффективный способ — проверка реквизитов связанного объекта на NULL при левом соединении, которое платформа выполняет неявно при обращении через точку.
Разберем логику запроса:
ВЫБРАТЬ
ТЧ.Ссылка КАК ДокументОбъект,
ТЧ.Номенклатура КАК БитаяСсылка
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК ТЧ
ГДЕ
НЕ ТЧ.Номенклатура.Пустая
И ТЧ.Номенклатура.Наименование ЕСТЬ NULL
Проанализируем, почему это работает: если ссылка не пустая, но при обращении к Наименование система возвращает NULL, значит, запись в таблице справочника отсутствует. Это и есть наша «битая» ссылка.
Мы рассмотрели различные ситуации возникновения некорректных ссылок. Если вы столкнулись с пустыми ссылками, их необходимо заполнить вручную или программно, используя алгоритмы сопоставления (например, по артикулу или наименованию из архивной копии). Если же вы имеете дело с битыми ссылками (<Объект не найден>), у вас есть возможность восстановить объект по его уникальному идентификатору.
Для предотвращения подобных проблем в будущем рекомендуем:
Используя данные методы, вы сможете поддерживать чистоту и консистентность данных в вашей системе 1С.