В результате некорректных загрузок из других информационных баз или удаления объектов без контроля ссылочной целостности в базе 1С могут появляться так называемые «битые ссылки» — ссылки на объекты, которых нет в базе. 1С:Предприятие обладает средствами выявления таких некорректных ссылок.
Битые ссылки глазами пользователя
В режиме предприятия битые ссылки выглядят так:
Внимание!
Следует учесть, что такую же «картинку» пользователь может увидеть и в случае некорректно настроенных ролей.
Ниже описано несколько способов поиска некорректных ссылок на объекты.
Сервис «Тестирование и исправление информационной базы»
Для открытия окна настройки проверки необходимо в конфигураторе выбрать пункт меню Администрирование > Тестирование и исправление.
В открывшемся окне устанавливаем флаг «Проверка ссылочной целостности информационной базы». Данная проверка выполняется только совместно с проверкой логической целостности информационной базы.
Далее выбираем что необходимо сделать при обнаружении битых ссылок:
- Только тестирование — после анализа будет отображен перечень некорректных ссылок;
- Тестирование и исправление — можно не только получить перечень некорректных ссылок, но и исправить их: очистить некорректную ссылку или создать объект, соответствующий некорректной ссылке.
Следует иметь в виду, что проверка ссылочной целостности выполняется в монопольном режиме, а значит работа пользователей в это время невозможна.
В больших базах процесс поиска битых ссылок может занять достаточно длительное время, и не уложиться в интервал технологического перерыва. Из-за этого в нижней части окна предусмотрена возможность порционного выполнения.
Программный поиск битых ссылок
Программный поиск битых ссылок обладает одним несомненным преимуществом: нет необходимости устанавливать монопольный режим и ограничивать доступ пользователей к базе.
Фирма 1С не предоставляет какой-то универсальной обработки для поиска битых ссылок в пользовательском режиме, поэтому придется «творить» самому. Вот несколько подходов, которые можно использовать:
- Получение в запросе подчиненного реквизита и сравнение его с NULL. В качестве подчиненного реквизита наиболее рационально использовать ссылку — она есть у всех объектов. В запросе также необходимо учесть, что подчиненный реквизит от пустой ссылки также возвращает NULL.
- Получение объекта от ссылки при помощи метода ПолучитьОбъект(). Если ссылка битая, то будет возвращено значение Неопределено.
- Получение представления ссылочного типа и сравнение его со строкой «<Объект не найден>».
// ***** Поиск битых ссылок при помощи запроса *****
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровУслуг.Ссылка,
| ПоступлениеТоваровУслуг.Контрагент
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
|ГДЕ
| ПоступлениеТоваровУслуг.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
| И ПоступлениеТоваровУслуг.Контрагент.Ссылка ЕСТЬ NULL";
// ***** Определение корректности ссылки при помощи метода ПолучитьОбъект() *****
Если ЗначениеЗаполнено(Док.Контрагент) И Док.Контрагент.ПолучитьОбъект() = Неопределено Тогда
// Значение реквизита Контрагент — битая ссылка
КонецЕсли;
// ***** Определение корректности ссылки путем анализа представления *****
Если Найти(Строка(Док.Контрагент), «<Объект не найден>») > 0 Тогда
// Значение реквизита Контрагент — битая ссылка
КонецЕсли;