Особенность при создании своих ролей в конфигурациях на управляемых формах

04.04.19

Администрирование - Информационная безопасность

Столкнулся с небольшой проблемкой при создании "своих" ролей в конфигураторе и добавлении их пользователям. Пользователю не добавляются созданные в конфигураторе роли, 1С 8.3, Управляемые формы. Гуглил много, ответа толкового не нашёл, поэтому пришлось разбираться самому и как результат, решил поделиться опытом. Возможно, кому-то пригодится.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Расширение1 - Роли
.cfe 6,70Kb
27
27 Скачать (1 SM) Купить за 1 850 руб.

Добрый день!

Столкнулся с небольшой проблемкой при создании "своих" ролей в конфигураторе и добавлении их пользователям. Гуглил много, ответа толкового не нашёл, поэтому пришлось разбираться самому и как результат, решил поделиться опытом. Возможно кому-то пригодится.

Итак, проблема заключалась в следующем:

В какой-либо конфигурации на управляемых формах создаём свою роль (или несколько ролей, как в примере) (см. рис.1), обновляем конфигурацию. В режиме предприятия создаём профиль групп доступа с нашей новой ролью (см. рис.2), добавляем пользователю этот профиль (см. рис.3) и... ничего не происходит, как-будто у этого пользователя не добавлена наша роль. Заходим в конфигуратор, администрирование, пользователи, заходим в пользователя, смотрим "доступные роли" и видим, что у нашего пользователя не выбрана наша роль (см. рис.4).

Почему так происходит? Всё очень просто, разработчики сделали так, что если пользователь "администратор", то есть у него полные права, то собственно говоря, зачем же ему ещё какие-то роли? Ведь у него же и так полные права!

В целом вполне логично и кстати если пользователь не администратор, то всё работает корректно (см. рис.5 и рис.6). Сложности возникают только в том случае, если мы хотим добавить нашу роль/роли пользователю с полными правами. Можно конечно просто в конфигураторе выбрать у пользователя нашу роль/роли, но всё будет работать ровно до тех пор, пока кто-нибудь не решит перезаписать в режиме предприятия права доступа у этого пользователя, после этого "галочка" у добавленной роли "слетит".

Что же делать и где это происходит?

Идём в общие модули - "УправлениеДоступомСлужебный", находим процедуру "ОбновитьРолиПользователей". В ней есть следующий код:

Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
	ТекущиеНовыеРоли = НовыеРоли;
	НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив);
	Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
		НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
	КонецЦикла;
	Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл
		Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Ключ, "Роль") = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
	КонецЦикла;	
КонецЕсли;

"НовыеРоли" это Таблица значений, в которой выбраны все роли пользователя, которые мы ему назначили в режиме предприятия (включая "наши" роли). Как видно далее по коду, эта таблица очищается, в неё добавляются "ОбязательныеРолиАдминистратора" (Администратор системы, Полные права) и если выбрано, "ДополнительныеРолиАдминистратора" (Интерактивное открытие внешних отчетов и обработок).

Как мне показалось, самый простой и очевидный вариант, это добавить "наши" роли в таблицу "НовыеРоли". Для этого нам надо как-то отделить эти роли от всех остальных, поэтому у всех добавленных нами в конфигураторе ролей, делаем префикс "Доп_". Те "наши" роли, которые мы выбрали для пользователя, собираем в массив "ВыбранныеДополнительныеРоли" и далее из этого массива добавляем роли в таблицу значений "НовыеРоли". Ниже представлен код:

Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
	ТекущиеНовыеРоли = НовыеРоли;
	НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив);
	Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
		НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
	КонецЦикла;
	Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл
		Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Ключ, "Роль") = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
	КонецЦикла;
	
	//Если для пользователя выбраны "наши" дополнительные роли, то добавляем их в таблицу "НовыеРоли"
	ВыбранныеДополнительныеРоли = Новый Массив;
	Для Каждого Стр Из ТекущиеНовыеРоли Цикл
		Если ВРег(Лев(Стр.Роль, 4)) = "ДОП_" Тогда
			ВыбранныеДополнительныеРоли.Добавить(Стр.Роль);
		КонецЕсли;
	КонецЦикла;
	Для Каждого Стр Из ВыбранныеДополнительныеРоли Цикл
		НовыеРоли.Добавить().Роль = Стр;
	КонецЦикла;
	
