Как очистить битые ссылки в регистре Группы значений доступа в 1С:Управление торговлей 11

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

В процессе эксплуатации конфигурации 1С:Управление торговлей 11 (УТ 11), особенно при интенсивном обмене данными или некорректном удалении объектов, в служебных регистрах могут появляться так называемые «битые ссылки» — записи вида <Объект не найден>. Одной из критических точек является регистр сведений ГруппыЗначенийДоступа. Наличие таких записей может приводить к ошибкам при обновлении конфигурации, замедлению работы системы и некорректному расчету прав доступа.

Рассмотрим детально ситуацию, когда проверка логической целостности выдает ошибку по измерению ЗначениеДоступа, и разберем по шагам все доступные методы очистки для файловых и клиент-серверных баз данных.

Метод 1. Использование штатного механизма Тестирования и исправления (ТИИ)

Проанализируем самый доступный способ, встроенный в платформу «1С:Предприятие». Однако стоит помнить, что в файловом варианте базы данных этот метод требует особой осторожности и обязательного создания резервной копии (файла 1Cv8.1CD).

Для исправления битых ссылок выполним следующие действия:

  1. Запустим базу в режиме Конфигуратор.
  2. Перейдем в меню Администрирование — Тестирование и исправление.
  3. Установим флаг только напротив пункта Проверка логической целостности.
  4. В нижней части окна, в разделе «При наличии ссылок на несуществующие объекты», выберем вариант Очищать ссылки или Удалять объект.

Важно понимать разницу: для регистра сведений выбор Удалять объект приведет к удалению всей строки регистра, где найдена битая ссылка в ключевом измерении. Это именно то, что нам нужно в данном случае. Если выбрать Очищать ссылки, система попытается записать в измерение пустое значение, что может быть запрещено логикой регистра (измерение должно быть заполнено), и операция завершится с ошибкой.

Метод 2. Программная очистка через внешнюю обработку

Если база данных файловая, и мы не хотим запускать полное ТИИ, которое может занять много времени, разработаем простой программный алгоритм. Этот метод позволяет точечно удалить только проблемные записи. Выясним, как программно идентифицировать «Объект не найден».

Рассмотрим пример кода, который можно использовать во внешней обработке:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ГруппыЗначенийДоступа.ГруппаДоступа,
    |	ГруппыЗначенийДоступа.ЗначениеДоступа,
    |	ГруппыЗначенийДоступа.ГруппаДанных
    |ИЗ
    |	РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    // Проверяем битую ссылку через получение метаданных
    Если ЗначениеЗаполнено(Выборка.ЗначениеДоступа) 
        И Выборка.ЗначениеДоступа.ПолучитьОбъект() = Неопределено Тогда
        
        // Создаем набор записей для удаления конкретной строки
        Набор = РегистрыСведений.ГруппыЗначенийДоступа.СоздатьНаборЗаписей();
        Набор.Отбор.ГруппаДоступа.Установить(Выборка.ГруппаДоступа);
        Набор.Отбор.ЗначениеДоступа.Установить(Выборка.ЗначениеДоступа);
        Набор.Отбор.ГруппаДанных.Установить(Выборка.ГруппаДанных);
        
        // Записываем пустой набор (удаляем запись)
        Набор.Записать();
        Сообщить("Удалена битая ссылка: " + СокрЛП(Выборка.ЗначениеДоступа));
    КонецЕсли;
КонецЦикла;

В данном коде мы используем метод ПолучитьОбъект(). Если ссылка битая, метод вернет Неопределено, даже если сама ссылка выглядит как заполненный GUID. Это надежный способ отличить реальный объект от записи-фантома.

Метод 3. Инструменты разработчика

Существуют мощные сторонние инструменты, такие как «Инструменты разработчика» (авторства Сергея Старых). Они позволяют работать с данными на более низком уровне, чем стандартный интерфейс 1С.

Проанализируем ситуацию с их использованием:

  1. Воспользуемся инструментом Редактор записей регистров или Поиск и замена значений.
  2. Сформируем запрос к регистру ГруппыЗначенийДоступа.
  3. В поле фильтра по ЗначениеДоступа укажем условие поиска объектов, которые не имеют представления или чья ссылка не разрешается.
  4. Выделим найденные строки и используем команду Удалить напрямую (без запуска обработчиков событий), что особенно эффективно для файловых баз.

Метод 4. Обновление механизмов БСП

Поскольку УТ 11 построена на Библиотеке стандартных подсистем, многие служебные таблицы можно актуализировать штатными средствами. Посмотрим, какие регламентные операции нам помогут:

Почему появляются битые ссылки и как этого избежать?

Выясним основную причину проблемы для профилактики в будущем. Чаще всего записи <Объект не найден> возникают в следующих случаях:

  1. Непосредственное удаление: Использование метода Удалить() вместо УстановитьПометкуУдаления() в программном коде. При непосредственном удалении система не всегда успевает очистить связанные записи в регистрах сведений, которые не имеют жесткой связи «Ведущее» в метаданных.
  2. Сбои при обмене данными: В распределенных информационных базах (РИБ) объект может быть удален в одной базе, но информация об этом не дошла до другой, или прилетела только запись регистра без самого объекта.
  3. Прерывание транзакций: Аварийное завершение работы 1С в момент записи документа, когда объект в таблицу справочника еще не записался, а запись в регистр доступа уже попала (хотя обычно это происходит в рамках одной транзакции, на файловых базах при сбоях файловой системы возможны аномалии).

Рекомендация: Всегда используйте контроль ссылочной целостности перед удалением объектов и регулярно проводите обслуживание файловой базы данных утилитой chdbfl.exe для предотвращения повреждений внутренней структуры таблиц.

← На главную