Как программно изменить имя для входа пользователя в 1С с использованием БСП?

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

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

Давайте подробно разберем, почему возникает эта проблема, проанализируем правильные способы взаимодействия со справочником пользователей и рассмотрим рабочие примеры кода, которые позволят нам менять любые настройки пользователя, не затирая его пароль и прочие данные.

Почему прямая запись в ПользователиИнформационнойБазы не работает?

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

Прямая манипуляция через коллекцию ПользователиИнформационнойБазы настоятельно не рекомендуется и часто блокируется платформой или подписками на события. Любые изменения обязательно должны проходить через объект справочника Пользователи. Если мы попытаемся выполнить прямую запись, то данные могут рассинхронизироваться, и конфигурация откажется применять наши изменения.

Решение 1: Запись через ДополнительныеСвойства справочника

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

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


// Получаем объект справочника "Пользователи"
ПользовательОбъект = ПользовательСсылка.ПолучитьОбъект();

// Создаем новую структуру описания пользователя ИБ
ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
ОписаниеПользователяИБ.Вставить("Действие", "Записать");

// Задаем новое имя для входа
ОписаниеПользователяИБ.Имя = "НовоеИмяДляВхода";

// Передаем структуру в дополнительные свойства объекта
ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);

// Записываем объект справочника. БСП сама обновит пользователя ИБ.
ПользовательОбъект.Записать();

Этот способ отлично работает, если мы создаем нового пользователя. Но у него есть один критический недостаток при обновлении существующих учеток. Если мы указываем только ОписаниеПользователяИБ.Имя, то алгоритм затирает все остальные данные пользователя ИБ (например, сбрасывает пароль, снимает роли или отключает видимость в списке выбора). Разберем, как избежать этой проблемы.

Решение 2: Как изменить только одно свойство (без потери остальных данных)

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

  1. Прочитать текущие свойства пользователя информационной базы.
  2. Изменить в полученной структуре только нужные ключи.
  3. Передать обновленную структуру для записи.

Для правильного получения всех текущих настроек пользователя ИБ следует использовать специальную функцию БСП. Выполним чтение данных:


УИД_Пользователя = Выборка.УникальныйИдентификатор;
// Получаем текущие данные пользователя
ТекущиеСвойства = Пользователи.СведенияОПользователеИБ(УИД_Пользователя);

Однако, в последних релизах БСП есть еще более элегантный способ изменить конкретное свойство через специальную процедуру ЗаписатьПользователяИБ. Посмотрим на пример, как записать только имя:


// Создаем структуру только для тех свойств, которые нужно обновить
СтруктураСвойств = Новый Структура;
СтруктураСвойств.Вставить("Имя", Выборка.ИмяПользователяИБ);

// Используем метод БСП для точечного обновления
Пользователи.ЗаписатьПользователяИБ(УИД_Пользователя, СтруктураСвойств);

Этот подход гарантирует, что система обновит исключительно переданное поле Имя, а все остальные важные параметры, включая назначенные роли и пароли, останутся нетронутыми.

Настройка аутентификации ОС и скрытие из списка выбора

Проанализируем ситуацию, когда нам необходимо программно включить авторизацию пользователя через доменную учетную запись Windows (Аутентификация ОС). Это часто требуется при автоматической загрузке пользователей из Active Directory.

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


СтруктураСвойств = Новый Структура;

// Включаем аутентификацию средствами ОС
СтруктураСвойств.Вставить("АутентификацияОС", Истина);

// Указываем домен и имя пользователя ОС
СтруктураСвойств.Вставить("ПользовательОС", "DOMAIN\Ivanov_II");

// Если нужно отключить вход по паролю 1С
СтруктураСвойств.Вставить("АутентификацияСтандартная", Ложь);

// Выполняем запись
Пользователи.ЗаписатьПользователяИБ(УИД_Пользователя, СтруктураСвойств);

Также в эту структуру можно передавать и другие ключи, которые управляют параметрами входа:

Как прочитать текущее имя пользователя для входа?

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


УИД = ПользовательСсылка.ИдентификаторПользователяИБ;
Если УИД <> Неопределено Тогда
    ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(УИД);
    Если ПользовательИБ <> Неопределено Тогда
        Логин = ПользовательИБ.Имя;
        Сообщить("Имя пользователя для входа: " + Логин);
    КонецЕсли;
КонецЕсли;

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

← На главную