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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

  • Организации: Организация в &ДоступныеОрганизации

  • Склады: Склад в &ДоступныеСклады

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

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

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

  • Организации: ШаблонПрав(«Организация»)

  • Склады: ШаблонПрав(«Склад»)

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

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

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

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

  • Организации: ШаблонПрав(«Организация»)

  • Склады: ШаблонПрав(«Склад»)

  • Проекыт: ШаблонПрав(«Проект»)

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

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

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

  • Приходная накладная: Основной

  • Расходная накладная: Основной

  • Организации: Основной

  • Склады: Основной

  • Проекты: Основной

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

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

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

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

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

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

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

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

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

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

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

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

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

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