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