После проведения очередного обновления конфигурации «1С:Бухгалтерия предприятия» (начиная с релизов ветки 3.0.71 и выше) администраторы и программисты часто сталкиваются с неприятной ситуацией. Пользователи, обладающие полными (административными) правами, заходят в базу данных без каких-либо проблем. Однако при попытке входа пользователей с ограниченными правами (например, с типовой ролью Бухгалтер (ограничено) или любыми нетиповыми доработанными ролями) система аварийно завершает работу.
На экране появляется критическая ошибка запуска, а в журнале регистрации фиксируется следующее системное сообщение:
{ОбщийМодуль.ОбщегоНазначенияБП.Модуль(705)}: Ошибка при вызове метода контекста (Выполнить)
Если НЕ Запрос.Выполнить().Пустой() Тогда
по причине:
Ошибка выполнения запроса
по причине:
Ошибка в ограничении доступа к данным.
объект: 'Справочник.Организации', поле: 'Ссылка'; право: 'Чтение'
Синтаксическая ошибка "Параметр ОграничениеДоступаНаУровнеЗаписейВключено не существует"
Давайте подробно разберем, почему возникает эта ошибка, как устроены механизмы безопасности в современных версиях Библиотеки стандартных подсистем (БСП) и рассмотрим несколько практических способов устранения данной проблемы.
Для того чтобы понять природу сбоя, обратимся к архитектуре подсистемы Управление доступом, которая входит в состав БСП. В конфигурации «Бухгалтерия предприятия» ограничение доступа на уровне записей (известное как RLS — Record Level Security) активно использует параметры сеанса для динамического построения запросов ограничения прав.
В старых версиях БСП для проверки того, включено ли ограничение прав на уровне записей, использовался глобальный параметр сеанса ОграничениеДоступаНаУровнеЗаписейВключено. Тексты ограничений (шаблоны RLS) в ролях содержали конструкции вида:
#Если &ОграничениеДоступаНаУровнеЗаписейВключено #Тогда
...
#КонецЕсли
При обновлении конфигурации до версии 3.0.71 и выше разработчики фирмы «1С» произвели рефакторинг подсистемы управления доступом и обновили версию БСП. В новой версии этот параметр сеанса был полностью удален из метаданных. Вместо него разработчики внедрили новые параметры сеанса:
ОграничениеДоступаНаУровнеЗаписейИспользуется — пришедший на смену старому параметру.ОграничениеДоступаНаУровнеЗаписейУниверсально — отвечающий за работу нового механизма «универсального RLS».Поскольку старый параметр сеанса прекратил свое существование, любой RLS-запрос, в шаблоне которого осталась инструкция обращения к &ОграничениеДоступаНаУровнеЗаписейВключено, вызывает у платформы синтаксический шок. Платформа 1С:Предприятие пытается скомпилировать SQL-запрос с ограничением доступа для текущей таблицы (например, Справочник.Организации), обращается к несуществующему параметру сеанса и аварийно завершает сеанс пользователя.
Эта проблема затрагивает базы данных, в которых:
Если в вашей конфигурации присутствует большое количество измененных или добавленных вручную ролей, наиболее надежным и быстрым способом будет корректировка текстов ограничений RLS. Мы заменим обращение к старому параметру на новый.
Выполним следующие шаги по шагам:
.dt или копию файла 1Cv8.1CD).&ОграничениеДоступаНаУровнеЗаписейВключено&ОграничениеДоступаНаУровнеЗаписейИспользуетсяВажное предостережение: Метод глобальной замены может изменить параметры в том числе и в типовых ролях, которые находятся на поддержке без возможности изменения. Чтобы вернуть типовые роли в исходное состояние (сохранив признак неизменяемости поставщика), выполните сравнение и объединение с конфигурацией поставщика:
F7).Бывают ситуации, когда база данных находится под жестким контролем, изменения основной конфигурации нежелательны или на тщательный анализ кастомных ролей прямо сейчас нет времени (например, когда работа предприятия заблокирована, и нужно срочно вернуть пользователям доступ). В этом случае мы можем применить обходной маневр с помощью механизма расширений.
Идея заключается в том, чтобы принудительно вернуть в систему параметр сеанса ОграничениеДоступаНаУровнеЗаписейВключено и инициализировать его при старте программы. Платформа перестанет выдавать синтаксическую ошибку компиляции запроса RLS.
Реализуем этот метод по шагам:
ИсправлениеОшибкиRLS). Снимите у него флажки Безопасный режим и Активно (сделайте его активным после написания кода).ОграничениеДоступаНаУровнеЗаписейВключено.Булево.
&После("УстановкаПараметровСеанса")
Процедура Расш1_УстановкаПараметровСеанса(ТребуемыеПараметры, ИменаПараметров)
// Проверяем, инициализирован ли наш параметр сеанса
Попытка
ПараметрыСеанса.ОграничениеДоступаНаУровнеЗаписейВключено = Константы.ИспользоватьОграниченияПравДоступаНаУровнеЗаписей.Получить();
Исключение
// На случай, если константа недоступна, установим значение по умолчанию
ПараметрыСеанса.ОграничениеДоступаНаУровнеЗаписейВключено = Ложь;
КонецПопытки;
КонецПроцедуры
Благодаря этому нехитрому коду платформа 1С при запуске сеанса любого пользователя подставит нужное булево значение в RLS-запросы, и синтаксическая ошибка мгновенно исчезнет. Пользователи смогут беспрепятственно продолжить работу, а вы получите запас времени для планомерного рефакторинга ролей в основной конфигурации.
Если вы хотите решить проблему максимально качественно и навсегда застраховать конфигурацию от подобных сбоев при последующих обновлениях, рекомендуется перевести все кастомные роли на новые стандарты БСП.
Разработчики БСП постепенно отказываются от старых громоздких RLS-запросов в пользу Универсального ограничения доступа. Проанализируем, как это сделать:
ЧтениеОрганизаций).#ПоЗначениям(...)).Этот способ является наиболее трудоемким, однако он полностью соответствует стандартам разработки фирмы «1С» и гарантирует стабильную работу прав доступа при любых последующих обновлениях БП.
Иногда синтаксическая ошибка возникает временно, когда обновление конфигурации базы данных на уровне СУБД выполнено, но регламентные процедуры обновления данных БСП еще не были запущены или завершились аварийно.
В такой ситуации рекомендуется выполнить принудительный запуск обновления информационной базы:
1cv8.exe ENTERPRISE /F "ПутьКВашейБазе" /C ЗапуститьОбновлениеИнформационнойБазы
Мы надеемся, что предложенные методики помогут вам быстро диагностировать и устранить проблему с параметрами сеанса RLS, вернув пользователей к комфортной и бесперебойной работе в программе 1С:Бухгалтерия предприятием!