Решение проблемы «НеверноеПраво<<?>>:» в ролях доступа

Потребовалось срочно решить проблему в ролях доступа — при обращении к роли у пользователя 1С со включенным RLS по Организации, выдавалась ошибка следующего вида:

Ошибка:

Ошибка при выполнении обработчика - 'ПередЗаписью'

[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Ошибка в ограничении доступа к данным.
объект: 'РегистрНакопления.ТоварыКОтгрузке'; право: 'Чтение'
{(50, 18)}: Синтаксическая ошибка ":"
НеверноеПраво<<?>>: Изменение
по причине:
{(50, 18)}: Синтаксическая ошибка ":"
НеверноеПраво<<?>>: Изменение

Неясно в итоге, в каком праве ошибка — в «Чтение» или в «Изменение», либо ему «не нравится» двоеточие в каком-то из шаблонов?
Вдобавок, роли редко встречаются в работе, в них нет отладки, и вопрос нужно было решить очень быстро, без стороних инструментов. Первое время я не понимал, как подступиться.

Первым делом я посмотрел через обработку с Инфорстарта «РолиДляДоступаКОбъектамМетаданных», какие роли отвечают за данный регистр:

Роли с RLS выделены, это «СамообслуживаниеВнешнийПользовательОформлениеЗаказов» и «ЧтениеОстатковТоваровКОтгрузке». (Их может быть намного больше)…

******

В Конфигураторе в Роли на первой вкладке:

За кадром убедился что значение: ПараметрыСеанса.ОграничениеДоступаНаУровнеЗаписейУниверсально = Ложь.

ПараметрыСеанса.ОграничениеДоступаНаУровнеЗаписейУниверсально = Ложь

Значит, в условие «#Если» не заходит и точно используется шаблон «#ПоЗначениямРасширенный(«

Идём вторую вкладку проверять шаблон «ПоЗначениямРасширенный»

(Бывает, что текст закрашен фоном и конфигуратор не даёт его отредактировать, как на скриншоте ниже. Тогда необходимо предварительно проверить, что редактируемая роль «снята с замка» и не подключена к хранилищу, или заблокирована от редактирования по другим причинам):

Находим фрагмент со словом «НеверноеПраво:»

// Проверка правильности параметра Право.
#Если Не ("#Параметр(2)" = "Чтение"    Или "#Параметр(2)" = "Добавление" Или
          "#Параметр(2)" = "Изменение" Или "#Параметр(2)" = "Удаление"   Или "#Параметр(2)" = "")
      Или #ИмяТекущегоПраваДоступа <> "Чтение" И "#Параметр(2)"  = "Чтение"
      Или #ИмяТекущегоПраваДоступа  = "Чтение" И "#Параметр(2)" <> "Чтение" И "#Параметр(2)" <> "" #Тогда
    // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
    НеверноеПраво: #Параметр(2)
#КонецЕсли

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

— в роли СамообслуживаниеВнешнийПользовательОформлениеЗаказов:

// Проверка правильности параметра Право.
#Если Не ("#Параметр(2)" = "Чтение"    Или "#Параметр(2)" = "Добавление" Или
          "#Параметр(2)" = "Изменение" Или "#Параметр(2)" = "Удаление"   Или "#Параметр(2)" = "")
      Или #ИмяТекущегоПраваДоступа <> "Чтение" И "#Параметр(2)"  = "Чтение"
      Или #ИмяТекущегоПраваДоступа  = "Чтение" И "#Параметр(2)" <> "Чтение" И "#Параметр(2)" <> "" #Тогда
    // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
    //НеверноеПраво: #Параметр(2)
    РасширеннаяДиагностика Роль_СамообслуживаниеВнешнийПользовательОформлениеЗаказов  ИмяТекущегоПраваДоступа_ПриОшибке: #ИмяТекущегоПраваДоступа:     Параметр2_ПриОшибке #Параметр(2)     Параметр3_ПриОшибке: #Параметр(3)
#КонецЕсли
  • в роли ЧтениеОстатковТоваровКОтгрузке:
// Проверка правильности параметра Право.
#Если Не ("#Параметр(2)" = "Чтение"    Или "#Параметр(2)" = "Добавление" Или
          "#Параметр(2)" = "Изменение" Или "#Параметр(2)" = "Удаление"   Или "#Параметр(2)" = "")
      Или #ИмяТекущегоПраваДоступа <> "Чтение" И "#Параметр(2)"  = "Чтение"
      Или #ИмяТекущегоПраваДоступа  = "Чтение" И "#Параметр(2)" <> "Чтение" И "#Параметр(2)" <> "" #Тогда
    // Когда параметр задан неверно, вставляется строка, чтобы вызвать ошибку сборки ограничения доступа.
    //НеверноеПраво: #Параметр(2)
    РасширеннаяДиагностика Роль_ЧтениеОстатковТоваровКОтгрузке  ИмяТекущегоПраваДоступа_ПриОшибке: #ИмяТекущегоПраваДоступа     Параметр2_ПриОшибке: #Параметр(2)     Параметр3_ПриОшибке: #Параметр(3)
#КонецЕсли

После перезапуска 1С получаем расширенную ошибку:

[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Ошибка в ограничении доступа к данным.
объект: ‘РегистрНакопления.ТоварыКОтгрузке’; право: ‘Чтение’
{(51, 185)}: Синтаксическая ошибка «:»
РасширеннаяДиагностика Роль_ЧтениеОстатковТоваровКОтгрузке ИмяТекущегоПраваДоступа_ПриОшибке<<?>>: Чтение Параметр2_ПриОшибке: Изменение Параметр3_ПриОшибке:
по причине:
{(51, 185)}: Синтаксическая ошибка «:»
РасширеннаяДиагностика Роль_ЧтениеОстатковТоваровКОтгрузке ИмяТекущегоПраваДоступа_ПриОшибке<<?>>: Чтение Параметр2_ПриОшибке: Изменение Параметр3_ПриОшибке:

Идём на первую вкладку у роли ЧтениеОстатковТоваровКОтгрузке, видим, что у выделенной роли «Чтение» оказалось «сбито» значение доступа, — проверяется «Изменение». Меняем на «Чтение», перезапускаем, — ошибка ушла.