Как в ЗУП 3.1 через расширение добавить жесткий отбор по группе подразделений во все типовые отчеты, включая взаиморасчеты с сотрудниками?

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

При работе с крупными информационными базами 1С:Зарплата и управление персоналом часто возникает задача ограничить видимость данных в отчетах (например, кадровую историю с ФОТ). Если стандартных прав доступа недостаточно или требуется внедрить специфическую логику фильтрации (например, по динамически определяемой группе подразделений), разработчики прибегают к использованию расширений, требующих предварительного анализа. Рассмотрим, как реализовать "жесткий" отбор, который пользователь не сможет случайно отключить или изменить в настройках.

Метод 1. Использование механизма фиксированных настроек СКД

Самый надежный способ внедрить отбор на уровне системы компоновки данных (СКД) — это использование свойства ФиксированныеНастройки компоновщика. В отличие от обычных настроек, фиксированные настройки накладываются системой «поверх» пользовательских и не отображаются в стандартном окне настроек отчета. Это делает их идеальным инструментом для реализации бизнес-логики ограничения данных, например, для плановых начислений сотрудников.

Разберем, как реализовать это через общую форму отчета. Нам потребуется расширить форму ФормаОтчета (общая форма БСП) и перехватить событие инициализации. Проанализируем пример кода:


&НаСервере
&ИзменениеИКонтроль("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Вызываем оригинальный обработчик
    ЗабытьОбъект(); 
    
    // Определяем массив подразделений или целевую группу
    ГруппаПодразделений = Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию("ЦелевойДепартамент");
    
    Если ЗначениеЗаполнено(ГруппаПодразделений) Тогда
        ДобавитьЖесткийОтборПоПодразделению(Отчет.КомпоновщикНастроек, ГруппаПодразделений);
    КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ДобавитьЖесткийОтборПоПодразделению(КомпоновщикНастроек, ЗначениеГруппы)
    
    // Работаем именно с фиксированными настройками
    ЭлементОтбора = КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Подразделение");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
    ЭлементОтбора.ПравоеЗначение = ЗначениеГруппы;
    ЭлементОтбора.Использование = Истина;
    
КонецПроцедуры

Важно помнить, что поле Подразделение может называться по-разному в разных отчетах. В типовых отчетах ЗУП 3.1 оно стандартизировано, но в некоторых случаях может потребоваться проверка наличия поля в доступных полях компоновщика перед добавлением отбора.

Метод 2. Внедрение в механизм представлений ЗУП

В конфигурации ЗУП 3.1 большинство отчетов строятся не на прямых запросах к таблицам, а через механизм общих наборов данных и виртуальных представлений. Это позволяет системе динамически подставлять разрезы учета. Проанализируем возможность вклиниться в этот процесс на уровне общего модуля.

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

Рассмотрим, почему это эффективно. Когда мы добавляем отбор в ФиксированныеНастройки, СКД применяет его к уже полученному результату запроса (или добавляет во вложенный запрос). Если же мы модифицируем "Представление", мы ограничиваем выборку на самом раннем этапе. Посмотрим на алгоритм действий:

  1. Создаем расширение для общего модуля ЗарплатаКадрыОбщиеНаборыДанных.
  2. Используем аннотацию &После для процедуры ЗаполнитьОбщиеИсточникиДанныхОтчета.
  3. Внутри процедуры анализируем структуру источников и добавляем условие ГДЕ для таблиц, содержащих подразделения.

Этот метод сложнее в реализации, так как требует глубокого понимания структуры метаданных ЗУП, но он обеспечивает наилучшую производительность на больших объемах данных.

Метод 3. Использование события «НаПрисвоенииНастроекКомпоновщика»

В современных версиях Библиотеки стандартных подсистем (БСП), на которой базируется ЗУП, предусмотрено специальное событие для программной модификации настроек компоновщика. Рассмотрим подробнее процедуру НаПрисвоенииНастроекКомпоновщика.

Эта точка расширения удобна тем, что она срабатывает каждый раз, когда отчет меняет вариант или загружает настройки. Проанализируем ситуацию: если мы добавим отбор только в ПриСозданииНаСервере, он может "слететь" при смене варианта отчета пользователем. Использование специализированного события БСП позволяет избежать этой проблемы.

Пример реализации логики:


// В модуле объекта отчета или через расширение формы
Процедура НаПрисвоенииНастроекКомпоновщика(Контекст, Настройки) Экспорт
    
    ПолеПодразделение = Новый ПолеКомпоновкиДанных("Подразделение");
    
    // Проверяем, нет ли уже такого отбора, чтобы не дублировать
    Для Каждого Элемент Из Настройки.Отбор.Элементы Цикл
        Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") 
            И Элемент.ЛевоеЗначение = ПолеПодразделение Тогда
            Возврат; 
        КонецЕсли;
    КонецЦикла;
    
    // Добавляем программный отбор
    НовыйОтбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    НовыйОтбор.ЛевоеЗначение = ПолеПодразделение;
    НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
    НовыйОтбор.ПравоеЗначение = ПолучитьГруппуДоступа(); // Ваша функция получения группы
    НовыйОтбор.Использование = Истина;
    НовыйОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

КонецПроцедуры

Важные нюансы и риски программного подхода

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

1. Проблема расшифровки (drill-down)

При двойном клике на ячейку отчета открывается новый отчет (расшифровка). Если жесткий отбор был добавлен только в форму родительского отчета, расшифровка может открыться без учета этого фильтра. Чтобы этого избежать, необходимо также обрабатывать событие ОбработкаРасшифровки и передавать настройки в открываемую форму.

2. Регламентированная отчетность

Помните, что такие отчеты, как 6-НДФЛ, П-4 или ЕФС-1, часто строятся не на СКД, а по сложным алгоритмам в модулях менеджеров. Для них потребуется индивидуальный поиск точек входа в процедурах заполнения данных. Проанализируем модуль менеджера конкретного отчета, найдем запрос формирования данных и добавим туда фильтрацию по подразделениям через расширение запроса.

3. Производительность vs RLS

Если задача стоит в обеспечении безопасности данных, RLS (Row Level Security) всегда предпочтительнее. Программные отборы — это "косметическое" ограничение. Если пользователь обладает правами на чтение справочника и регистров, он теоретически может добраться до данных через консоль запросов или другие механизмы. Однако для целей удобства интерфейса и логического разделения отчетов программный метод через фиксированные настройки является стандартом разработки.

Рекомендация по иерархии

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

Подводя итог, наиболее сбалансированным решением для ЗУП 3.1 является сочетание расширения общей формы отчета (для управления фиксированными настройками) и модификации общих модулей, отвечающих за формирование источников данных, если требуется охватить абсолютно все отчеты системы, включая регламентированные.

← На главную