Как программно создать пользователя и заполнить его почту через БСП без ошибок синхронизации

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

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

В чем причина возникновения проблемы?

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

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

Неправильный подход: использование динамических реквизитов формы

Иногда разработчики пытаются найти реквизит почты на форме через отладчик и видят странные имена, например АдресЭлектроннойПочтыДляВосстановления123sdf.... Важно понимать, что это динамические реквизиты формы, которые создаются программно в момент открытия диалога. Попытка программно получить форму через ПолучитьФорму() на сервере — это грубая ошибка, так как формы предназначены для работы на клиенте. Выясним, как работать напрямую с данными объекта.

Правильный способ №1: Использование программного интерфейса БСП

Самый надежный и современный способ создания пользователя — использование метода Пользователи.ЗаписатьПользователя(). Этот метод берет на себя всю «грязную работу» по синхронизации учетной записи и справочника. Разберем пример кода:


// Подготовим описание пользователя
ОписаниеПользователя = Пользователи.НовоеОписаниеПользователя();
ОписаниеПользователя.Имя            = "ИванИванович";
ОписаниеПользователя.ПолноеИмя      = "Иванов Иван Иванович";
ОписаниеПользователя.Вставить("АдресЭлектроннойПочты", "ivanov@company.ru");

// Создаем структуру для контактной информации
ТаблицаКИ = Новый ТаблицаЗначений;
ТаблицаКИ.Колонки.Добавить("Вид");
ТаблицаКИ.Колонки.Добавить("Представление");
ТаблицаКИ.Колонки.Добавить("Значение");

НоваяСтрока = ТаблицаКИ.Добавить();
НоваяСтрока.Вид = Справочники.ВидыКонтактнойИнформации.EmailПользователя;
НоваяСтрока.Представление = "ivanov@company.ru";

// Передаем таблицу КИ в описание
ОписаниеПользователя.КонтактнаяИнформация = ТаблицаКИ;

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

В этом случае БСП автоматически пропишет почту и в настройки аутентификации, и в контактную информацию справочника. Система больше не будет спрашивать о заполнении при входе.

Правильный способ №2: Запись в существующий объект через контактную информацию

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

  1. Получаем объект справочника Пользователи.
  2. Находим ссылку на нужный вид контактной информации (обычно это предопределенный элемент EmailПользователя).
  3. Используем модуль УправлениеКонтактнойИнформацией для формирования корректной записи.

Пример реализации функции обновления почты:


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

Синхронизация через стандартные процедуры

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

Посмотрим на пример вызова:


// Ссылка на элемент справочника Пользователи
ПользовательСсылка = Справочники.Пользователи.НайтиПоНаименованию("Иванов Иван Иванович");

// Вызываем синхронизацию данных справочника с данными ИБ
Пользователи.СинхронизироватьДанныеПользователяИБ(ПользовательСсылка);

Эта процедура проанализирует свойства учетной записи и, если обнаружит заполненную почту, автоматически перенесет её в контактную информацию справочника. Это наиболее «чистый» способ исправления данных, если они уже частично занесены в систему.

Резюме для разработчика

Подведем итоги нашего анализа ситуации:

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

← На главную