Зачем в запросе СКД регистр соединяется со справочником "Сотрудники"?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет
← К списку

Разберем ситуацию, когда в запросе Системы Компоновки Данных (СКД) регистр сведений соединяется со справочником "Сотрудники", даже если поле "Сотрудник" в регистре не является составным типом. Выясним основные причины такого соединения и проанализируем, как это влияет на отчеты и безопасность данных.

Рассмотрим несколько ключевых аспектов, которые объясняют необходимость такого соединения.

1. Отборы СКД по сотрудникам

Первая и наиболее очевидная причина – это возможность устанавливать отборы в отчетах СКД по полям справочника "Сотрудники". Даже если в регистре хранится только ссылка на сотрудника, пользователю может потребоваться отбирать данные не просто по коду или UID сотрудника, а по его фамилии, имени, отчеству, подразделению или другим реквизитам, которые хранятся именно в справочнике.

  1. Гибкость для пользователя: Соединение со справочником позволяет пользователю выбирать сотрудников из удобного списка, используя их наименования, а не внутренние идентификаторы.
  2. Расширенные возможности отбора: Мы можем использовать любые реквизиты справочника Сотрудники для создания сложных условий отбора в настройках СКД. Например, "Вывести данные только по сотрудникам из отдела Продаж".

Посмотрим на пример, как это может выглядеть в запросе:


ВЫБРАТЬ
    РегистрСведений.Измерение1,
    РегистрСведений.Ресурс1,
    Сотрудники.Наименование КАК СотрудникНаименование,
    Сотрудники.Подразделение КАК ПодразделениеСотрудника
ИЗ
    РегистрСведений КАК РегистрСведений
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
        ПО РегистрСведений.Сотрудник = Сотрудники.Ссылка
ГДЕ
    Сотрудники.Подразделение = &ВыбранноеПодразделение

В данном случае, без соединения со справочником Сотрудники, мы не смогли бы отбирать данные по полю Подразделение, которое находится в справочнике, а не в регистре.

2. Ограничение доступа на уровне записей (RLS)

Одной из наиболее важных и часто неочевидных причин соединения является корректное применение ограничений доступа на уровне записей (RLS). Разберем эту ситуацию подробнее.

  1. Различные правила RLS: Если на справочник Сотрудники и на регистр, который содержит ссылку на сотрудника, установлены разные правила RLS, то соединение может быть критически важным.
  2. Пример из ЗУП: Возьмем типовую конфигурацию ЗУП. Рассмотрим процедуру ПриЗаполненииОграниченияДоступа для справочника Сотрудники и для регистра.

RLS для регистра (пример):


Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
    Ограничение.Текст =
    "РазрешитьЧтениеИзменение
    |ГДЕ
    |    ЗначениеРазрешено(Сотрудник.ФизическоеЛицо)";
КонецПроцедуры

Здесь ограничение на регистр может быть достаточно простым, например, по физическому лицу сотрудника.

RLS для справочника Сотрудники (пример из ЗУП):


Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
    Ограничение.Текст =
    "ПрисоединитьДополнительныеТаблицы
    |ЭтотСписок КАК Т
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОрганизацииВКоторыхРаботалиСотрудники КАК Т2
    |    ПО Т2.Сотрудник = Т.Ссылка
    |;
    |РазрешитьЧтениеИзменение
    |ГДЕ
    |    ЗначениеРазрешено(Т2.Организация)
    |    и ЗначениеРазрешено(Т.ФизическоеЛицо)";
КонецПроцедуры

Обратите внимание, что в RLS справочника Сотрудники используется соединение с регистром сведений ОрганизацииВКоторыхРаботалиСотрудники. Это позволяет ограничить видимость сотрудников по организациям. Если в регистре, из которого мы строим отчет, нет такого ограничения, а на справочнике оно есть, то без соединения со справочником в запросе СКД, RLS справочника не будет применен к данным регистра, и пользователь сможет увидеть всех сотрудников, даже тех, на кого у него нет прав по организации.

Выясним причину: Когда запрос СКД соединяет регистр со справочником, RLS будет применяться к обоим объектам. Таким образом, если у пользователя нет прав на определенного сотрудника в соответствии с правилами RLS справочника (например, по организации), то и связанные с этим сотрудником записи регистра не будут отображены. Это обеспечивает целостность и безопасность данных.

3. Доступ к реквизитам справочника для вывода и логики

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

  1. Информативность отчета: Пользователю важно видеть не только ссылку на сотрудника, но и его ФИО, табельный номер, подразделение, должность и другую информацию, которая хранится в справочнике Сотрудники.
  2. Вычисляемые поля: В СКД мы можем создавать вычисляемые поля, которые используют данные из нескольких источников. Например, рассчитать стаж сотрудника, используя дату приема на работу из справочника Сотрудники.

Посмотрим на пример вывода дополнительных реквизитов:


ВЫБРАТЬ
    РегистрСведений.Период,
    РегистрСведений.Сотрудник,
    Сотрудники.Наименование КАК ФИОСотрудника,
    Сотрудники.Должность КАК ДолжностьСотрудника
ИЗ
    РегистрСведений КАК РегистрСведений
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
        ПО РегистрСведений.Сотрудник = Сотрудники.Ссылка

Без соединения, поля ФИОСотрудника и ДолжностьСотрудника были бы недоступны для вывода в отчет.

4. Особенности работы СКД и пользовательские настройки

Проанализируем, как СКД может обрабатывать такие соединения и какие возможности это дает пользователям.

  1. Автоматическое добавление соединений: Иногда СКД может автоматически добавлять соединения для корректной работы с отборами или для получения полной информации об объекте, даже если она неявно не указана в запросе. Это происходит, когда мы перетаскиваем поля из связанных объектов в структуру отчета.
  2. Гибкость пользовательских настроек: Соединение со справочником Сотрудники дает возможность пользователю гибко настраивать отчет, используя различные поля сотрудника в отборах, группировках или параметрах. Пользователь может самостоятельно добавлять группировки по подразделениям, должностям и т.д., что повышает функциональность отчета без изменения его схемы.

Таким образом, соединение регистра со справочником Сотрудники в запросах СКД является не просто избыточным действием, а часто необходимым условием для корректной работы отчетов, применения правил RLS и предоставления пользователям широких возможностей по настройке и анализу данных. Всегда обращайте внимание на настройки структуры СКД и правила RLS, чтобы понять полную картину происходящего.

← К списку