При программном создании пользователей в конфигурациях на базе Библиотеки стандартных подсистем (БСП) разработчики часто сталкиваются с ситуацией, когда данные вроде бы записаны, но при первом интерактивном открытии карточки пользователя система выдает назойливое сообщение: «Заполнить почту из информационной базы?». Рассмотрим подробнее, почему это происходит и как правильно прописать электронную почту, чтобы избежать рассинхронизации данных.
Разберем ситуацию: в системе 1С данные о пользователе хранятся в двух разных местах. Во-первых, это Пользователь информационной базы (ИБ) — объект программного уровня (учетная запись для входа), который виден в конфигураторе. Во-вторых, это элемент справочника Пользователи, который содержит дополнительные реквизиты, настройки и, самое главное, контактную информацию.
Когда мы программно заполняем свойство АдресЭлектроннойПочты в структуре ОписаниеПользователяИБ, мы меняем данные только в учетной записи (в ИБ). Однако БСП отображает почту в форме элемента справочника из его табличной части КонтактнаяИнформация. Если в ИБ почта есть, а в справочнике она пуста, механизмы БСП фиксируют расхождение и предлагают пользователю выполнить заполнение вручную. Проанализируем, как сделать это автоматически на стороне сервера.
Иногда разработчики пытаются найти реквизит почты на форме через отладчик и видят странные имена, например АдресЭлектроннойПочтыДляВосстановления123sdf.... Важно понимать, что это динамические реквизиты формы, которые создаются программно в момент открытия диалога. Попытка программно получить форму через ПолучитьФорму() на сервере — это грубая ошибка, так как формы предназначены для работы на клиенте. Выясним, как работать напрямую с данными объекта.
Самый надежный и современный способ создания пользователя — использование метода Пользователи.ЗаписатьПользователя(). Этот метод берет на себя всю «грязную работу» по синхронизации учетной записи и справочника. Разберем пример кода:
// Подготовим описание пользователя
ОписаниеПользователя = Пользователи.НовоеОписаниеПользователя();
ОписаниеПользователя.Имя = "ИванИванович";
ОписаниеПользователя.ПолноеИмя = "Иванов Иван Иванович";
ОписаниеПользователя.Вставить("АдресЭлектроннойПочты", "ivanov@company.ru");
// Создаем структуру для контактной информации
ТаблицаКИ = Новый ТаблицаЗначений;
ТаблицаКИ.Колонки.Добавить("Вид");
ТаблицаКИ.Колонки.Добавить("Представление");
ТаблицаКИ.Колонки.Добавить("Значение");
НоваяСтрока = ТаблицаКИ.Добавить();
НоваяСтрока.Вид = Справочники.ВидыКонтактнойИнформации.EmailПользователя;
НоваяСтрока.Представление = "ivanov@company.ru";
// Передаем таблицу КИ в описание
ОписаниеПользователя.КонтактнаяИнформация = ТаблицаКИ;
// Записываем пользователя (БСП сама создаст и ИБ-пользователя, и элемент справочника)
Пользователи.ЗаписатьПользователя(Неопределено, ОписаниеПользователя);
В этом случае БСП автоматически пропишет почту и в настройки аутентификации, и в контактную информацию справочника. Система больше не будет спрашивать о заполнении при входе.
Если пользователь уже создан, и вам нужно дозаполнить только электронную почту, необходимо использовать механизмы подсистемы «Контактная информация». Рассмотрим по шагам, как это сделать программно на сервере:
Пользователи.EmailПользователя).УправлениеКонтактнойИнформацией для формирования корректной записи.Пример реализации функции обновления почты:
Процедура ОбновитьПочтуПользователя(ПользовательСсылка, НовыйАдрес)
ПользовательОбъект = ПользовательСсылка.ПолучитьОбъект();
ВидКИ = Справочники.ВидыКонтактнойИнформации.EmailПользователя;
// Очистим старую почту этого вида, если она была
Для Каждого СтрокаКИ Из ПользовательОбъект.КонтактнаяИнформация Цикл
Если СтрокаКИ.Вид = ВидКИ Тогда
ПользовательОбъект.КонтактнаяИнформация.Удалить(СтрокаКИ);
Прервать;
КонецЕсли;
КонецЦикла;
// Добавляем новую запись
НоваяСтрока = ПользовательОбъект.КонтактнаяИнформация.Add();
НоваяСтрока.Вид = ВидКИ;
НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
НоваяСтрока.Представление = НовыйАдрес;
// Для БСП важно также заполнить поле "Значение" (обычно это XML или JSON структура)
МодульКИ = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
НоваяСтрока.Значение = МодульКИ.КонтактнаяИнформацияПоПредставлению(НовыйАдрес, ВидКИ);
ПользовательОбъект.Записать();
КонецПроцедуры
Если вы уже записали почту в ПользовательИБ (через конфигуратор или программно), но справочник остался неактуальным, можно вызвать встроенную процедуру синхронизации БСП. Это избавит вас от ручного перебора табличных частей.
Посмотрим на пример вызова:
// Ссылка на элемент справочника Пользователи
ПользовательСсылка = Справочники.Пользователи.НайтиПоНаименованию("Иванов Иван Иванович");
// Вызываем синхронизацию данных справочника с данными ИБ
Пользователи.СинхронизироватьДанныеПользователяИБ(ПользовательСсылка);
Эта процедура проанализирует свойства учетной записи и, если обнаружит заполненную почту, автоматически перенесет её в контактную информацию справочника. Это наиболее «чистый» способ исправления данных, если они уже частично занесены в систему.
Подведем итоги нашего анализа ситуации:
ПолучитьФорму() на сервере для заполнения реквизитов, которые вы видите в интерфейсе — они могут быть динамическими.Пользователи.ЗаписатьПользователя(), передавая в него полную структуру данных.Пользователи с типом АдресЭлектроннойПочты.Пользователи.СинхронизироватьДанныеПользователяИБ().Соблюдение этих правил гарантирует стабильную работу подсистемы управления доступом и отсутствие лишних вопросов у конечных пользователей программы.