При обслуживании баз данных 1С часто встречаются ситуации, когда стандартные средства, такие как «Тестирование и исправление», оказываются бессильны. Одной из таких проблем является нарушение ссылочной целостности в регистре сведений БезопасноеХранилищеДанных. Давайте разберем, почему это происходит и как программно исправить ситуацию.
Регистр БезопасноеХранилищеДанных предназначен для хранения конфиденциальной информации: паролей к почтовым ящикам, настроек интеграции с сервисами и ключей доступа. Ошибка ссылочной целостности возникает тогда, когда основной объект системы (владелец записи) был удален, а соответствующая ему запись в защищенном регистре осталась. Поскольку платформа 1С защищает содержимое этого регистра, обычное удаление строк в пользовательском интерфейсе часто бывает невозможно или скрыто от глаз пользователя.
Прежде чем приступать к любым изменениям, обязательно создайте резервную копию базы данных. Работа с системными регистрами требует осторожности. Убедитесь, что вы работаете в режиме «Конфигуратор» или имеете доступ к «Функциям для технического специалиста».
Так как интерфейсные методы не всегда позволяют найти «битые» ссылки, мы воспользуемся механизмом работы с наборами записей. Суть метода заключается в принудительной записи пустого набора для конкретного измерения, которое содержит недействительную ссылку.
Рассмотрим пошагово, как очистить регистр с помощью встроенного языка 1С:
РегистрыСведений.БезопасноеХранилищеДанных для создания набора записей.Записать(), который удалит запись из базы данных.Пример программного кода для реализации данной задачи:
// Создаем набор записей для регистра
Набор = РегистрыСведений.БезопасноеХранилищеДанных.СоздатьНаборЗаписей();
// Устанавливаем отбор по владельцу, который необходимо удалить
// В качестве параметра передается ссылка на объект, который стал «битым»
Набор.Отбор.Владелец.Установить(СсылкаНаНесуществующийОбъект);
// Записываем пустой набор, что приводит к удалению всех записей, попавших под отбор
Набор.Записать(Истина);
Если вы не знаете, какие именно ссылки являются битыми, воспользуйтесь следующим алгоритмом поиска:
Владелец. Если при попытке обратиться к объекту через Ссылка.ПолучитьОбъект() система возвращает Неопределено или выдает ошибку, значит, ссылка является недействительной.После удаления записей из БезопасноеХранилищеДанных обязательно проверьте работоспособность функционала, который был с ними связан. Например, протестируйте отправку почты из 1С или работу регламентных заданий по обмену данными. Поскольку в этом регистре хранятся пароли, их удаление может потребовать повторной настройки учетных записей или повторного ввода паролей в соответствующих справочниках.
Если после выполнения очистки ошибка в журнале регистрации сохраняется, рекомендуем повторно запустить процедуру «Тестирование и исправление» с установленными флагами проверки ссылочной целостности. Теперь, когда битые записи удалены программно, система сможет корректно завершить проверку структуры базы данных.