Настройка ограничений доступа на уровне записей (Record Level Security, RLS) в платформе «1С:Предприятие 8» — мощный инструмент, требующий от разработчика глубокого понимания механизмов работы базы данных. Часто при написании универсальных шаблонов RLS возникает ошибка: «Поле не найдено <ТекущаяТаблица.Ссылка.ВидОперации>». Она проявляется при попытке открыть динамический список документов, для которых данное ограничение настроено, хотя логически код написан так, что обращение к этому полю происходить не должно. В этой статье мы подробно разберем причины этой ошибки и рассмотрим эффективные методы её устранения.
Проанализируем исходную ситуацию. Разработчик создает шаблон RLS, содержащий логическую ветку ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. В этом шаблоне первой веткой идет проверка типа документа:
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(ТекущаяТаблица.Ссылка) = ТИП(Документ.ВнутреннееПеремещениеНаличныхДенежныхСредств)
ИЛИ ТИПЗНАЧЕНИЯ(ТекущаяТаблица.Ссылка) = ТИП(Документ.ДенежныйЧек)
ТОГДА ИСТИНА
ИНАЧЕ НЕ ТекущаяТаблица.Ссылка.ВидОперации В (...)
КОНЕЦ
Логика разработчика понятна: если тип текущего документа равен ВнутреннееПеремещениеНаличныхДенежныхСредств, система должна сразу вернуть ИСТИНА и не переходить к ветке ИНАЧЕ, где проверяется реквизит ВидОперации (которого у этого документа физически нет). Однако на уровне СУБД эта логика не работает. Выясним причину этого поведения.
Когда пользователь открывает список документов или выполняет запрос к базе данных, платформа 1С производит компиляцию запроса RLS:
ВнутреннееПеремещениеНаличныхДенежныхСредств).ВнутреннееПеремещениеНаличныхДенежныхСредств реквизит ВидОперации отсутствует в метаданных, транслятор запроса падает с синтаксической ошибкой СУБД. Тот факт, что логически выполнение не должно дойти до ветки ИНАЧЕ, платформой на этапе проверки схемы метаданных полностью игнорируется.Помимо этого, обращение вида ТекущаяТаблица.Ссылка.ВидОперации является неоптимальным. Использование обращения «через точку» от поля Ссылка заставляет СУБД делать неявное левое соединение (Implicit Join) таблицы самой с собой. Это существенно снижает производительность динамических списков и отчетов. Правильнее обращаться к реквизиту напрямую: ТекущаяТаблица.ВидОперации.
---
Рассмотрим несколько эффективных подходов для обхода этой ошибки, от классической параметризации шаблонов до современных стандартов разработки 1С.
Чтобы избежать жесткого прописывания конкретного реквизита в тексте шаблона, сделаем имя проверяемого поля параметром. Это позволит использовать один и тот же шаблон для документов с разной структурой метаданных.
Шаг 1. Объявим в свойствах роли на вкладке «Шаблоны ограничений» новый шаблон с параметром, например: #ОграничениеПоВидуОперации(ИмяПоляВидаОперации).
Шаг 2. В тексте шаблона пропишем универсальный запрос:
ТекущаяТаблица
ИЗ
#ТекущаяТаблица КАК ТекущаяТаблица
ГДЕ
#Параметр(1) В (ЗНАЧЕНИЕ(Перечисление.ВидыОперацийСписаниеБезналичныхДенежныхСредств.ПеречислениеЗП), ЗНАЧЕНИЕ(Перечисление.ВидыОперацийППИсходящее.ПеречислениеЗП))
Шаг 3. При назначении ограничения RLS на конкретные документы будем передавать в качестве параметра нужные значения:
ВидОперации (например, СписаниеБезналичныхДенежныхСредств), укажем ограничение:
#ОграничениеПоВидуОперации("ТекущаяТаблица.ВидОперации")
ВнутреннееПеремещениеНаличныхДенежныхСредств), передадим безопасную заглушку, которая не вызовет ошибку компиляции:
#ОграничениеПоВидуОперации("NULL") или #ОграничениеПоВидуОперации("НЕОПРЕДЕЛЕНО")
Этот способ позволяет сохранить единую логику разграничения доступа, не перегружая базу данных множеством однотипных шаблонов.
Посмотрим на ситуацию с точки зрения архитектуры прав доступа. Если документы принципиально отличаются по своей структуре и бизнес-логике, не стоит пытаться объединить их в рамках одного сложного шаблона RLS.
Разделим ограничения на логические группы:
ВидОперации, наложим простые ограничения (например, только по реквизиту Организация).ВидОперации напрямую.Если ваша конфигурация построена на базе «Библиотеки стандартных подсистем» (БСП), ручное написание сложных SQL-подобных запросов в ролях считается устаревшей практикой. В БСП внедрен производительный режим RLS, основанный на механизме «Ключей доступа».
При таком подходе:
ПриЗаполненииОграниченияДоступа.КлючиДоступаКОбъектам).---
Разберем еще один частый вопрос, связанный с RLS: как скрыть от пользователя персональные данные физических лиц (чтобы вместо ФЛ отображалось <Объект не найден>), но при этом позволить ему полноценно просматривать и открывать элементы справочника Сотрудники?
Если просто закрыть на чтение справочник ФизическиеЛица, то при попытке открыть форму сотрудника система выдаст ошибку «Недостаточно прав!». Это происходит потому, что форма сотрудника или код конфигурации при открытии пытается неявно прочитать данные связанного физлица (ФИО, ИНН, паспортные данные).
Для решения этой задачи применим комплексный подход:
Вместо полного запрета на чтение справочника ФизическиеЛица, настроим ограничение на уровне полей в роли:
Ссылка, ВерсияДанных, ПометкаУдаления, Предопределенный и Наименование без ограничений. Это позволит платформе без ошибок открывать формы сотрудников и отображать текстовое представление физлица.ГДЕ ЛОЖЬ) на все остальные конфиденциальные поля: ИНН, СНИЛС, паспортные данные, контактную информацию. При попытке прочесть эти поля пользователь увидит пустые значения, но ссылочная целостность интерфейса не нарушится.Если для работы формы сотрудника критически важно выводить закрытые данные физического лица (например, для внутренних алгоритмов валидации), получение этих данных нужно выполнять на сервере в привилегированных общих модулях, где RLS временно отключается:
УстановитьПривилегированныйРежим(ИСТИНА);
// Выполняем чтение необходимых данных физлица
УстановитьПривилегированныйРежим(ЛОЖЬ);
В обработчике события ПриСозданииНаСервере формы справочника Сотрудники заменим стандартные ссылочные поля физлиц на обычные текстовые реквизиты, заполняя их безопасным образом на сервере в обход RLS.
Применение этих методов позволит вам создавать гибкие, надежные и быстродействующие системы разграничения прав доступа в любых конфигурациях на платформе «1С:Предприятие 8».