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