Почему в 1С:Бухгалтерия 3.0 пропадает доступ у пользователей и как исправить ошибку «Имя пользователя занято»?

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

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

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

Архитектура механизма пользователей в БСП

Для понимания природы ошибки важно различать два уровня хранения учетных записей:

  1. Системный пользователь платформы (объект ПользовательИнформационнойБазы) — хранится во внутренних таблицах платформы 1С и отвечает за аутентификацию (логин, пароль, права доступа, роли).
  2. Элемент прикладного справочника (Справочники.Пользователи) — хранит информацию для бизнес-логики программы (ФИО, подразделение, контактные данные, настройки отчетов).

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

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

Основные причины сброса привязки пользователей

Проанализируем основные факторы, которые приводят к повреждению реквизита ИдентификаторПользователяИБ:

  1. Синхронизация данных и обмены (РИБ, ЗУП, УТ, ERP). При переносе справочника Пользователи между базами через механизмы обмена в режиме ОбменДанными.Загрузка = Истина в базу-приемник может загрузиться значение реквизита ИдентификаторПользователяИБ из базы-источника. Поскольку системные идентификаторы пользователей в разных базах уникальны, загруженный GUID перезаписывает локальный и разрывает связь.
  2. Интеграции через Web/HTTP-сервисы. Сторонние системы (Active Directory, Битрикс24, корпоративные порталы) при обновлении личных данных сотрудников могут перезаписывать элемент справочника напрямую без использования штатных процедур БСП, затирая служебные реквизиты.
  3. Ручное переименование или дублирование пользователей в Конфигураторе или в режиме Предприятия без соблюдения процедур сопоставления.

Способ 1. Штатное сопоставление пользователей в режиме «1С:Предприятие»

Вместо удаления пользователя в Конфигураторе и повторного ввода данных воспользуемся встроенным инструментом сопоставления БСП:

  1. Перейдем в раздел Администрирование — Настройки пользователей и прав — Пользователи.
  2. В командной панели формы списка откроем подменю Еще и выберем пункт Пользователи информационной базы.
  3. В открывшемся окне найдем строки, выделенные красным шрифтом — это пользователи платформы, потерявшие связь со справочником.
  4. Выделим нужного пользователя и нажмем кнопку Сопоставить.
  5. В появившемся окне укажем соответствующий элемент из справочника Пользователи и сохраним изменения.

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

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


// Получаем системного пользователя платформы по имени для входа
ИмяПользователя = "ИвановИИ";
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);

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

Способ 3. Поиск источника изменений и устранение первопричины

Чтобы исключить повторение проблемы каждые несколько недель, локализуем источник, перезаписывающий данные:

  1. Анализ журнала регистрации. Откроем Администрирование — Обслуживание — Журнал регистрации. Установим отбор по событию «Данные.Изменение» и метаданным справочника Пользователи. Проверим, какие сеансы (WS-соединения, регламентные задания, пользователи) вносят изменения.
  2. Анализ планов обмена. Если в базе настроена синхронизация данных, проверим состав плана обмена. Если передача пользователей между базами не является обязательной, исключим справочник Пользователи из состава плана обмена либо исключим реквизит ИдентификаторПользователяИБ из правил конвертации/регистрации.
  3. Логирование через расширение. Для точного перехвата процесса создадим расширение с обработчиком ПередЗаписью для справочника Пользователи:

&Вместо("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ)
    Если ЭтотОбъект.ОбменДанными.Загрузка Тогда
        // Фиксируем контекст вызова в Журнале регистрации
        Стек = ПолучитьСтекВызовов();
        ЗаписьЖурналаРегистрации(
            "КонтрольПользователей.ИзменениеИдентификатора",
            УровеньЖурналаРегистрации.Предупреждение,
            ЭтотОбъект.Метаданные(),
            ЭтотОбъект.Ссылка,
            "Стек вызова: " + Стек
        );
    КонецЕсли;
    ПродолжитьВызов(Отказ);
КонецПроцедуры

После выявления конкретного веб-сервиса или фонового задания достаточно скорректировать алгоритм сторонней интеграции, чтобы он не перезаписывал служебные реквизиты БСП.

← На главную