Как настроить RLS для полей составного типа в 1С:ERP 2.5?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

При работе с механизмами ограничения доступа на уровне записей (RLS) в конфигурации 1С:ERP 2.5 разработчики нередко сталкиваются с ситуацией, когда стандартные шаблоны перестают корректно отрабатывать для полей составного типа данных. Рассмотрим, почему это происходит и как эффективно решить данную задачу.

Суть проблемы

Механизм RLS в 1С при проверке прав доступа преобразует шаблоны ограничений в SQL-запросы. Если поле, по которому накладывается ограничение, имеет составной тип (например, ДополнительныеРеквизиты.Значение), система должна учитывать множество типов данных, содержащихся в этом поле. В типовых шаблонах, таких как #ПоЗначениямРасширенный, логика обработки таких полей может оказаться недостаточно гибкой, что приводит к тому, что ограничение не применяется (данные видны всем) или запрос выполняется с ошибками.

Решение через внутреннее соединение

Наиболее надежный способ ограничить доступ к записям с составным типом — это явно «сузить» выборку, присоединив только те таблицы, которые нас интересуют в рамках данного права доступа. Мы рекомендуем использовать внутреннее соединение с целевой таблицей. Это позволяет отфильтровать ненужные типы данных на уровне SQL-запроса.

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


#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
    #ДляОбъекта("")
#Иначе
    #ПоЗначениямРасширенный("Справочник.АпкХарактеристикиВидовРабот", "Чтение", "", 
    "ЛЕВОЕ СОЕДИНЕНИЕ Справочник.АпкХарактеристикиВидовРабот.ДополнительныеРеквизиты КАК Т1 
    ПО Т1.Ссылка = Т.Ссылка 
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Организации КАК Т2 
    ПО Т1.Значение = Т2.Ссылка", 
    "", "Организации", "Т1.Значение","", "","","","","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","")
#КонецЕсли

Почему это работает:

  1. ВНУТРЕННЕЕ СОЕДИНЕНИЕ гарантирует, что в выборку попадут только те строки, где значение ДополнительныеРеквизиты.Значение является ссылкой на Справочник.Организации.
  2. Все остальные типы данных (если поле является составным и содержит другие объекты) будут отсечены этим соединением, что предотвращает ошибки при сопоставлении типов в SQL.

Использование дополнительных условий фильтрации

Если специфика задачи требует проверки типа данных без жесткого соединения, можно попытаться использовать параметры вида доступа Условие. Однако следует помнить, что в текстах шаблонов RLS синтаксис 1С сильно ограничен. Попытки использовать методы ТипЗнч() или Тип() внутри шаблона часто приводят к синтаксическим ошибкам, так как интерпретатор ожидает чистого SQL-синтаксиса или специфического внутреннего языка БСП.

Если вы все же решаете использовать дополнительные условия, убедитесь, что они корректно транслируются в SQL. Рекомендуется:

Практические рекомендации

При настройке RLS для сложных объектов в 1С:ERP 2.5 следуйте этим шагам:

  1. Анализ данных: Выясните, какие конкретно типы данных могут находиться в поле составного типа.
  2. Оптимизация: Всегда старайтесь минимизировать количество соединений в тексте шаблона. RLS выполняется для каждой записи, поэтому сложные запросы могут существенно замедлить работу системы.
  3. Тестирование: Всегда проверяйте права под пользователем с ограниченными правами, используя функцию «Проверка прав» в конфигураторе, но также обязательно тестируйте выполнение отчетов и открытие списков в режиме 1С:Предприятие.
  4. Производительность: Если после внедрения RLS вы заметили замедление работы системы, рассмотрите возможность перехода на использование механизмов «Ключей доступа» (производительный режим), если это поддерживается вашей версией конфигурации.

Помните, что настройка RLS — это тонкий процесс, требующий внимательности к деталям. Если решение через соединение таблиц исправляет проблему, это говорит о том, что механизм успешно отсек лишние типы данных, которые «ломали» логику проверки прав.

← На главную