Мы сталкиваемся с распространенной проблемой в 1С:ERP 2.5, когда пользователь с ограниченными правами не может записать документ «Заявка на расходование денежных средств». Эта ситуация возникает при выборе типа операции «Выдача подотчетнику» и установке флажка «Список подотчетных лиц». Интересно, что при выборе одного подотчетного лица документ записывается и проводится без каких-либо затруднений. Возникает вопрос, почему система ведет себя таким образом и каких именно прав или настроек доступа не хватает пользователю при работе со списком.
При возникновении ошибок, связанных с правами доступа, первым и наиболее важным шагом является обращение к Журналу регистрации 1С. Это позволяет нам получить детальную информацию о том, на какой конкретный объект система ругается. Давайте рассмотрим, как правильно анализировать ЖР.
Ошибка при вызове метода контекста (Записать) {ОбщийМодуль.ОбщегоНазначенияУТКлиент.Модуль(1367)}:Результат = Форма.Записать(ПараметрыЗаписи); {ОбщийМодуль.ОбщегоНазначенияУТКлиент.Модуль(1255)}:ЗаписатьОбъект(Форма, ПараметрыЗаписи); {Документ.ЗаявкаНаРасходованиеДенежныхСредств.Форма.ФормаДокумента.Форма(2615)}:ОбщегоНазначенияУТКлиент.Записать(ЭтаФорма, Истина); по причине: У пользователя недостаточно прав на исполнение операции над базой данных.
Это сообщение, хотя и указывает на нехватку прав, не дает нам точного понимания, к какой именно таблице или объекту был ограничен доступ. Такие ошибки относятся к «Ошибка выполнения кода» и не всегда содержат нужные детали.
После анализа Журнала регистрации, если мы видим отказ в доступе к определенным данным, следующим шагом является анализ настроек RLS (Restriction Level Security) для документа «Заявка на расходование денежных средств». В нашем случае, проблема явно связана с особенностями работы RLS при использовании списка подотчетных лиц.
Т.ПодотчетноеЛицо из шапки документа. Давайте посмотрим на фрагмент этого RLS-запроса, как он был приведен в обсуждении:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе #ПоЗначениямРасширенный( "Документ.ЗаявкаНаРасходованиеДенежныхСредств","Чтение","", "ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаявкаНаРасходованиеДенежныхСредств.РасшифровкаПлатежа КАК Т1 ПО Т.Ссылка = Т1.Ссылка", "", "Организации","Т.Организация","И", "Подразделения","Т.Подразделение","И", "Пользователи","Т.КтоЗаявил","И", "ХозяйственныеОперации","ВЫБОР КОГДА Т.ХозяйственнаяОперация = Значение(Перечисление.ХозяйственныеОперации.ВыплатаЗарплаты) ТОГДА Т.ХозяйственнаяОперацияПозарплате ИНАЧЕ Т.ХозяйственнаяОперация КОНЕЦ", "И ВЫБОР КОГДА Т.ХозяйственнаяОперация = Значение(Перечисление.ХозяйственныеОперации.ОплатаПоставщику) ИЛИ Т.ХозяйственнаяОперация = Значение(Перечисление.ХозяйственныеОперации.ВозвратОплатыКлиенту) ТОГДА Т1.Партнер ЕСТЬ NULL ИЛИ", "ГруппыПартнеров","Т1.Партнер", "КОГДА Т.ХозяйственнаяОперация = Значение(Перечисление.ХозяйственныеОперации.ВыдачаДенежныхСредствПодотчетнику) ТОГДА", "ГруппыФизическихЛиц","Т.ПодотчетноеЛицо", "ИНАЧЕ ИСТИНА КОНЕЦ", "","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","","","","") #КонецЕсли
Обратите внимание на часть, касающуюся «ВыдачаДенежныхСредствПодотчетнику»:
"КОГДА Т.ХозяйственнаяОперация = Значение(Перечисление.ХозяйственныеОперации.ВыдачаДенежныхСредствПодотчетнику) ТОГДА",
"ГруппыФизическихЛиц","Т.ПодотчетноеЛицо",
Когда мы выбираем «Список подотчетных лиц», поле Т.ПодотчетноеЛицо в шапке документа, скорее всего, становится пустым (NULL), поскольку все лица указываются в отдельной табличной части (например, «Лицевые счета сотрудников» или «РасшифровкаПлатежа»). Стандартное условие RLS, которое пытается применить ограничение по Т.ПодотчетноеЛицо, не может корректно сработать, так как это поле пустое. Это приводит к тому, что система не может определить права на подотчетное лицо и, как следствие, отказывает в записи документа, даже если у пользователя есть права на всех физических лиц в списке.
Для решения этой проблемы, когда RLS некорректно срабатывает из-за пустого поля Т.ПодотчетноеЛицо при использовании списка, было предложено модифицировать запрос RLS. Цель модификации — отключить проверку по этому полю, когда активирована опция «Список подотчетных лиц».
Мы предлагаем добавить дополнительное условие НЕ СписокФизЛиц (где СписокФизЛиц — это реквизит документа, который становится Истина, когда установлен флажок «Список подотчетных лиц») в секцию RLS, отвечающую за хозяйственную операцию «Выдача денежных средств подотчетнику».
Изменим фрагмент RLS-запроса таким образом:
"КОГДА Т.ХозяйственнаяОперация = Значение(Перечисление.ХозяйственныеОперации.ВыдачаДенежныхСредствПодотчетнику) и НЕ СписокФизЛиц ТОГДА",
"ГруппыФизическихЛиц","Т.ПодотчетноеЛицо",
Таким образом, когда хозяйственная операция — это выдача денежных средств подотчетнику И флажок «СписокФизЛиц» НЕ установлен (то есть выбрано одно подотчетное лицо), тогда и только тогда применяется ограничение по ГруппыФизическихЛиц для Т.ПодотчетноеЛицо. Если же флажок «СписокФизЛиц» установлен, то это условие не будет выполняться, и RLS не будет пытаться проверять пустое поле Т.ПодотчетноеЛицо. Это позволяет документу записываться.
Помимо настроек RLS для основного объекта, мы должны убедиться, что у пользователя есть все необходимые права на связанные объекты и табличные части.
Документ.ЗаявкаНаРасходованиеДенежныхСредств.РасшифровкаПлатежа.ФизическиеЛица, элементы которого добавляются в табличную часть.После внесения любых изменений в систему доступа, особенно связанных с RLS, мы настоятельно рекомендуем выполнить следующие шаги:
Придерживаясь этих шагов, мы сможем эффективно диагностировать и решить проблему с правами доступа, обеспечивая корректную работу пользователей в 1С:ERP.