КонецЕсли;

И всё работает!

В заключение добавлю, процедура "ОбновитьРолиПользователей" абсолютна одинакова у многих конфигураций (благодаря "унификации" 1С), смотрел в УНФ 1.6, Бухгалтерия предприятия 3.0, Управление торговлей 11.4 (все конфигурации в нескольких версиях), поэтому сделал расширение, которое по идее должно работать на многих конфигурациях на управляемых формах. Можете скачать и добавить его себе, но предварительно не забудьте, что все добавленные роли должны иметь префикс "Доп_". Расширение написано на версии платформы: 8.3.12.1685. В расширение добавлен один общий модуль "УправлениеДоступомСлужебный", в котором только одна процедура "ОбновитьРолиПользователей" (&Вместо) с добавленным, по описанию выше, кодом. При добавлении расширения, не забываем снять галочки "безопасный режим" и "защита от опасных действий".

См. также

Информационная безопасность Системный администратор Программист Платные (руб)

AUTO VPN (portable) - автоматизация подключения пользователей к удаленному рабочему месту или сети посредством создания автоматического VPN (L2TP или L2TP/IPSEC и т.д.) подключения без ввода настроек пользователем (с возможностью скрытия этих настроек от пользователя). Программа автоматически выполняет подключение к VPN серверу и после успешного коннекта , если необходимо, подключение к серверу удаленных рабочих столов (RDP).

1200 руб.

24.03.2020    15365    25    32    

35

Информационная безопасность Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Предлагается внешняя обработка для просмотра данных в формате ASN1. Есть 2 режима: загрузка из бинарного формата и из BASE64. Реализована функция извлечения всех сертификатов, которые можно найти в ASN1-файле. В дополнении к этому продукту предлагается методическая помощь по вопросам, связанным с технической реализацией криптографии и шифрования в 1С.

2400 руб.

29.08.2016    30053    9    1    

10

Информационная безопасность Пароли Платформа 1С v8.3 Бесплатно (free)

Все еще храните пароли в базе? Тогда мы идем к вам! Безопасное и надежное хранение секретов. JWT авторизация. Удобный интерфейс. Демо конфигурация. Бесплатно.

30.05.2024    6209    kamisov    17    

60

Информационная безопасность Программист Платформа 1С v8.3 Бесплатно (free)

Рассмотрим в статье более подробную и последовательную настройку аутентификации в 1С с использованием распространенной технологии JWT, которая пришла в программу в платформе версии 8.3.21.1302.

27.02.2024    7315    PROSTO-1C    10    

39

Информационная безопасность Программист Платформа 1С v8.3 Абонемент ($m)

Интеграционные решения стали неотъемлемой частью нашей жизни. Правилом хорошего тона в современных приложениях является не давать интегратору доступ к чувствительным данным. Device flow позволяет аутентифицировать пользователя, не показывая приложению чувствительные данные (например: логин и пароль)<br> Рассмотрим Device flow аутентификацию, в приложении, на примере OpenID провайдера Yandex.

1 стартмани

27.10.2023    2410    platonov.e    1    

23

Информационная безопасность Системный администратор Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Продукты на основе решений 1С уверенной поступью захватывают рынок учётных систем в стране. Широкое распространение программ всегда порождает большой интерес к ним со стороны злоумышленников, а пользователь 1С это одна из дверей в защищённый информационный контур предприятия. Обработка позволяет быстро и комплексно оценить настройки безопасности конкретной базы и возможности пользователя этой базы на сервере. Также можно оценить некоторые аспекты сетевой безопасности предприятия со стороны сервера 1С.

5 стартмани

24.04.2023    6252    20    soulner    8    

32

Информационная безопасность Системный администратор Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

