Окончательное решение вопроса RLS на чтение в 1С

Сколько копий было сломано относительно RLS на чтение. Пожалуй, это самая главная проблема прав доступа, которую не могли решить программисты 1С.

Все остальное так или иначе делалось кодом, а вот в RLS на чтение приходилось ковыряться в ролях руками. На худой конец — с помощью парсеров, но их никто так и не написал.

Суть проблемы в чем. Допустим, есть RLS по организации и складу.

А затем по некоторым документам нужно добавить RLS по проектам.

При этом нужно было вручную во всех объектах менять RLS-запрос, добавлять отбор по проектам. И шаблоны тут не могли помочь.

Решение я придумал только сейчас, 20 февраля 2026 года. Оно было всегда под носом, как часто бывает.

Оно заключается в том, что для каждого объекта прописываем нужное нам условие в одном шаблоне RLS Общий:

Окончательное решение вопроса RLS на чтение в 1С

Вот пример такого условия:

#Если "Справочник.Номенклатура" = #ИмяТекущейТаблицы #Тогда ГДЕ Истина #КонецЕсли
#Если "Справочник.Контрагенты" = #ИмяТекущейТаблицы #Тогда ГДЕ Ссылка.Наименование ПОДОБНО "а%" #КонецЕсли

Проверяем на контрагентах, без RLS у нас такой список:

Окончательное решение вопроса RLS на чтение в 1С

С RLS только те контрагенты, что начинаются на букву «а»:

Окончательное решение вопроса RLS на чтение в 1С

На практике, конечно, будут более осмысленные тексты запросов, например:

#Если "Справочник.Склады" = #ИмяТекущейТаблицы #Тогда ГДЕ Ссылка В (&ДоступныеСклады) #КонецЕсли
#Если "Документ.ПоступлениеТоваров" = #ИмяТекущейТаблицы #Тогда ГДЕ Склад В (&ДоступныеСклады) И Организация В (&ДоступныеОрганизации) #КонецЕсли

Сам текст запросов можно по каждому объекту сгенерировать кодом и вставить уже в шаблон.

Наконец-то программисты 1С избавлены от рутины с правами доступа RLS!

Суть моего гениального решения в RLS понятна любому 1с-нику, знакомому с RLS, но попробую объяснить его программистам из других отраслей.

Итак, 1с для каждого объекта (номенклатура, приходная накладная, расходная накладная, …) позволяет наложить ограничение доступа — Record Level Security (RLS).

Но в каждый объект надо заходить и прописывать это ограничение руками. Это может выглядеть так:

  • Приходная накладная: Организация в &ДоступныеОрганизации и Склад в &ДоступныеСклады
  • Расходная накладная: Организация в &ДоступныеОрганизации и Склад в &ДоступныеСклады
  • Организации: Организация в &ДоступныеОрганизации
  • Склады: Склад в &ДоступныеСклады

Как видите, тут есть повторяющиеся фрагменты, поэтому билиотека БСП в 1С вам предложит использовать шаблоны:

  • Приходная накладная: ШаблонПрав(«Организация, Склад»)
  • Расходная накладная: ШаблонПрав(«Организация, Склад»)
  • Организации: ШаблонПрав(«Организация»)
  • Склады: ШаблонПрав(«Склад»)

Стало выглядеть короче, да?

Но что, если вы захотите сделать отбор по проекту? Правила с учетом применения шаблонов должны выглядеть так:

  • Приходная накладная: ШаблонПрав(«Организация, Склад, Проект»)
  • Расходная накладная: ШаблонПрав(«Организация, Склад, Проект»)
  • Организации: ШаблонПрав(«Организация»)
  • Склады: ШаблонПрав(«Склад»)
  • Проекыт: ШаблонПрав(«Проект»)

Вы обратили внимание, что мы должны зайти в каждый объект и вручную поправить правило. А таких шаблонов может быть много, несколько десятков, а то и сотни.

Поэтому желание вносить изменения в RLS на чтение очень быстро исчезает. К тому же все эти доработки слетят при обновлении 1С. Выход был бы в написании парсера ролей, чтобы выгрузить роли в XML-файлы, поправить, потом загрузить их обратно, но это довольно сложно и никто так и не сподобился его написать.

Суть моего решения в том, чтобы всем объектам прописать общее правило Основной:

  • Приходная накладная: Основной
  • Расходная накладная: Основной
  • Организации: Основной
  • Склады: Основной
  • Проекты: Основной

А уже содержание шаблона Основной будет представлять собой один длинный текст, где для каждого вида объектов будет свое правило RLS:

#Если "Справочник.Склады" = #ИмяТекущейТаблицы #Тогда ГДЕ Ссылка В (&ДоступныеСклады) #КонецЕсли
#Если "Справочник.Организации" = #ИмяТекущейТаблицы #Тогда ГДЕ Ссылка В (&ДоступныеОрганизации) #КонецЕсли
#Если "Документ.ПриходнаяНакладная" = #ИмяТекущейТаблицы #Тогда ГДЕ Склад В (&ДоступныеСклады) И Организация В (&ДоступныеОрганизации) #КонецЕсли
#Если "Документ.РасходнаяНакладная" = #ИмяТекущейТаблицы #Тогда ГДЕ Склад В (&ДоступныеСклады) И Организация В (&ДоступныеОрганизации) #КонецЕсли

Тогда если захотеть добавить ограничение по проекту, то поменяется только общий шаблон:

#Если "Справочник.Склады" = #ИмяТекущейТаблицы #Тогда ГДЕ Ссылка В (&ДоступныеСклады) #КонецЕсли
#Если "Справочник.Организации" = #ИмяТекущейТаблицы #Тогда ГДЕ Ссылка В (&ДоступныеОрганизации) #КонецЕсли
#Если "Справочник.Проекты" = #ИмяТекущейТаблицы #Тогда ГДЕ Ссылка В (&ДоступныеПроекты) #КонецЕсли
#Если "Документ.ПриходнаяНакладная" = #ИмяТекущейТаблицы #Тогда ГДЕ Склад В (&ДоступныеСклады) И Организация В (&ДоступныеОрганизации) И Проект В (&ДоступныеПроекты) #КонецЕсли
#Если "Документ.РасходнаяНакладная" = #ИмяТекущейТаблицы #Тогда ГДЕ Склад В (&ДоступныеСклады) И Организация В (&ДоступныеОрганизации) И Проект В (&ДоступныеПроекты) #КонецЕсли

И, конечно, этот шаблон лучше и проще генерировать программно.

Основное преимущество в том, что убирается рутинный ручной труд и RLS на чтение пишутся автоматизированно. А ведь раньше это было самой сложной темой именно из-за того, что нужно было прописывать изменения во все роли.

И все это возможно было сделать уже 10 лет назад, при появлении RLS.

Окончательное решение вопроса RLS на чтение в 1С
Начать дискуссию