Как проверить тип субконто и скрыть персональные данные в отчете на СКД?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При доработке бухгалтерских отчетов (например, «Карточки счета» или «Карточки субконто») нередко возникает задача скрыть персональные данные сотрудников по зарплатным счетам (счет 70, субсчета счета 69 и т. д.) от пользователей, не обладающих административными или полными правами доступа. Поле субконто на таких счетах имеет составной тип данных, поэтому разработчики часто пытаются применить привычные конструкции языка запросов прямо в выражениях системы компоновки данных (СКД), что приводит к синтаксическим ошибкам.

Разберем детально, почему стандартные конструкции языка запросов вызывают ошибки в СКД, как правильно определить тип субконто и как автоматизировать проверку прав пользователя.

Анализ причин синтаксических ошибок в вычисляемых полях СКД

Выясним причину, по которой привычные конструкции не работают на вкладке «Вычисляемые поля». В СКД используется собственный язык выражений, который существенно отличается от синтаксиса классического языка запросов 1С:

  1. Отсутствие оператора ССЫЛКА: в языке выражений СКД оператор ССЫЛКА не поддерживается. Попытка написать СубконтоДт1 Ссылка Справочник.ФизическиеЛица неизбежно вызовет ошибку компиляции выражения.
  2. Специфика функции Тип(): в языке запросов тип метаданных указывается без кавычек, например ТИП(Справочник.ФизическиеЛица). В языке выражений СКД функция Тип() принимает аргументом строго строковый литерал: Тип("СправочникСсылка.ФизическиеЛица"). Использование конструкции Тип(Справочник.ФизическиеЛица) приводит к ошибке «Поле не найдено».
  3. Синтаксис функции Выразить(): в языке запросов пишется ВЫРАЗИТЬ(Поле КАК Справочник.ФизическиеЛица). В языке выражений СКД синтаксис функции требует перечисления параметров через запятую, где тип объекта задается строкой: Выразить(Поле, "СправочникСсылка.ФизическиеЛица").

Решение 1. Проверка типа составного поля через функцию Выразить()

Рассмотрим наиболее надежный и компактный способ проверки типа в вычисляемом поле или выражении представления. Если привести составное поле к нужному ссылочному типу с помощью функции Выразить(), то в случае несовпадения типа функция вернет значение NULL.

Посмотрим на пример выражения для проверки того, относится ли субконто к справочнику физических лиц:


Выбор
    Когда Выразить(СубконтоДт1, "Справочник.ФизическиеЛица") Есть Не NULL
        Тогда "<Физическое лицо>"
    Иначе
        СубконтоДт1
Конец

Если тип значения СубконтоДт1 не является ссылкой на справочник «Физические лица», выражение вернет NULL, условие Есть Не NULL не выполнится, и значение субконто отобразится без изменений.

Решение 2. Проверка соответствия через параметр схемы компоновки

Разберем еще один рабочий вариант, основанный на сравнении типов через типизированный параметр схемы данных. Этот способ удобен, когда тип необходимо передавать динамически или настраивать на уровне параметров СКД.

Разберем реализацию по шагам:

  1. Перейдем на закладку «Параметры» схемы компоновки данных.
  2. Добавим новый параметр с именем ЗначениеСубконто.
  3. Укажем для него тип данных СправочникСсылка.ФизическиеЛица (или любой требуемый тип).
  4. Установим флаг «Ограничение доступности», чтобы данный технический параметр не отображался пользователю в настройках отчета.
  5. В вычисляемом поле используем следующую конструкцию:

Выбор
    Когда ТипЗначения(СубконтоДт1) = Тип(&ЗначениеСубконто)
        Тогда "<Физическое лицо>"
    Иначе
        СубконтоДт1
Конец

Определение прав пользователя в параметрах СКД

Проанализируем задачу проверки прав. Чтобы скрывать персональные данные только от пользователей с ограниченными правами, в схему добавляется логический параметр ПолныеПрава. Заполнять его вручную пользователю нельзя, поэтому определим значение автоматически средствами платформы.

Для этого откроем вкладку «Параметры» схемы компоновки и в строке параметра ПолныеПрава (тип «Булево») заполним колонку «Выражение»:

РольДоступна("ПолныеПрава")

Для типовых конфигураций на базе БСП (например, «1С:Бухгалтерия предприятия 8.3») можно использовать функции модулей БСП:

Пользователи.ЭтоПолныеПрава()

Обязательно включим флаг «Ограничение доступности» для данного параметра. В этом случае СКД автоматически вычислит доступность роли в момент формирования отчета.

Итоговый пример: использование выражения представления поля

Обратим внимание на важную архитектурную деталь: подмена субконто строковым текстом в вычисляемом поле полностью лишает отчет возможности расшифровки. Двойной клик по строке перестанет открывать карточку объекта или связанные документы, а также перестанет работать сортировка по реквизитам исходного справочника.

Чтобы сохранить типизацию, выполним настройку через «Выражение представления»:

  1. Откроем вкладку «Наборы данных» в СКД.
  2. Найдем поле СубконтоДт1 в списке полей набора данных.
  3. В колонке «Выражение представления» укажем условие:

Выбор
    Когда НЕ &ПолныеПрава И Выразить(СубконтоДт1, "Справочник.ФизическиеЛица") Есть Не NULL
        Тогда "<Физическое лицо>"
    Иначе
        Представление(СубконтоДт1)
Конец

Такой подход решает поставленную задачу наиболее корректно: пользователи без полных прав видят обезличенную строку <Физическое лицо>, при этом в структуре данных отчет продолжает оперировать оригинальными ссылками и проводками.

← На главную