При сопровождении типовых конфигураций (например, 1С:Зарплата и управление персоналом 3.1) разработчики часто сталкиваются с ситуацией: регламентированный или аналитический отчет (такой как Унифицированная форма Т-13) формируется под полными правами корректно, а под правами кадровика или расчетчика вместо фактических неявок (больничных, отпусков) отображает стандартные явки. При этом ошибок доступа платформа не выдает, а ручной перенос запроса отчета в консоль запросов затруднен огромным количеством параметров.
Разберем детально, почему это происходит, как быстро выгрузить запрос компоновки вместе с реальными значениями параметров и как устранить причину расхождения данных.
Проанализируем механику работы ограничений на уровне записей (RLS) в отчетах СКД:
ЛЕВОЕ СОЕДИНЕНИЕ к срезам регистров сведений (например, к регистру СостоянияСотрудников). Если у пользователя нет прав на чтение конкретной записи в присоединяемой таблице, платформа не генерирует исключение о нарушении прав, а возвращает NULL для всех полей этой строки.ЕСТЬNULL(..., "Я"). В результате недоступный из-за RLS больничный лист превращается в пустое значение, которое алгоритм расчета табеля трактует как обычный рабочий день (явку).Чтобы не заполнять десятки параметров вручную в консоли запросов, получим готовый запрос и заполненные параметры напрямую из макета компоновки данных. Сделать это можно в точке останова отладчика перед выполнением отчета или через внешнюю обработку.
Рассмотрим по шагам программный код, который извлекает текст запроса и выгружает сформированные параметры в структуру:
// Получаем схему и настройки компоновки данных
СхемаКомпоновкиДанных = ОтчетОбъект.СхемаКомпоновкиДанных;
Настройки = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
// Выполняем компоновку макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки,,, Тип("ГенераторМакетаКомпоновкиДанных"));
// 1. Извлекаем итоговый текст запроса с учетом всех группировок и условий
ТекстЗапросаДляКонсоли = "";
Для Каждого НаборДанных Из МакетКомпоновки.НаборыДанных Цикл
Если ТипЗнч(НаборДанных) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
ТекстЗапросаДляКонсоли = ТекстЗапросаДляКонсоли + Символы.ПС + НаборДанных.Запрос;
КонецЕсли;
КонецЦикла;
// 2. Извлекаем все фактические параметры
СтруктураПараметров = Новый Структура;
Для Каждого ПараметрМакета Из МакетКомпоновки.ЗначенияПараметров Цикл
СтруктураПараметров.Вставить(ПараметрМакета.Имя, ПараметрМакета.Значение);
КонецЦикла;
Полученные данные можно сразу передать в консоль запросов, не тратя время на заполнение параметров вручную.
Если нет возможности запустить отладчик в рабочей базе, зафиксируем реальный запрос к СУБД с наложенными условиями RLS через технологический журнал. Для этого достаточно настроить сбор события SDBL с фильтром по пользователю или имени метаданных отчета. В лог запишется текст запроса со всеми подставленными литералами и условиями ограничений прав, что позволит увидеть, на какой именно таблице отсекаются строки.
Если текст запроса уже открыт в консоли под проблемным пользователем, выясним, какая именно таблица дает сбой:
РАЗРЕШЕННЫЕ из первой секции пакетного запроса.РАЗРЕШЕННЫЕ сверху вниз по пакетам, пока платформа не выдаст ошибку прав. Та таблица, на которой произойдет сбой, и является источником скрытого ограничения.Частой причиной скрытого срабатывания RLS в ЗУП 3.1 является человеческий фактор при ведении справочников. Рассмотрим типовой сценарий:
#ПоЗначениям("РегистрСведений.СостоянияСотрудников", "Чтение", "", "ГруппыФизическихЛиц", "Сотрудник.ФизическоеЛицо")).ФизическиеЛица.СостоянияСотрудников, подставляя NULL.Для исправления ситуации выполним следующие действия:
КлючиДоступаКОбъектам и КлючиДоступаКРегистрам.Если бизнес-логика предприятия требует, чтобы пользователь видел унифицированную форму табеля целиком (включая факт отсутствия), но не имел прямого доступа к карточкам закрытых физических лиц, формирование отчета переводят в привилегированный режим.
Для этого в модуле объекта отчета при компоновке данных вызывают инструкцию:
УстановитьПривилегированныйРежим(Истина);
В этом случае компоновщик данных игнорирует ограничения RLS по группам физических лиц исключительно в момент генерации макета и вывода результата, обеспечивая корректное заполнение табельных обозначений.