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