1С, начиная с версии платформы 8.3.21, добавили в систему возможность двойной аутентификации. Как это работает: в пользователе информационной базы появилось свойство «Аутентификация токеном доступа» (АутентификацияТокеномДоступа во встроенном языке), если установить этот признак и осуществить ряд манипуляций на встроенном языке, то появляется возможность при аутентификации отправлять HTTP запросы, которые и реализуют этот самый второй фактор. Данное расширение позволяет организовать двухфакторную аутентификацию с помощью электронной почты или мессенджера Telegram.

2 стартмани

08.12.2022    7278    50    Silenser    12    

24
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. PerlAmutor 155 29.10.18 12:05 Сейчас в теме
(0)
В заключение добавлю, процедура "ОбновитьРолиПользователей" абсолютна одинакова у многих конфигураций (благодаря "унификации" 1С), смотрел в УНФ 1.6, Бухгалтерия предприятия 3.0, Управление торговлей 11.4 (все конфигурации в нескольких версиях), поэтому сделал расширение,


В ERP 2.1.3.93 нет такого участка кода. Тоже заметил, что функция РольДоступна() с новой ролью срабатывает не всегда. А вот Пользователи.РолиДоступны() работает как надо, поэтому использую теперь её вместо встроенной.
odinsmot; +1 Ответить
2. A_Max 20 29.10.18 18:18 Сейчас в теме
(0) Потому что нужно придерживаться гайдлайнов от 1С и НЕ ИСПОЛЬЗОВАТЬ роль "Полные права" у реальных пользователей. Для администраторов заводятся специальные профили с определнным перечнем прави и эти особенные профили (как правильно заметил PerlAmutor) проверяются в функции Пользователи.РолиДоступны().

Так что, плохое решение предложено вами.
3. PerlAmutor 155 30.10.18 06:51 Сейчас в теме
Для полноты картины думаю правильным будет привести ссылку на "гайдлайн" от 1С: https://its.1c.ru/db/v8std/content/2149184386/hdoc
10. pvlunegov 158 18.03.20 12:22 Сейчас в теме
ваша ссылка уже не работает.
4. kwazi 659 30.10.18 11:10 Сейчас в теме
есть еще вариант решения проблемы.
Добавить в расширение роль Полные права и в ней дать права на объекты созданные в расширении.
kabantus; BARBAROSSA88; +2 Ответить
5. almas 258 02.11.18 10:10 Сейчас в теме
Добрый день. Только вчера с ролями мучился. Хотел уже писать отдельную статью.

Ситуация такова: 1с ужесточили порядок назначения ролей.
Если пользователя включили в несколько групп доступа, то:
если вы включаете пользователя в группу администраторов в конфигураторе исчезают(снимаются галки) с ролей входящих в другие группы. Как только пользователя убираем из группы администратор - все восстанавливается.

Выход: скопировать роль полные права.
Создать профиль в котором добавить эту роль и создать отдельную группу "полные права без полных прав" включив в нее ранее созданный профиль.
6. orion_king 08.04.19 09:57 Сейчас в теме
Не проще ли разрешить добавлять новые роли администратору закомментив 1 строку?
//НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив); // у администратора все равно добавлять роли
7. dmitriy_saladin 137 08.04.19 10:26 Сейчас в теме
(6) В таком случае у администратора будут добавлены вообще все выбранные роли. А в предложенном мной варианте, будут только те, что должны быть (Администратор системы, Полные права) и добавленные в конфигурацию роли с префиксом "Доп_".
8. orion_king 15.04.19 11:17 Сейчас в теме
А потом добавлять все роли с префиксом, если нужно другой префикс то его либо добавлять после "Доп_" либо вставлять еще кусок кода? (на мой взгляд лишний геморрой)

