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

04.04.19

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

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

Скачать исходный код

Наименование Файл Версия Размер
Расширение1 - Роли
.cfe 6,70Kb
25
.cfe 6,70Kb 25 Скачать

Добрый день!

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

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

В какой-либо конфигурации на управляемых формах создаём свою роль (или несколько ролей, как в примере) (см. рис.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    14462    22    32    

33

Настройка аутентификации в 1С с использованием стандарта RFC 7519 (JWT)

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

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

27.02.2024    3009    PROSTO-1C    9    

31

Device flow аутентификация, или туда и обратно

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

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

1 стартмани

27.10.2023    1700    platonov.e    1    

23

Анализатор безопасности базы сервера 1С

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

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

5 стартмани

24.04.2023    5541    17    soulner    7    

29

Двухфакторная аутентификация в 1С через Telegram и Email

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

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

2 стартмани

08.12.2022    6073    33    Silenser    12    

23

История одного взлома или проверьте вашу систему на безопасность

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

От клиента клиенту, от одной системы к другой, мы вновь и вновь встречаем одни и те же проблемы и дыры в безопасности. На конференции Infostart Event 2021 Post-Apocalypse Виталий Онянов рассказал о базовых принципах безопасности информационных систем и представил чек-лист, с помощью которого вы сможете проверить свою систему на уязвимость.

26.10.2022    9380    Tavalik    46    

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


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

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

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

Выход: скопировать роль полные права.
Создать профиль в котором добавить эту роль и создать отдельную группу "полные права без полных прав" включив в нее ранее созданный профиль.
+
6. orion_king 08.04.19 09:57 Сейчас в теме
Не проще ли разрешить добавлять новые роли администратору закомментив 1 строку?
//НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив); // у администратора все равно добавлять роли
+
7. dmitriy_saladin 133 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 157 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 17 04.07.22 19:45 Сейчас в теме
(11) Спасибо, добрый человек тебе и автору!
+
13. resonance 81 27.06.20 03:03 Сейчас в теме
Мне помогло. Спасибо. Розница 2.2 (2.2.8.27)
+
15. mov68 37 30.12.20 09:17 Сейчас в теме
Спасибо, использую
+
16. kaps22 19 04.03.22 20:54 Сейчас в теме
Спасибо! В ERP (2.5.7.226) пригодилось!
+
18. psa247 17 04.07.22 19:47 Сейчас в теме
Реально столкнулся с затиранием прав в УНФ 1.6 выданных пользователю в расширении. Благодаря этой статье решил свою проблему в разы быстрее, спасибо!
+
19. FilipN 11.03.24 13:42 Сейчас в теме
Большое спасибо автору.
Была аналогичная ситуация. Конфигурация УНФ 3.0
В том же модуле есть код который непосредственно заполняет таблицу значений ролями которые предназначены для удаления:

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


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


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


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