Многие разработчики и администраторы 1С сталкиваются с проблемой, когда роли, созданные в расширениях конфигурации, по прошествии некоторого времени автоматически отключаются у пользователей. Это приводит к потере функциональности расширений для конечных пользователей, особенно тех, у кого нет полных прав. В данном материале мы подробно разберем, почему возникает эта проблема, какие механизмы платформы и типовых конфигураций (особенно использующих Библиотеку стандартных подсистем – БСП) могут вызывать такое поведение, и как мы можем решить эту задачу, используя как стандартные средства, так и модификации через расширения.
Основная причина автоматического отключения ролей кроется в системных механизмах управления доступом, которые могут перезаписывать или очищать назначенные роли. Часто это происходит после обновлений конфигурации, при сохранении профилей в режиме предприятия или из-за специфической логики обработки прав для пользователей с полными правами.
Прежде чем перейти к решениям, давайте глубже проанализируем корневые причины, по которым роли из расширений могут "слетать" или отключаться. Понимание этих механизмов поможет нам выбрать наиболее подходящий и устойчивый способ исправления ситуации.
УправлениеДоступомСлужебный: В конфигурациях на базе БСП существует служебная процедура ОбновитьРолиПользователей в общем модуле УправлениеДоступомСлужебный. Эта процедура периодически или при определенных событиях пересчитывает и актуализирует права пользователей. В частности, для пользователей, отнесенных к администраторам (имеющих предопределенный профиль групп доступа «Администратор» или «Полные права»), эта процедура может очищать все роли и оставлять только те, которые, по мнению БСП, необходимы администратору, игнорируя при этом роли, добавленные расширениями. Это является основной причиной "слетания" ролей именно для пользователей с полными правами.Таким образом, проблема является многогранной и требует комплексного подхода, учитывающего как способ назначения ролей, так и специфику обработки прав для администраторов.
Для большинства пользователей, не обладающих полными правами, наиболее правильным и устойчивым способом назначения ролей из расширений является использование штатных механизмов управления доступом в пользовательском режиме. Этот подход обеспечивает сохранение назначенных ролей даже после обновлений и синхронизации прав. При необходимости можно использовать инструмент для управления правами, профилями и группами доступа.
Рассмотрим по шагам, как мы можем корректно назначить роли из расширения, чтобы они не отключались автоматически:
НСИ и администрирование.Настройки пользователей и прав.Настройках пользователей и прав найдите пункт Профили групп доступа и откройте его.Создать.Настройки пользователей и прав и откройте пункт Группы доступа.Создать группу.Профиль. Таким образом, все пользователи, которые будут включены в эту группу, автоматически получат права, определенные выбранным профилем.Участники.Подобрать или Добавить, чтобы включить в эту группу конкретных пользователей, для которых мы хотим, чтобы роли из расширения были активны.Важный момент: Мы категорически не рекомендуем использовать конфигуратор для назначения ролей пользователям, если конфигурация использует БСП и поддерживает управление правами в пользовательском режиме. Этот метод устарел и приводит к нестабильному поведению, как мы уже выяснили. Если мы придерживаемся описанного выше подхода, роли из расширений будут сохраняться и корректно применяться для обычных пользователей.
Ситуация с пользователями, обладающими полными правами (администраторами), является более сложной и требует особого внимания. Как мы уже упоминали, механизмы БСП по умолчанию стремятся "очистить" список ролей для администраторов, считая, что полные права уже предоставляют доступ ко всему необходимому. Это может приводить к конфликтам и автоматическому отключению ролей из расширений, даже если мы назначили их через пользовательский режим.
Давайте подробно проанализируем эту ситуацию:
Лучшая практика: Мы настоятельно рекомендуем не добавлять роли из расширений пользователям с полными правами, если в этом нет крайней, технически обоснованной необходимости. Большинство объектов, добавленных в расширение, по умолчанию должны быть доступны при наличии полных прав без явного назначения дополнительных ролей. Если же возникла потребность в ограничении доступа только по наличию роли для администраторов, мы предлагаем рассмотреть альтернативные варианты: проверку по группам пользователей, группам прав или модификацию механизмов доступа внутри расширения (например, заимствование роли ПолныеПрава в расширение и явное указание необходимых прав для объектов расширения).
Несмотря на рекомендации избегать назначения дополнительных ролей администраторам, существуют ситуации, когда это становится неизбежным или является наиболее простым обходным путем для решения конкретной задачи. В таких случаях мы можем модифицировать стандартную логику БСП, используя собственное расширение конфигурации. Для этой задачи можно использовать готовое решение для защиты ролей из расширений от автоматического удаления.
Как мы уже выяснили, процедура ОбновитьРолиПользователей в общем модуле УправлениеДоступомСлужебный отвечает за актуализацию ролей и может сбрасывать роли из расширений для администраторов. Мы можем вмешаться в ее работу, используя расширение конфигурации в режиме "ИзменениеИКонтроль", чтобы явно указать системе сохранять наши роли.
УправлениеДоступомСлужебный. Для этого в дереве объектов расширения находим Общие модули, затем УправлениеДоступомСлужебный, вызываем контекстное меню (правая кнопка мыши) и выбираем Добавить в расширение.ИзменениеИКонтроль. Это позволит нам внедрить свой код в середину существующей процедуры, не перезаписывая ее целиком.ОбновитьРолиПользователей:
ОбновитьРолиПользователей.
Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
ТекущиеНовыеРоли = НовыеРоли;
НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив);
Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
НовыеРоли.Добавить.Роль = КлючИЗначение.Ключ;
КонецЦикла;
Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл
Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Ключ, "Роль") = Неопределено Тогда
Продолжить;
КонецЕсли;
НовыеРоли.Добавить.Роль = КлючИЗначение.Ключ;
КонецЦикла;
// ... здесь будет наша вставка ...
КонецЕсли;
Наша задача – вставить код таким образом, чтобы он добавлял в список НовыеРоли те роли из расширений, которые были у пользователя до обновления, но не были учтены стандартной логикой БСП. Место для вставки будет непосредственно перед КонецЕсли; этого блока.
ОбновитьРолиПользователей после всех стандартных циклов обработки ролей администратора, но до завершения условного блока Если Администраторы[ТекущийПользователь] <> Неопределено Тогда:
#Вставка
Для Каждого СтрРоль Из ТекущиеНовыеРоли Цикл
Если ТипЗнч(СтрРоль.РольСсылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда
ЗаполнитьЗначенияСвойств(НовыеРоли.Добавить(), СтрРоль);
КонецЕсли;
КонецЦикла;
#КонецВставки
Разберем этот код подробно:
ТекущиеНовыеРоли: Это переменная, которая в начале блока сохраняет исходный список ролей, которые были у пользователя до начала процесса обновления. Мы используем его, чтобы определить, какие роли, возможно, были "потеряны".Для Каждого СтрРоль Из ТекущиеНовыеРоли Цикл: Мы перебираем все роли, которые были у пользователя изначально.Если ТипЗнч(СтрРоль.РольСсылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда: Это ключевое условие. Мы проверяем тип значения поля РольСсылка для каждой строки роли. Если тип этой ссылки равен СправочникСсылка.ИдентификаторыОбъектовРасширений, это означает, что данная роль относится к объекту, который был создан в расширении. 1С хранит ссылки на объекты расширений именно в этом служебном справочнике.ЗаполнитьЗначенияСвойств(НовыеРоли.Добавить(), СтрРоль);: Если роль идентифицирована как роль из расширения, мы добавляем новую строку в таблицу НовыеРоли (которая затем будет сохранена для пользователя) и копируем в нее все свойства из текущей строки СтрРоль. Функция Добавить() для табличной части (или аналогичного объекта) создает новую строку, а ЗаполнитьЗначенияСвойств копирует данные.Этот код гарантирует, что любые роли, которые мы назначили пользователю с полными правами (через пользовательский режим), и которые относятся к расширениям, будут принудительно добавлены обратно в список ролей после обработки стандартной логикой БСП. Таким образом, даже для администраторов роли из расширений останутся активными.
Мы рассмотрели проблему автоматического отключения ролей из расширений 1С у пользователей, выявив основные причины, связанные как с неправильным подходом к назначению прав (использование конфигуратора вместо пользовательского режима), так и со спецификой работы механизмов БСП, особенно для администраторов с полными правами.
Для обычных пользователей без полных прав, мы выяснили, что наиболее стабильным и рекомендуемым решением является назначение ролей исключительно в пользовательском режиме через систему Профилей групп доступа и Групп доступа. Этот подход соответствует современной архитектуре платформы и обеспечивает устойчивость назначенных прав.
Для пользователей с полными правами (администраторов) ситуация оказалась более нюансированной. Мы определили, что в большинстве случаев нет необходимости назначать дополнительные роли из расширений, поскольку полные права уже предоставляют доступ ко всем объектам. Более того, добавление избыточных ролей может даже негативно сказаться на производительности. Однако, если существует критическая потребность в сохранении определенных ролей расширений для администратора (например, для активации специфических интерфейсных элементов), мы предложили эффективное обходное решение: модификацию процедуры ОбновитьРолиПользователей в общем модуле УправлениеДоступомСлужебный через расширение с использованием режима ИзменениеИКонтроль. Данная модификация позволяет явно "спасать" роли, которые ссылаются на объекты расширений, от автоматического удаления.
Выбирая подходящее решение, мы рекомендуем всегда начинать с правильной организации прав в пользовательском режиме и лишь в случае обоснованной необходимости для администраторов прибегать к модификации стандартных механизмов БСП.