Имя: Пароль:
1C
1С v8
Отборы при создании отчёта программно
0 Очень Любознательная
 
11.08.20
15:36
Добрый день. Делаю отчёт внешний по образованиям, аттестациям и сертификатам сотрудников в ЗУПе.
Отчёт должен выводить сотрудников, работающих в организации на дату отчёта. Соответственно, я получаю их функцией КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудников);
Но у меня в отчёте могут быть отборы по сотрудникам, подразделению, должности и категории сотрудника (это реквизит справочника сотрудники). Пока у меня это получается только через вывод на форму
КомпоновщикНастроекНастройкиОтбор и "разборе" отбора в коде, то есть, вот так (пример отчёта, где отборы могут быть по сотруднику, подразделению и должности)

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

        СотрудникиОрганизации = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудников);
        СотрудникиОрганизации.Сортировать("ПолеПорядка2");
    КонецЕсли;

Есть ли возможность сделать это проще/красивее? Просто сейчас отборов будет 5, а если их будет 20? Как это реализовано в стандартных отчётах?