В процессе администрирования территориально распределенных систем (РИБ) часто возникает задача оперативного создания пользователей в периферийных узлах из центральной базы. Заходить в каждую базу через конфигуратор или в режиме предприятия — процесс трудоемкий и неэффективный. Рассмотрим современные и классические способы автоматизации этого процесса, разберем технические нюансы реализации и типовые ошибки.
Это наиболее современный и быстрый способ взаимодействия между базами. HTTP-сервис позволяет передать команду на создание пользователя мгновенно, не требуя длительного ожидания инициализации тяжелых объектов, как в случае с COM.
Проанализируем структуру реализации:
Разберем типичную проблему — получение ошибки 404 при попытке вызвать сервис. Основная причина кроется в неверном формировании строки URL. Правильный формат адреса выглядит так: URL_Сервера/Имя_Базы/hs/Имя_Сервиса/Название_Метода. Обязательно должен присутствовать сегмент /hs/, указывающий на обращение именно к HTTP-сервису.
Рассмотрим пример кода для отправки запроса из центральной базы:
ИмяСервера = "server.domain.ru";
ПользовательАдмин = "Admin";
ПарольАдмин = "P@ssword";
Соединение = Новый HTTPСоединение(ИмяСервера, , ПользовательАдмин, ПарольАдмин);
// Формируем структуру с данными нового пользователя
ДанныеПользователя = Новый Структура;
ДанныеПользователя.Вставить("Name", "IvanovII");
ДанныеПользователя.Вставить("FullName", "Иванов Иван Иванович");
ДанныеПользователя.Вставить("Password", "12345");
ДанныеПользователя.Вставить("Roles", "ПолныеПрава");
// Преобразуем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеПользователя);
СтрокаJSON = ЗаписьJSON.Закрыть();
Запрос = Новый HTTPЗапрос("/BaseName/hs/UserManagement/CreateUser");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON);
Результат = Соединение.ОтправитьДляОбработки(Запрос);
Если Результат.КодСостояния = 200 Тогда
Сообщить("Пользователь успешно создан");
Иначе
Сообщить("Ошибка: " + Результат.КодСостояния);
КонецЕсли;
Если ваши конфигурации построены на Библиотеке стандартных подсистем (БСП), самый надежный путь — использовать встроенную синхронизацию данных. Проанализируем, почему это выгодно:
Пользователи.Для реализации этого метода достаточно в настройках состава плана обмена включить регистрацию для справочника Пользователи. Однако стоит помнить, что пароли пользователей ИБ обычно не хранятся в справочнике в явном виде. Для их передачи может потребоваться создание специального регистра сведений или использование дополнительных реквизитов, которые будут программно обрабатываться в базе-приемнике при загрузке данных в процедурах ПриЗагрузкеДанныхВУзле.
Метод через V83.ComConnector считается классическим. Несмотря на то, что он работает медленнее HTTP-запросов, он предоставляет прямой доступ к программному интерфейсу базы-приемника.
Выполним следующие шаги для реализации через COM:
ПользователиИнформационнойБазы удаленной базы.Записать().Посмотрим на пример кода:
Connector = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "Srvr='ServerName';Ref='BaseName';Usr='Admin';Pwd='Password';";
Попытка
Connection = Connector.Connect(СтрокаПодключения);
Исключение
Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Создаем пользователя в удаленной базе
NewUser = Connection.InfoBaseUsers.CreateUser();
NewUser.Name = "PetrovPP";
NewUser.FullName = "Петров Петр Петрович";
NewUser.Password = "StrongPass123";
NewUser.StandardAuthentication = Истина;
// Назначение ролей (нужно знать точные имена ролей в удаленной базе)
Role = Connection.Metadata.Roles.Find("ПолныеПрава");
NewUser.Roles.Add(Role);
Попытка
NewUser.Write();
Сообщить("Пользователь успешно создан через COM");
Исключение
Сообщить("Ошибка при записи пользователя: " + ОписаниеОшибки());
КонецПопытки;
При создании пользователя любым из методов важно учитывать архитектуру 1С. В системе существует два уровня сущностей:
Проанализируем ситуацию: если вы создадите только пользователя ИБ через ПользователиИнформационнойБазы.СоздатьПользователя(), при входе в программу в интерфейсе БСП пользователь может столкнуться с ошибками, так как система не найдет соответствующего элемента в справочнике. Поэтому рекомендуется в коде создания (на стороне приемника) всегда выполнять связку:
НовыйПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
// ... заполнение реквизитов ...
НовыйПользовательИБ.Записать();
// Создание элемента в справочнике Пользователи
СпрПользователь = Справочники.Пользователи.СоздатьЭлемент();
СпрПользователь.Наименование = НовыйПользовательИБ.ПолноеИмя;
СпрПользователь.ИдентификаторПользователяИБ = НовыйПользовательИБ.УникальныйИдентификатор;
СпрПользователь.Записать();
Копирование настроек: Если стоит задача "создать пользователя по образу и подобию другого", воспользуйтесь объектом ХранилищеОбщихНастроек. Метод Скопировать() позволяет перенести настройки интерфейса, избранное и персональные отчеты от одного пользователя (прототипа) другому. Это значительно упрощает жизнь конечным пользователям при переходе в новую базу или при создании дублирующих аккаунтов для разных задач.
Выясним, какой метод выбрать? Для мгновенной реакции и интеграции с веб-витринами лучше всего подходят HTTP-сервисы. Для централизованного администрирования в рамках одной компании с единым стандартом конфигураций оптимальным будет использование планов обмена РИБ с доработкой в части передачи паролей.