При интеграции различных информационных систем с конфигурациями на платформе «1С:Предприятие 8» часто возникает задача автоматизации администрирования. Например, при приеме нового сотрудника в корпоративном портале или CRM-системе нам необходимо автоматически создать учетную запись в базе «1С:Зарплата и управление персоналом» (ЗУП 3.1), настроить её параметры и назначить соответствующие права доступа. Наиболее популярным инструментом для решения таких задач является COM-соединение.
Однако просто создать элемент справочника и добавить пользователя информационной базы недостаточно. Современные конфигурации 1С, включая ЗУП 3.1, построены на базе Библиотеки Стандартных Подсистем (БСП). БСП накладывает жесткие правила и стандарты на работу с учетными записями и правами доступа. Попытки обойти эти правила «прямой» записью объектов приводят к труднодиагностируемым ошибкам: пользователи не могут войти в систему, у них не обновляются интерфейсы, «слетают» назначенные роли, либо не работают ограничения на уровне записей (RLS). В этой статье мы подробно разберем типичные ошибки разработчиков и рассмотрим правильную, БСП-совместимую методику решения этой задачи через COM-соединение.
Перед тем как перейти к правильному коду, давайте проанализируем, почему стандартные «интуитивные» подходы, которые часто применяют разработчики, оказываются неработоспособными или даже опасными для целостности информационной базы.
ПользователиИнформационнойБазы, а затем отдельно создать элемент в справочнике Пользователи. При этом связь между ними (по уникальному идентификатору) настраивается некорректно или не настраивается вовсе. Это приводит к тому, что система «не видит» сопоставления между физическим входом в программу и его представлением в справочной системе.ОбменДанными.Загрузка = Истина при записи нового пользователя в справочник. Это действительно позволяет обойти системные ошибки при записи, но имеет катастрофические последствия. При включенном режиме загрузки БСП пропускает подписки на события. В результате не заполняются служебные регистры сведений (например, «Сведения о пользователях»), не формируются начальные настройки интерфейса, не генерируется кэш прав доступа, и пользователь не сможет полноценно работать в системе.ПользовательИБ.Роли.Добавить() — это грубейшее нарушение стандартов БСП. В ЗУП 3.1 и других современных конфигурациях управление правами осуществляется исключительно через Профили и Группы доступа. Если назначить роли напрямую в Конфигураторе или через код работы с пользователем ИБ, то при первом же входе этого пользователя в программу (или при выполнении регламентного обновления прав) система БСП обнаружит рассогласование, сотрет все ручные назначения и вернет роли в строгое соответствие с назначенными группами доступа.ГруппыДоступа тоже не рекомендуется. В базах с включенным ограничением прав на уровне записей (RLS) это не приведет к автоматическому обновлению оперативного кэша прав. Пользователь будет визуально отображаться в группе доступа, но фактически его права не изменятся до тех пор, пока администратор вручную не запустит обновление вспомогательных данных в базе.Выяснив причины проблем, давайте спроектируем правильную архитектуру программного создания пользователя через COM-соединение.
Для начала нам необходимо установить надежное соединение с целевой информационной базой ЗУП 3.1. Для этого мы используем стандартный COM-коннектор платформы 1С.
// Инициализируем подключение к базе данных
COMConnector = Новый COMОбъект("V83.COMConnector");
// Формируем строку подключения (для клиент-серверного варианта)
СтрокаПодключения = "Srvr=""ServerName"";Ref=""BaseName"";Usr=""Администратор"";Pwd=""ПарольАдмина"";";
Попытка
v8 = COMConnector.Connect(СтрокаПодключения);
Исключение
ВызватьИсключение "Не удалось установить COM-соединение: " + ОписаниеОшибки();
КонецПопытки;
Обратите внимание, что все дальнейшие вызовы методов, создание объектов и поиск элементов мы будем выполнять строго через полученную переменную соединения v8.
В БСП предусмотрен готовый программный интерфейс для одновременного создания пользователя информационной базы и элемента справочника Пользователи. Вся информация о параметрах аутентификации упаковывается в специальную структуру, которую нам возвращает метод общего модуля БСП. Запись элемента справочника автоматически инициирует корректное создание пользователя ИБ в единой транзакции.
Рассмотрим подробнее, как выглядит этот процесс в коде:
// 1. Создаем новый элемент справочника "Пользователи" в контексте COM-базы
НовыйПользователь = v8.Справочники.Пользователи.СоздатьЭлемент();
НовыйПользователь.Наименование = "Иванов Иван Иванович";
// 2. Получаем стандартную структуру описания пользователя ИБ из общего модуля БСП
// Важно вызывать этот метод через COM-соединение
ОписаниеПользователяИБ = v8.Пользователи.НовоеОписаниеПользователяИБ();
// Заполняем параметры аутентификации и входа в программу
ОписаниеПользователяИБ.Имя = "ИвановИИ";
ОписаниеПользователяИБ.ПолноеИмя = "Иванов Иван Иванович";
ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
ОписаниеПользователяИБ.Пароль = "StrongPassword2026";
ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Истина;
ОписаниеПользователяИБ.ВходВПрограммуРазрешен = Истина;
// 3. Помещаем структуру в ДополнительныеСвойства объекта справочника.
// Именно этот шаг указывает БСП, что при записи справочника нужно создать пользователя ИБ.
НовыйПользователь.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
// 4. Записываем элемент справочника
Попытка
НовыйПользователь.Записать();
ПользовательСсылка = НовыйПользователь.Ссылка;
Исключение
ВызватьИсключение "Ошибка при записи пользователя: " + ОписаниеОшибки();
КонецПопытки;
При таком подходе БСП самостоятельно выполнит все необходимые сопутствующие действия:
Теперь, когда пользователь успешно создан, нам необходимо предоставить ему права на работу в системе ЗУП 3.1. Как мы уже выяснили, делать это напрямую через роли нельзя. Мы должны включить его в соответствующую группу доступа.
Для автоматизации этой операции БСП предоставляет высокоуровневый программный интерфейс в модуле УправлениеДоступом. Метод ВключитьПрофильПользователю берет на себя всю рутину по сопоставлению пользователя с профилем, созданию или поиску персональных групп доступа и, что самое главное, выполняет корректный пересчет кэша прав доступа с учетом механизмов RLS.
Проанализируем пример кода для назначения прав:
// Нам нужно назначить пользователю стандартный профиль "Кадровик (без доступа к зарплате)"
ИмяПрофиля = "Кадровик (без доступа к зарплате)";
ПрофильСсылка = v8.Справочники.ПрофилиГруппДоступа.НайтиПоНаименованию(ИмяПрофиля);
Если ЗначениеЗаполнено(ПрофильСсылка) Тогда
Попытка
// Используем стандартный API БСП для включения пользователя в профиль
v8.УправлениеДоступом.ВключитьПрофильПользователю(ПользовательСсылка, ПрофильСсылка);
Исключение
ВызватьИсключение "Не удалось назначить профиль доступа: " + ОписаниеОшибки();
КонецПопытки;
Иначе
ВызватьИсключение "Профиль доступа '" + ИмяПрофиля + "' не найден в целевой базе!";
КонецЕсли;
Этот лаконичный вызов гарантирует, что пользователь мгновенно получит весь спектр необходимых ролей, интерфейсов и ограничений видимости данных, предусмотренных для этой должности, а администратору системы не придется вручную актуализировать права доступа в режиме предприятия.
Мы спроектировали и реализовали надежный, полностью соответствующий стандартам разработки «1С» алгоритм создания пользователя через внешнее COM-соединение. Использование стандартных интерфейсов БСП, таких как Пользователи.НовоеОписаниеПользователяИБ() и УправлениеДоступом.ВключитьПрофильПользователю(), убережет вашу систему от логических ошибок, сбоев RLS и рассинхронизации данных при последующих обновлениях конфигурации 1С:ЗУП.