Почему роли пользователя 1С не присваиваются программно и как это исправить?

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

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

Причины сброса и неназначения ролей

Проанализируем архитектуру подсистемы безопасности типовых конфигураций, созданных на базе Библиотеки стандартных подсистем (БСП):

  1. Динамическое управление доступом через БСП: В типовых решениях роли пользователя формируются не напрямую в объекте ПользовательИнформационнойБазы, а рассчитываются автоматически на основании связанных данных справочников ГруппыДоступа и ПрофилиГруппДоступа. При любой записи элемента справочника Пользователи, выполнении регламентных заданий или входе пользователя в систему подсистема сверяет текущий состав ролей в ИБ с рассчитанным эталоном. Все роли, добавленные разработчиком «напрямую» через платформенный объект ИБ, система воспринимает как несанкционированные и удаляет.
  2. Ошибки привязки идентификатора пользователя: Реквизит ИдентификаторПользователяИБ справочника Пользователи имеет системный тип УникальныйИдентификатор (UUID). Ошибочная передача в него строки (например, имени пользователя) нарушает целостность связки между учетной записью ИБ и справочником Пользователи.
  3. Добавление новой роли без обновления вспомогательных данных: Если новая роль была только что создана в конфигураторе или расширении, она отсутствует в таблицах служебных данных БСП (в частности, в справочнике ИдентификаторыОбъектовМетаданных). До выполнения регламентного обновления БСП не сможет учесть эту роль в правах доступа.

Способ 1. Назначение прав через профили и группы доступа (штатный путь БСП)

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

Посмотрим на пример привязки профиля к пользователю через модуль УправлениеДоступом:


ПользовательСсылка = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И.");
ПрофильСсылка = Справочники.ПрофилиГруппДоступа.НайтиПоНаименованию("Бухгалтер");

// Назначение профиля средствами подсистемы БСП
УправлениеДоступом.ВключитьПрофильПользователю(ПользовательСсылка, ПрофильСсылка);

Если доступ в конфигурации организован через группы доступа, добавим пользователя непосредственно в состав участников группы:


ГруппаОбъект = Справочники.ГруппыДоступа.НайтиПоНаименованию("Бухгалтерия").ПолучитьОбъект();

СтрокаПользователя = ГруппаОбъект.Пользователи.Добавить();
СтрокаПользователя.Пользователь = ПользовательСсылка;

ГруппаОбъект.Записать();

Способ 2. Корректное программное создание пользователя и назначение прав

Разберем по шагам создание нового пользователя с использованием стандартов БСП, чтобы все связи учетной записи и подсистемы доступа сформировались без ошибок:


// Шаг 1. Формирование структуры описания пользователя ИБ
ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
ОписаниеПользователяИБ.Имя = "Ivanov";
ОписаниеПользователяИБ.ПолноеИмя = "Иванов Иван Иванович";
ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
ОписаниеПользователяИБ.ВходВПрограммуРазрешен = Истина;
ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Истина;
ОписаниеПользователяИБ.Язык = "Русский";

// Шаг 2. Создание элемента справочника Пользователи
ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент();
ПользовательОбъект.Наименование = ОписаниеПользователяИБ.ПолноеИмя;
ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
ПользовательОбъект.Записать();

// Шаг 3. Привязка прав через профиль доступа
ПрофильСсылка = Справочники.ПрофилиГруппДоступа.НайтиПоНаименованию("Администратор");
УправлениеДоступом.ВключитьПрофильПользователю(ПользовательОбъект.Ссылка, ПрофильСсылка);

Способ 3. Принудительное обновление ролей в информационной базе

Если группы доступа или профили назначены программно, но состав ролей пользователя ИБ еще не пересчитался, выполним принудительное обновление состава ролей:


УправлениеДоступомСлужебный.ОбновитьРолиПользователей(ПользовательОбъект.Ссылка);

Важные нюансы при работе с правами и ролями

  1. Сеанс пользователя: Изменение ролей пользователя информационной базы применяется только при следующем входе. Если пользователь уже работает в системе, ему необходимо перезапустить сеанс.
  2. Привилегированный режим: Программное управление составом пользователей ИБ и профилями доступа требует полных прав. Если код выполняется в контексте пользователя с ограниченными правами, необходимо использовать вызов УстановитьПривилегированныйРежим(Истина) или выполнять процедуру в привилегированном общем модуле.
  3. Обновление метаданных: Если новая роль была добавлена разработчиком в дерево метаданных, перед её включением в профили групп доступа необходимо выполнить обновление служебных данных (например, через процедуру ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеДанныхТекущейВерсии() или обработку «Обновление вспомогательных данных»).
← На главную