При разработке внешних отчетов в конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3.0) программисты часто сталкиваются с проблемой: отчет прекрасно работает под полными правами, но у пользователя с ограниченными правами (например, только на чтение отчетов) возникает ошибка доступа или колонки просто не выводятся. Особенно остро эта проблема проявляется при работе с регистром бухгалтерии Хозрасчетный и его виртуальными таблицами остатков и оборотов.
Причина кроется в механизме работы составных типов данных (которыми являются субконто) и системе компоновки данных (СКД). Разберем пошагово, почему это происходит и как правильно настроить запрос, чтобы отчет работал у любого пользователя без необходимости изменять роли в конфигурации.
Поля Субконто1, Субконто2 и Субконто3 в регистре бухгалтерии имеют составной тип, который может включать сотни справочников и документов. Когда в запросе мы обращаемся к реквизиту субконто через точку (например, Субконто1.Код или Субконто3.Дата), платформа 1С на уровне SQL-запроса пытается выполнить соединение со всеми возможными таблицами, входящими в этот тип.
Если у пользователя нет прав хотя бы на один из этих объектов (даже если он физически не используется на выбранном счете), система может:</1>
NULL в значении поля.Рассмотрим способы решения этой задачи, начиная от простых исправлений в запросе и заканчивая архитектурными подходами.
Проанализируем ситуацию: если мы точно знаем, что на определенном счете в качестве субконто выступает конкретный справочник (например, Номенклатура), нам не нужно, чтобы система проверяла права на все остальные типы. Для этого используется оператор ВЫРАЗИТЬ.
Вместо прямого обращения ХозрасчетныйОстатки.Субконто1.Код, мы должны явно указать тип объекта:
ВЫБРАТЬ
ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.Номенклатура) КАК Номенклатура,
ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.Номенклатура).Код КАК КодНоменклатуры
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки
Важный момент: если в поле Субконто1 окажется объект другого типа (не Номенклатура), функция ВЫРАЗИТЬ вернет NULL. Поэтому данный способ идеально подходит для отчетов с жестко заданными фильтрами по счетам.
Если поле субконто может содержать несколько разных типов документов (например, "Документ-основание" в партиях), использование ВЫРАЗИТЬ может стать громоздким. В этом случае эффективнее использовать ЛЕВОЕ СОЕДИНЕНИЕ с нужными таблицами документов. Это позволяет получить данные (например, Дату или Номер) только из тех объектов, к которым у пользователя есть доступ.
Посмотрим на пример реализации такого запроса:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ХозрасчетныйОстатки.Счет КАК Счет,
ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.Номенклатура) КАК Номенклатура,
ВЫБОР
КОГДА НЕ ПоступлениеТоваровУслуг.Ссылка ЕСТЬ NULL
ТОГДА ПоступлениеТоваровУслуг.Дата
КОГДА НЕ АвансовыйОтчет.Ссылка ЕСТЬ NULL
ТОГДА АвансовыйОтчет.Дата
ИНАЧЕ NULL
КОНЕЦ КАК ДатаДокумента
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, , &ВидыСубконто, Организация = &Организация) КАК ХозрасчетныйОстатки
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ПО ХозрасчетныйОстатки.Субконто2 = ПоступлениеТоваровУслуг.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет КАК АвансовыйОтчет
ПО ХозрасчетныйОстатки.Субконто2 = АвансовыйОтчет.Ссылка
Обратите внимание на использование слова РАЗРЕШЕННЫЕ. Оно критически важно: если у пользователя нет прав на чтение одного из видов документов, указанных в ЛЕВОЕ СОЕДИНЕНИЕ, запрос не упадет с ошибкой, а просто проигнорирует эти записи.
Для оптимизации работы запроса и исключения лишних проверок прав, мы можем добавить условие на типы данных прямо в секцию ГДЕ. Это подскажет платформе, какие именно таблицы нужно анализировать.
ГДЕ
ТИПЗНАЧЕНИЯ(ХозрасчетныйОстатки.Субконто2) В (
ТИП(Документ.ПоступлениеТоваровУслуг),
ТИП(Документ.Партия),
ТИП(Документ.ОприходованиеТоваров)
)
Это ограничение не только решает проблему с правами, но и ускоряет выполнение запроса, так как СУБД будет просматривать меньше таблиц.
Выясним еще одну важную деталь: параметры виртуальной таблицы. В запросах к регистру бухгалтерии важно передавать параметр ВидыСубконто. Если оставить этот параметр пустым, платформа будет пытаться подготовить универсальный план запроса для всех возможных субконто системы.
Рассмотрим правильное заполнение параметров в СКД:
ПланВидовХарактеристикСсылка.ВидыСубконтоХозрасчетные (доступен список значений).Если отчет должен показывать данные документов, к которым у пользователя категорически не может быть прямого доступа по правилам безопасности компании, единственным выходом будет использование привилегированного режима.
В БП 3.0 внешние отчеты подключаются через механизм "Дополнительные отчеты и обработки". Чтобы отчет работал в привилегированном режиме, необходимо:
УстановитьПривилегированныйРежим(Истина).В этом случае платформа проигнорирует ограничения RLS (Record Level Security) и покажет пользователю результат запроса, при этом сам пользователь по-прежнему не сможет открыть формы этих документов из отчета, если у него нет на них прав.
Проанализировав все способы, можно составить оптимальный алгоритм действий для программиста:
ВЫРАЗИТЬ при обращении к реквизитам субконто-справочников.ЛЕВОЕ СОЕДИНЕНИЕ к конкретным типам документов вместе с ключевым словом РАЗРЕШЕННЫЕ.Использование этих техник позволит вам создавать стабильные отчеты, которые не потребуют от системного администратора ручного добавления сотен прав в роли пользователей при каждом обновлении конфигурации.