Разберем ситуацию, когда в запросе Системы Компоновки Данных (СКД) регистр сведений соединяется со справочником "Сотрудники", даже если поле "Сотрудник" в регистре не является составным типом. Выясним основные причины такого соединения и проанализируем, как это влияет на отчеты и безопасность данных.
Рассмотрим несколько ключевых аспектов, которые объясняют необходимость такого соединения.
Первая и наиболее очевидная причина – это возможность устанавливать отборы в отчетах СКД по полям справочника "Сотрудники". Даже если в регистре хранится только ссылка на сотрудника, пользователю может потребоваться отбирать данные не просто по коду или UID сотрудника, а по его фамилии, имени, отчеству, подразделению или другим реквизитам, которые хранятся именно в справочнике.
Сотрудники для создания сложных условий отбора в настройках СКД. Например, "Вывести данные только по сотрудникам из отдела Продаж".Посмотрим на пример, как это может выглядеть в запросе:
ВЫБРАТЬ
РегистрСведений.Измерение1,
РегистрСведений.Ресурс1,
Сотрудники.Наименование КАК СотрудникНаименование,
Сотрудники.Подразделение КАК ПодразделениеСотрудника
ИЗ
РегистрСведений КАК РегистрСведений
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
ПО РегистрСведений.Сотрудник = Сотрудники.Ссылка
ГДЕ
Сотрудники.Подразделение = &ВыбранноеПодразделение
В данном случае, без соединения со справочником Сотрудники, мы не смогли бы отбирать данные по полю Подразделение, которое находится в справочнике, а не в регистре.
Одной из наиболее важных и часто неочевидных причин соединения является корректное применение ограничений доступа на уровне записей (RLS). Разберем эту ситуацию подробнее.
Сотрудники и на регистр, который содержит ссылку на сотрудника, установлены разные правила RLS, то соединение может быть критически важным.ПриЗаполненииОграниченияДоступа для справочника Сотрудники и для регистра.RLS для регистра (пример):
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ЗначениеРазрешено(Сотрудник.ФизическоеЛицо)";
КонецПроцедуры
Здесь ограничение на регистр может быть достаточно простым, например, по физическому лицу сотрудника.
RLS для справочника Сотрудники (пример из ЗУП):
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"ПрисоединитьДополнительныеТаблицы
|ЭтотСписок КАК Т
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОрганизацииВКоторыхРаботалиСотрудники КАК Т2
| ПО Т2.Сотрудник = Т.Ссылка
|;
|РазрешитьЧтениеИзменение
|ГДЕ
| ЗначениеРазрешено(Т2.Организация)
| и ЗначениеРазрешено(Т.ФизическоеЛицо)";
КонецПроцедуры
Обратите внимание, что в RLS справочника Сотрудники используется соединение с регистром сведений ОрганизацииВКоторыхРаботалиСотрудники. Это позволяет ограничить видимость сотрудников по организациям. Если в регистре, из которого мы строим отчет, нет такого ограничения, а на справочнике оно есть, то без соединения со справочником в запросе СКД, RLS справочника не будет применен к данным регистра, и пользователь сможет увидеть всех сотрудников, даже тех, на кого у него нет прав по организации.
Выясним причину: Когда запрос СКД соединяет регистр со справочником, RLS будет применяться к обоим объектам. Таким образом, если у пользователя нет прав на определенного сотрудника в соответствии с правилами RLS справочника (например, по организации), то и связанные с этим сотрудником записи регистра не будут отображены. Это обеспечивает целостность и безопасность данных.
Даже если мы не используем отборы по реквизитам справочника, соединение может быть необходимо для вывода этих реквизитов в отчет или использования их в логике вычисляемых полей.
Сотрудники.Сотрудники.Посмотрим на пример вывода дополнительных реквизитов:
ВЫБРАТЬ
РегистрСведений.Период,
РегистрСведений.Сотрудник,
Сотрудники.Наименование КАК ФИОСотрудника,
Сотрудники.Должность КАК ДолжностьСотрудника
ИЗ
РегистрСведений КАК РегистрСведений
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
ПО РегистрСведений.Сотрудник = Сотрудники.Ссылка
Без соединения, поля ФИОСотрудника и ДолжностьСотрудника были бы недоступны для вывода в отчет.
Проанализируем, как СКД может обрабатывать такие соединения и какие возможности это дает пользователям.
Сотрудники дает возможность пользователю гибко настраивать отчет, используя различные поля сотрудника в отборах, группировках или параметрах. Пользователь может самостоятельно добавлять группировки по подразделениям, должностям и т.д., что повышает функциональность отчета без изменения его схемы.Таким образом, соединение регистра со справочником Сотрудники в запросах СКД является не просто избыточным действием, а часто необходимым условием для корректной работы отчетов, применения правил RLS и предоставления пользователям широких возможностей по настройке и анализу данных. Всегда обращайте внимание на настройки структуры СКД и правила RLS, чтобы понять полную картину происходящего.