Как устранить ошибку обновления 1С из-за дублирования пользователей?

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

При переносе данных между информационными базами или некорректном слиянии справочников часто возникает ситуация, когда в типовых конфигурациях (например, 1С:Бухгалтерия) появляются дублирующиеся элементы в справочнике Справочник.Пользователи. При попытке выполнить обновление конфигурации или запустить обработчики обновления информационная база аварийно прерывает процесс. Разберем причины возникновения этой ошибки и эффективные способы её устранения.

Выясним причину такого поведения системы. В конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), учетные записи разделены на два уровня:

  1. Пользователи платформы — системные учетные записи из коллекции ПользователиИнформационнойБазы.
  2. Элементы справочников прикладного уровня — Справочник.Пользователи и Справочник.ВнешниеПользователи.

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

Способ 1. Пересинхронизация учетных записей через Конфигуратор и режим Предприятия

Рассмотрим самый быстрый и проверенный способ ручного восстановления связей, который не требует написания сложных обработок.

  1. Откроем информационную базу в режиме Конфигуратор.
  2. Перейдем в меню Администрирование — Пользователи.
  3. Удалим учетные записи тех пользователей, по которым возникли дубли (при необходимости предварительно зафиксируем их роли и права).
  4. Запустим информационную базу в режиме 1С:Предприятие под учетной записью с полными административными правами.
  5. Откроем Справочник.Пользователи, найдем нужного пользователя, внесем незначительное изменение (например, добавим и уберем пробел в наименовании) и нажмем кнопку Записать и закрыть.
  6. При повторной записи типовые механизмы БСП автоматически создадут нового пользователя в коллекции ПользователиИнформационнойБазы и корректно пропишут новый ИдентификаторПользователяИБ.
  7. Повторим процедуру обновления конфигурации.

Способ 2. Программное отключение связи с пользователем платформы

Если в базе присутствует множество дублирующихся или архивных элементов справочника, на которые уже завязаны проведенные документы, их прямое удаление невозможно. В таком случае разберем, как программно очистить привязку к пользователю информационной базы.

Посмотрим на пример обработки для очистки некорректных идентификаторов:


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

Использование свойства ОбменДанными.Загрузка = Истина позволяет перезаписать реквизиты объекта без вызова прикладных проверок БСП, что гарантирует успешное снятие привязки.

Способ 3. Слияние дублей с перезаписью связанных документов

Проанализируем ситуацию, когда необходимо не просто отвязать учетную запись, а полностью объединить дубли и заменить ссылки во всех существующих документах и регистрах.

  1. Откроем стандартную обработку Поиск и удаление дублей (меню Администрирование — Обслуживание — Корректировка данных).
  2. Если типовая замена не может перезаписать проведенные документы прошлых периодов, выполним замену ссылок программно в режиме загрузки данных:

СсылкаДубль = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И. (дубль)");
СсылкаОригинал = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И.");

МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаДубль);

// Находим все ссылки на дубль в базе
ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);

Для Каждого Стр Из ТаблицаСсылок Цикл
    ОбъектСсылка = Стр.Данные;
    Попытка
        Объект = ОбъектСсылка.ПолучитьОбъект();
        Если Объект <> Неопределено Тогда
            Объект.ОбменДанными.Загрузка = Истина;
            // Заменяем ссылку в объекте
            ЗаполнитьЗначенияСвойств(Объект, Новый Структура(Стр.Метаданные.Имя, СсылкаОригинал));
            Объект.Записать();
        КонецЕсли;
    Исключение
        // Обработка исключений для регистров или недоступных объектов
    КонецПопытки;
КонецЦикла;

После успешной перепривязки ссылок дублирующий элемент справочника помечается на удаление и окончательно удаляется через штатную процедуру Удаление помеченных объектов.

Способ 4. Отключение доступа штатными средствами

Если доступ к конфигуратору ограничен или требуется решить проблему без написания кода, рассмотрим отключение прав в карточке пользователя:

  1. Откроем карточку проблемного пользователя в справочнике Справочник.Пользователи.
  2. Снимем флаг Доступ к информационной базе разрешен.
  3. Сохраним элемент. Механизм БСП в штатном режиме удалит связь с учетной записью платформы и очистит значение ИдентификаторПользователяИБ.
  4. Также обязательно проверим справочник Справочник.ВнешниеПользователи, так как конфликт уникальности идентификаторов может возникать при пересечении с внешними учетными записями.
← На главную