Как исправить ошибку RLS «Параметр ОграничениеДоступаНаУровнеЗаписейВключено не существует» после обновления 1С:Комплексная автоматизация 2.4 / ERP 2.4?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

При обновлении крупных типовых конфигураций на платформе 1С:Предприятие 8.3 программисты нередко сталкиваются с ситуацией, когда штатное обновление конфигурации проходит успешно, но при попытке входа пользователей под ограниченными правами система аварийно завершает работу. Одной из наиболее ярких проблем такого рода стал массовый сбой в механизме RLS (разграничения доступа на уровне записей) после обновления конфигураций «1С:Комплексная автоматизация» до релиза 2.4.8.79 (и аналогичных релизов «1С:ERP Управление предприятием 2.4» и «1С:Бухгалтерия предприятия 3.0.71.69»).

В этой статье мы подробно проанализируем причины возникновения данной проблемы, разберем логику работы измененных механизмов Библиотеки стандартных подсистем (БСП) и рассмотрим три практических способа устранения этой ошибки.

Выясняем причину сбоя: рефакторинг БСП и невнимательность разработчиков

Для того чтобы понять, почему система выдает ошибку о несуществующем параметре сеанса, заглянем во внутреннюю архитектуру подсистемы управления доступом БСП. В версиях БСП, вошедших в состав линеек конфигураций 2.4.8, разработчики 1С провели глобальную оптимизацию механизмов RLS. Целью рефакторинга было ускорение проверки прав и упрощение структуры метаданных.

В ходе этих изменений разработчики приняли решение отказаться от использования параметра сеанса ОграничениеДоступаНаУровнеЗаписейВключено. Вместо него в новой архитектуре был задействован параметр сеанса ОграничениеДоступаНаУровнеЗаписейИспользуется. Из метаданных конфигурации старый параметр был полностью удален.

Однако при формировании релизов поставщика произошла техническая накладка: параметр сеанса из метаданных удалили, а шаблоны ограничений доступа (RLS) в некоторых типовых ролях обновить забыли. В результате шаблоны ограничений в ролях продолжали обращаться к старому имени параметра сеанса через конструкцию:

&ОграничениеДоступаНаУровнеЗаписейВключено

Как только пользователь с неполными правами (например, бухгалтер, менеджер или кладовщик) пытается открыть форму списка документов или справочников, платформа генерирует динамический SQL-запрос к базе данных, подставляя условия из шаблонов RLS. Не обнаружив в текущем сеансе зарегистрированного параметра ОграничениеДоступаНаУровнеЗаписейВключено, система аварийно прекращает работу с синтаксической ошибкой.

---

Способ 1. Глобальная замена в шаблонах ограничений (Рекомендуемый способ)

Этот способ является наиболее правильным с точки зрения целевой архитектуры БСП. Нам необходимо привести шаблоны ограничений в ролях в соответствие с актуальным состоянием метаданных конфигурации. Для этого мы заменим устаревшее имя параметра на новое.

Разберем по шагам, как выполнить глобальную замену в конфигураторе:

  1. Откроем конфигурацию в режиме Конфигуратор и снимем ее с поддержки с сохранением поддержки (если она полностью на замке), чтобы разрешить изменения ролей.
  2. Перейдем в главное меню: Правка — Глобальная замена.
  3. В поле Искать введем текст устаревшего параметра сеанса: ОграничениеДоступаНаУровнеЗаписейВключено.
  4. В поле Заменить на укажем имя нового действующего параметра сеанса: ОграничениеДоступаНаУровнеЗаписейИспользуется.
  5. В области поиска обязательно установим флажок исключительно напротив пункта Роли (шаблоны ограничений, ограничения доступа). Это важно, чтобы случайно не зацепить другие объекты метаданных или модули, где замена может быть нежелательной.
  6. Нажмем кнопку Искать, проверим список найденных вхождений и выполним замену.
  7. Сохраним конфигурацию базы данных (клавиша F7) и запустим сеанс для проверки работоспособности.

Этот подход полностью решает проблему совместимости шаблонов ролей с актуальной версией БСП. Однако помните, что при последующих обновлениях на новые типовые релизы измененные вручную роли потребуют повышенного внимания при сравнении и объединении конфигураций.

---

Способ 2. Временный возврат параметра сеанса (Быстрый «костыль»)

Если у вас нет возможности или времени перелопачивать шаблоны ролей (например, база находится на полной поддержке и вы не хотите снимать ее с «замка»), можно применить обходное решение. Мы добавим обратно удаленный параметр сеанса и инициализируем его при старте системы.

Рассмотрим подробнее этот алгоритм:

  1. Создадим новое Расширение конфигурации или откроем уже существующее.
  2. Добавим в расширение объект метаданных Параметры сеанса.
  3. Создадим в расширении параметр сеанса с именем ОграничениеДоступаНаУровнеЗаписейВключено и типом значения Булево.
  4. Затем нам необходимо переинициализировать данный параметр при начале работы системы. Для этого перейдем в модуль сеанса (также через расширение) и в процедуре установки параметров сеанса пропишем код инициализации:

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    
    // Проверяем необходимость инициализации нашего параметра
    Если ТребуемыеПараметры = Неопределено 
       Или ТребуемыеПараметры.Найти("ОграничениеДоступаНаУровнеЗаписейВключено") <> Неопределено Тогда
        
        // Присваиваем значение Истина, чтобы шаблоны RLS отрабатывали штатно
        ПараметрыСеанса.ОграничениеДоступаНаУровнеЗаписейВключено = Истина;
        
    КонецЕсли;

КонецПроцедуры

Данный способ хорош тем, что основная конфигурация остается на полной поддержке поставщика, а пользователи могут беспрепятственно продолжить работу сразу после применения расширения.

---

Способ 3. Проверка и обновление шаблонов в расширениях конфигурации

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

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

Для устранения этой проблемы выполним следующие действия:

  1. Откроем список расширений в конфигураторе.
  2. Проверим все заимствованные роли в каждом расширении.
  3. Если в роли расширения присутствует шаблон RLS, ссылающийся на ОграничениеДоступаНаУровнеЗаписейВключено, скопируем обновленный текст шаблона из аналогичной роли основной конфигурации либо вручную заменим текст обращения на ОграничениеДоступаНаУровнеЗаписейИспользуется.
  4. Обновим конфигурацию базы данных.

---

Важный сопутствующий нюанс: Переименование определяемых типов в БСП

В процессе перехода на новые релизы линеек 2.4.8 разработчики также затронули определяемые типы, используемые для денежных показателей. Это нововведение часто идет «рука об руку» с описываемой ошибкой RLS и ломает логику кастомных расширений.

Выясним причину: в рамках унификации кода БСП были переименованы следующие ключевые определяемые типы данных:

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

← На главную