При доработке бухгалтерских отчетов (например, «Карточки счета» или «Карточки субконто») нередко возникает задача скрыть персональные данные сотрудников по зарплатным счетам (счет 70, субсчета счета 69 и т. д.) от пользователей, не обладающих административными или полными правами доступа. Поле субконто на таких счетах имеет составной тип данных, поэтому разработчики часто пытаются применить привычные конструкции языка запросов прямо в выражениях системы компоновки данных (СКД), что приводит к синтаксическим ошибкам.
Разберем детально, почему стандартные конструкции языка запросов вызывают ошибки в СКД, как правильно определить тип субконто и как автоматизировать проверку прав пользователя.
Выясним причину, по которой привычные конструкции не работают на вкладке «Вычисляемые поля». В СКД используется собственный язык выражений, который существенно отличается от синтаксиса классического языка запросов 1С:
ССЫЛКА: в языке выражений СКД оператор ССЫЛКА не поддерживается. Попытка написать СубконтоДт1 Ссылка Справочник.ФизическиеЛица неизбежно вызовет ошибку компиляции выражения.Тип(): в языке запросов тип метаданных указывается без кавычек, например ТИП(Справочник.ФизическиеЛица). В языке выражений СКД функция Тип() принимает аргументом строго строковый литерал: Тип("СправочникСсылка.ФизическиеЛица"). Использование конструкции Тип(Справочник.ФизическиеЛица) приводит к ошибке «Поле не найдено».Выразить(): в языке запросов пишется ВЫРАЗИТЬ(Поле КАК Справочник.ФизическиеЛица). В языке выражений СКД синтаксис функции требует перечисления параметров через запятую, где тип объекта задается строкой: Выразить(Поле, "СправочникСсылка.ФизическиеЛица").Рассмотрим наиболее надежный и компактный способ проверки типа в вычисляемом поле или выражении представления. Если привести составное поле к нужному ссылочному типу с помощью функции Выразить(), то в случае несовпадения типа функция вернет значение NULL.
Посмотрим на пример выражения для проверки того, относится ли субконто к справочнику физических лиц:
Выбор
Когда Выразить(СубконтоДт1, "Справочник.ФизическиеЛица") Есть Не NULL
Тогда "<Физическое лицо>"
Иначе
СубконтоДт1
Конец
Если тип значения СубконтоДт1 не является ссылкой на справочник «Физические лица», выражение вернет NULL, условие Есть Не NULL не выполнится, и значение субконто отобразится без изменений.
Разберем еще один рабочий вариант, основанный на сравнении типов через типизированный параметр схемы данных. Этот способ удобен, когда тип необходимо передавать динамически или настраивать на уровне параметров СКД.
Разберем реализацию по шагам:
ЗначениеСубконто.СправочникСсылка.ФизическиеЛица (или любой требуемый тип).
Выбор
Когда ТипЗначения(СубконтоДт1) = Тип(&ЗначениеСубконто)
Тогда "<Физическое лицо>"
Иначе
СубконтоДт1
Конец
Проанализируем задачу проверки прав. Чтобы скрывать персональные данные только от пользователей с ограниченными правами, в схему добавляется логический параметр ПолныеПрава. Заполнять его вручную пользователю нельзя, поэтому определим значение автоматически средствами платформы.
Для этого откроем вкладку «Параметры» схемы компоновки и в строке параметра ПолныеПрава (тип «Булево») заполним колонку «Выражение»:
РольДоступна("ПолныеПрава")
Для типовых конфигураций на базе БСП (например, «1С:Бухгалтерия предприятия 8.3») можно использовать функции модулей БСП:
Пользователи.ЭтоПолныеПрава()
Обязательно включим флаг «Ограничение доступности» для данного параметра. В этом случае СКД автоматически вычислит доступность роли в момент формирования отчета.
Обратим внимание на важную архитектурную деталь: подмена субконто строковым текстом в вычисляемом поле полностью лишает отчет возможности расшифровки. Двойной клик по строке перестанет открывать карточку объекта или связанные документы, а также перестанет работать сортировка по реквизитам исходного справочника.
Чтобы сохранить типизацию, выполним настройку через «Выражение представления»:
СубконтоДт1 в списке полей набора данных.
Выбор
Когда НЕ &ПолныеПрава И Выразить(СубконтоДт1, "Справочник.ФизическиеЛица") Есть Не NULL
Тогда "<Физическое лицо>"
Иначе
Представление(СубконтоДт1)
Конец
Такой подход решает поставленную задачу наиболее корректно: пользователи без полных прав видят обезличенную строку <Физическое лицо>, при этом в структуре данных отчет продолжает оперировать оригинальными ссылками и проводками.