Гораздо проще и нужнее, на мой взгляд, добавлять то что именно ты ему проставил.
user803412; +1 Ответить
9. beerkeen 05.09.19 15:58 Сейчас в теме
Cамый простой и очевидный вариант - просто закомментарить этот кусок.
11. pvlunegov 158 18.03.20 12:36 Сейчас в теме
Огромное спасибо автору.
У меня была аналогичная ситуация. Конфигурация 1с ERP 2.4.8.82
Внес изменения в код общего модуля, все стало ок.
Должен заметить, доработал изменения в коде, обозначенные автором. Вот:
Код
   Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
      ТекущиеНовыеРоли = НовыеРоли;
      НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив);
      Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
         НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
      КонецЦикла;
      Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл
         Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Ключ, "Роль") = Неопределено Тогда
            Продолжить;
         КонецЕсли;
         НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
      КонецЦикла;
      
      //Если для пользователя выбраны "наши" дополнительные роли, то добавляем их в таблицу "НовыеРоли"
      
      // ДОБАВКИ +++
      Для каждого Строка Из ТекущиеНовыеРоли Цикл
         Если ВРег(Лев(Строка.Роль, 4)) = "рив_" или ВРег(Лев(Строка.Роль, 3)) = "ТС_" Тогда
            НовыеРоли.Добавить().Роль = Строка.Роль;
         КонецЕсли;
      КонецЦикла;
      // ДОБАВКИ ---
               
      ВыбранныеДополнительныеРоли = Новый Массив;
      Для Каждого Стр Из ТекущиеНовыеРоли Цикл
         Префикс = ВРег(Лев(Стр.Роль, 4));
         Если Префикс = "рив_" или Префикс = "ТС_" Тогда
            ВыбранныеДополнительныеРоли.Добавить(Стр.Роль);
         КонецЕсли;
      КонецЦикла;
      Для Каждого Стр Из ВыбранныеДополнительныеРоли Цикл
         НовыеРоли.Добавить().Роль = Стр;
      КонецЦикла;
   КонецЕсли;
Показать полностью
12. crash-16 27.03.20 15:46 Сейчас в теме
(11)
Как ВРег(Лев(Стр.Роль, 4)) может быть равно "ТС_"???

Другими словами как строка из 4 символов может быть равна строке из 3 символов?

Как ВРег(Лев(Стр.Роль, 4)) может быть равно "рив_"?

Зачем вы поднимаете в верхний регистр значение которое обрезаете и сравниваете его со строкой заведомо в нижнем?

Ну и самое главное зачем функционал добавок дублируется ниже, только через переменную?
17. psa247 21 04.07.22 19:45 Сейчас в теме
(11) Спасибо, добрый человек тебе и автору!
13. resonance 82 27.06.20 03:03 Сейчас в теме
Мне помогло. Спасибо. Розница 2.2 (2.2.8.27)
15. mov68 37 30.12.20 09:17 Сейчас в теме
16. kaps22 20 04.03.22 20:54 Сейчас в теме
Спасибо! В ERP (2.5.7.226) пригодилось!
18. psa247 21 04.07.22 19:47 Сейчас в теме
Реально столкнулся с затиранием прав в УНФ 1.6 выданных пользователю в расширении. Благодаря этой статье решил свою проблему в разы быстрее, спасибо!
19. FilipN 11.03.24 13:42 Сейчас в теме
Большое спасибо автору.
Была аналогичная ситуация. Конфигурация УНФ 3.0
В том же модуле есть код который непосредственно заполняет таблицу значений ролями которые предназначены для удаления:

Для Каждого Роль Из ПользовательИБ.Роли Цикл
		    ИмяРоли = Роль.Имя; 
			СтарыеРоли.Вставить(ИмяРоли, Истина);
			Если НовыеРоли.Найти(ИмяРоли, "Роль") = Неопределено Тогда
				РолиДляУдаления.Вставить(ИмяРоли, Роль);
			КонецЕсли;
		  КонецЦикла;


Сделал немного по другом чем у автора (от обратного), по итогу нужные нам роли не добавляются в таблицу для удаления:


 Для Каждого Роль Из ПользовательИБ.Роли Цикл
		    ИмяРоли = Роль.Имя; 
		    Префикс = (Лев(ИмяРоли, 11)); // проверка на нужную нам роль
			СтарыеРоли.Вставить(ИмяРоли, Истина);
			Если НовыеРоли.Найти(ИмяРоли, "Роль") = Неопределено и Префикс <> "НужнаяРоль_" Тогда
				РолиДляУдаления.Вставить(ИмяРоли, Роль);
			КонецЕсли;
		  КонецЦикла;


Предварительно надо проставить в доступных пользователю ролях нужные роли. Затирание прав прекратится.
Оставьте свое сообщение