При обновлении конфигурации 1С:Зарплата и управление персоналом до определенных версий (особенно это коснулось ветки 3.1.18.х, например 3.1.18.46) пользователи часто сталкиваются с неприятной ситуацией. Кадровик, который ранее работал без проблем, начинает получать критическую ошибку при попытке открыть журнал документов «Больничные листы», список сотрудников или кадровые журналы. Текст ошибки указывает на проблему в модуле менеджера справочника ЗарплатныеПроекты.
В этой статье мы подробно разберем, почему возникает эта ошибка, как она связана с механизмом RLS (Row Level Security) и какие шаги необходимо предпринять для её устранения. Проанализируем ситуацию совместно и найдем оптимальное решение.
Давайте проанализируем стек вызова, который обычно сопровождает данную ошибку. Проблема локализуется в процедурах, отвечающих за проверку использования электронного документооборота с банками. Ошибка возникает в строке кода:
БанкиЗарплатныхПроектов = Запрос.Выполнить().Выгрузить();
Выясним причину такого поведения системы. Когда в программе включено ограничение доступа на уровне записей (RLS), платформа 1С автоматически модифицирует все запросы к базе данных, добавляя в них условия фильтрации (например, по Организации). Если в тексте запроса программистом не указано ключевое слово РАЗРЕШЕННЫЕ, а в базе данных присутствуют записи, на которые у текущего пользователя нет прав (например, зарплатный проект другой организации), система генерирует исключение «Недостаточно прав».
В рассматриваемой версии ЗУП разработчики допустили программную ошибку: в модуле менеджера справочника ЗарплатныеПроекты запрос выполняется ко всем записям без учета прав доступа. Как только мы настраиваем в профиле «Кадровик» ограничение «по организациям» (разрешаем одну и запрещаем другую), запрос пытается прочитать «чужой» зарплатный проект и падает.
Рассмотрим, как выглядит проблемный участок кода в модуле менеджера справочника ЗарплатныеПроекты:
ТекстЗапроса =
"ВЫБРАТЬ
| ЗарплатныеПроекты.Банк КАК Банк
|ИЗ
| Справочник.ЗарплатныеПроекты КАК ЗарплатныеПроекты
|ГДЕ
| ЗарплатныеПроекты.ИспользоватьЭлектронныйДокументооборотСБанком = &ИспользоватьЭлектронныйДокументооборот";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ИспользоватьЭлектронныйДокументооборот", ИспользоватьЭлектронныйДокументооборот);
Результат = Запрос.Выполнить(); // Именно здесь происходит прерывание, если нет слова РАЗРЕШЕННЫЕ
Может возникнуть логичный вопрос: почему ошибка «вылетает» при открытии формы списка больничных листов или сотрудников, хотя проблема в справочнике зарплатных проектов? Разберем эту связь. При создании формы любого объекта в 1С:ЗУП срабатывает механизм подключаемых команд. Система анализирует, какие кнопки нужно вывести на панель инструментов (например, кнопки печати или обмена с банками).
Для этого вызывается общий модуль ОбменСБанкамиПоЗарплатнымПроектам, который, в свою очередь, обращается к методам справочника ЗарплатныеПроекты, чтобы узнать, настроен ли в базе хотя бы один проект с электронным обменом. Поскольку этот вызов происходит «под капотом» при открытии формы, пользователь видит ошибку прав доступа еще до того, как список документов отобразится на экране.
Поскольку проблема признана разработчиками 1С как «баг» типовой конфигурации, самым правильным и быстрым решением будет установка исправлений (патчей). Фирма 1С выпустила несколько патчей для устранения этой коллизии в ветке 3.1.18.
Выполним следующие шаги для исправления:
EF_00_00384877 или EF_60000185, необходимо нажать кнопку Поиск и установка исправлений (требуется подключение к интернет-поддержке).EF_00_00384877 с портала ИТС вручную и загрузим его через кнопку Установить исправление из файла.После установки патча и перезапуска сеанса пользователем, запрос в справочнике будет дополнен конструкцией РАЗРЕШЕННЫЕ, и ошибка исчезнет.
Если по каким-то причинам вы не можете установить патчи прямо сейчас (например, база сильно кастомизирована или нет доступа к интернет-поддержке), проанализируем альтернативный вариант. Нам нужно сделать так, чтобы механизм RLS «пропускал» запрос к справочнику зарплатных проектов.
Рассмотрим пошагово процесс настройки «заглушки»:
Чтение зарплатных проектов.Таким образом, у пользователя появится дополнительная роль на чтение справочника, которая не ограничена правилами RLS. Платформа, объединяя права, позволит запросу выполниться без ошибки, так как у пользователя появится право видеть все зарплатные проекты, даже если он не видит документы по этим организациям.
Если ваша конфигурация находится на поддержке с возможностью изменения, мы можем самостоятельно внести правки в код. Посмотрим на пример того, как должен выглядеть исправленный запрос в модуле менеджера справочника ЗарплатныеПроекты:
// Было:
// "ВЫБРАТЬ ЗарплатныеПроекты.Банк КАК Банк ИЗ Справочник.ЗарплатныеПроекты КАК ЗарплатныеПроекты"
// Стало (добавляем РАЗРЕШЕННЫЕ):
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ЗарплатныеПроекты.Банк КАК Банк
|ИЗ
| Справочник.ЗарплатныеПроекты КАК ЗарплатныеПроекты
|ГДЕ
| ЗарплатныеПроекты.ИспользоватьЭлектронныйДокументооборотСБанком = &ИспользоватьЭлектронныйДокументооборот";
Добавление РАЗРЕШЕННЫЕ заставляет платформу просто игнорировать записи, к которым нет доступа, вместо того чтобы прерывать работу программы. Однако помните, что внесение изменений в типовой код лишает вас возможности автоматического обновления, поэтому предпочтительнее использовать расширение конфигурации.
В расширении можно перехватить метод ИспользующиеЭлектронныйДокументооборотСБанком и подменить запрос на корректный. Это сохранит типовую конфигурацию «чистой».
Мы проанализировали ситуацию и выяснили, что корень проблемы кроется в несоответствии кода типового решения требованиям безопасности при включенном RLS. Ошибка носит массовый характер для версий ЗУП 3.1.18 и успешно лечится либо обновлением на более свежие релизы (где ошибка уже исправлена в основном коде), либо точечной установкой патчей.
Резюмируем наши действия: при возникновении ошибки прав у Кадровика первым делом проверяем настройки RLS. Если ограничения по организациям включены — смело устанавливаем патч EF_00_00384877. Это самый безопасный и эффективный способ вернуть систему в рабочее состояние.