Пример универсальной функции для создания схемы компоновки данных с группировкой колонок

Публикация № 919530

Программирование - Универсальные функции

СКД

17
При использовании функции создания схемы компоновки данных согласно https://infostart.ru/public/575659/ было недостаточно возможности группировки колонок и вывода заголовка документа. Эти возможности и были добавлены в функцию.

Пример работы представлен в обработке:
1. В поле "Заголовок" указать заголовок документа
2. В поле "Текст запроса" ввести текст запроса
3. В поле "Группировка колонок" установить желаемую группировку колонок

Обработка протестирована в Документооборот 8 КОРП, редакция 2.1 (2.1.11.5). Платформа 8.3.12.1595. Текст доработанной функции приведен ниже:

// Создает схему компоновки данных для набора данных
//     запрос (типы: Строка, Запрос)
//     объект (типы: ТаблицаЗначений, ДеревоЗначений)
// Параметры:
//        НаборДанных    - Строка, Запрос, ТаблицаЗначений, ДеревоЗначений    - набор данных для создания схемы
//        СтруктураРесурсов    - Структура    - Структура полей ресурсов:
//            Ключ    - Имя поля
//            Значение    - Строка    - Агрегатная функция
//        ОписаниеКолонок    - ДеревоЗначений    - Описание выводимых колонок в формате:
//            Имя    - Имя колонки
//            Заголовок    - Заголовок колонки
//            ЭтоГруппа    - Истина, если колонка является группой, включающей другие колонки
//        Заголовок    - Строка    - Заголовок отчета
//        АвтоЗаполнениеДоступныхПолей    - Булево    - Значение флага автозаполнения доступных полей
//        ИмяСтандартногоМакетаОформления    - Строка    - Имя макета оформления
//
Функция СоздатьСхемуКомпоновкиДанных(НаборДанных, СтруктураРесурсов = Неопределено, ОписаниеКолонок = Неопределено, Заголовок = "", АвтоЗаполнениеДоступныхПолей = Истина, ИмяСтандартногоМакетаОформления = "")
    СКД = Новый СхемаКомпоновкиДанных;
    КоллекцияКолонок = Новый ТаблицаЗначений;
    КоллекцияКолонок.Колонки.Добавить("Имя");
    КоллекцияКолонок.Колонки.Добавить("ТипЗначения");
    КоллекцияКолонок.Колонки.Добавить("Заголовок");
    
    // Заполнение основных данных схемы
    ИсточникДанных = СКД.ИсточникиДанных.Добавить();
    ИсточникДанных.Имя = "ИсточникДанных";
    ИсточникДанных.ТипИсточникаДанных = "Local";
    
    Если ТипЗнч(НаборДанных) = Тип("Строка") или ТипЗнч(НаборДанных) = Тип("Запрос") Тогда
        ТекущийНаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
        ТекущийНаборДанных.Имя = "ОсновнойНабор";
        ТекущийНаборДанных.Запрос = ?(ТипЗнч(НаборДанных) = Тип("Строка"), НаборДанных, НаборДанных.Текст);
        ТекущийНаборДанных.ИсточникДанных = "ИсточникДанных";
        ТекущийНаборДанных.АвтоЗаполнениеДоступныхПолей = АвтоЗаполнениеДоступныхПолей;
        
        // Формирование коллекции колонок набора данных
        ПостроительЗапроса = Новый ПостроительЗапроса;
        Если ТипЗнч(НаборДанных) = Тип("Строка") Тогда
            ПостроительЗапроса.Текст = СокрЛП(НаборДанных);
        Иначе 
            ПостроительЗапроса.Текст = СокрЛП(НаборДанных.Текст);
        КонецЕсли;
        ПостроительЗапроса.ЗаполнитьНастройки();
        
        Для каждого Элт из ПостроительЗапроса.ВыбранныеПоля Цикл
            Если ОписаниеКолонок <> Неопределено И ОписаниеКолонок.Строки.Найти(Элт.Имя, "Имя", Истина) = Неопределено Тогда
                Продолжить;
            КонецЕсли;
            
            Колонка    = КоллекцияКолонок.Добавить();
            Колонка.Имя    = Элт.Имя;
            Колонка.Заголовок    = Элт.Представление;
            Колонка.ТипЗначения = ПостроительЗапроса.ДоступныеПоля[Элт.ПутьКДанным].ТипЗначения;
        КонецЦикла;
        
    ИначеЕсли ТипЗнч(НаборДанных) = Тип("ТаблицаЗначений") или ТипЗнч(НаборДанных) = Тип("ДеревоЗначений") Тогда
        ТекущийНаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
        ТекущийНаборДанных.Имя = "ОсновнойНабор";
        ТекущийНаборДанных.ИмяОбъекта = "ТаблицаИсточник";    
        ТекущийНаборДанных.ИсточникДанных = "ИсточникДанных";
        
        // Формирование коллекции колонок набора данных
        Для каждого Элт из НаборДанных.Колонки Цикл
            Если ОписаниеКолонок <> Неопределено И ОписаниеКолонок.Строки.Найти(Элт.Имя, "Имя", Истина) = Неопределено Тогда
                Продолжить;
            КонецЕсли;
            
            Колонка    = КоллекцияКолонок.Добавить();
            Колонка.Имя    = Элт.Имя;
            Колонка.Заголовок    = Элт.Заголовок;
            Колонка.ТипЗначения = Элт.ТипЗначения;
        КонецЦикла;
    Иначе            
        Возврат Неопределено;
    КонецЕсли;
    
    НастройкиПоУмолчанию = СКД.НастройкиПоУмолчанию;
    
    // Создание структуры.
    // Группировка, детальные записи и автовыбранное поле
    лГруппировка = НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    лГруппировка.Использование = Истина;
    АвтоПоле = лГруппировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    АвтоПоле.Использование = Истина;
    
    // Добавление ресурсов
    Если ТипЗнч(СтруктураРесурсов) = Тип("Структура") Тогда            
        Для Каждого ЭлСтруктуры Из СтруктураРесурсов Цикл
            // Проверка, а существует ли поле ресурса среди полей набора
            Если КоллекцияКолонок.Найти(ЭлСтруктуры.Ключ) <> Неопределено Тогда
                // Проверка на правильность указания агрегатной функции
                Если    ЭлСтруктуры.Значение = "Сумма" 
                    ИЛИ ЭлСтруктуры.Значение = "Среднее"
                    ИЛИ ЭлСтруктуры.Значение = "Максимум"
                    ИЛИ ЭлСтруктуры.Значение = "Минимум"
                    ИЛИ ЭлСтруктуры.Значение = "Количество" Тогда
                    
                    ПолеРесурса             = СКД.ПоляИтога.Добавить();
                    ПолеРесурса.ПутьКДанным = ЭлСтруктуры.Ключ;
                    ПолеРесурса.Выражение   = ЭлСтруктуры.Значение + "(" + ЭлСтруктуры.Ключ + ")";                    
                    
                ИначеЕсли ЭлСтруктуры.Значение = "КоличествоРазличные" Тогда                      
                    
                    ПолеРесурса             = СКД.ПоляИтога.Добавить();
                    ПолеРесурса.ПутьКДанным = ЭлСтруктуры.Ключ;
                    ПолеРесурса.Выражение   = "Количество(Различные " + ЭлСтруктуры.Ключ + ")";
                    
                КонецЕсли;
            КонецЕсли;    
        КонецЦикла;                                         
    КонецЕсли;
        
    // Добавление полей в набор        
    Для каждого НоваяКолонка Из КоллекцияКолонок Цикл
        ПолеНабора = ТекущийНаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        ПолеНабора.Заголовок = СокрЛП(НоваяКолонка.Заголовок);
        ПолеНабора.Поле = СокрЛП(НоваяКолонка.Имя);
        ПолеНабора.ПутьКДанным = СокрЛП(НоваяКолонка.Имя);
        
        // Удалим неопределено и NULL
        Массив = Новый Массив;
        Для каждого ТекущийТип Из НоваяКолонка.ТипЗначения.Типы() Цикл
            Если ТекущийТип = Тип("Неопределено") или ТекущийТип = Тип("NULL") или ТекущийТип = Неопределено или ТекущийТип = Null Тогда 
                Продолжить; 
            КонецЕсли;
            Массив.Добавить(ТекущийТип);
        КонецЦикла;
        ПолеНабора.ТипЗначения = Новый ОписаниеТипов(Массив,НоваяКолонка.ТипЗначения.КвалификаторыЧисла,НоваяКолонка.ТипЗначения.КвалификаторыСтроки,НоваяКолонка.ТипЗначения.КвалификаторыДаты);
    КонецЦикла;
    
    // Добавление полей в выбранные поля
    Если ОписаниеКолонок = Неопределено Тогда
        Для каждого Колонка из КоллекцияКолонок Цикл
            ВыбранноеПолеКомпоновкиДанных = НастройкиПоУмолчанию.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
            ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных(ПолеНабора.ПутьКДанным);
            ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
        КонецЦикла;
    Иначе
        ДобавитьПолеКомпоновкиДанныхВКоллекцию(НастройкиПоУмолчанию.Выбор.Элементы, ОписаниеКолонок.Строки, КоллекцияКолонок);
    КонецЕсли;
    
    // Заголовок
    Если не ПустаяСтрока(Заголовок) Тогда
        ЗначениеПараметраВывода = НастройкиПоУмолчанию.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Заголовок"));
        ЗначениеПараметраВывода.Значение = Заголовок;
        ЗначениеПараметраВывода.Использование = Истина;
    КонецЕсли;
        
    // Оформление
    Если не ПустаяСтрока(ИмяСтандартногоМакетаОформления) Тогда
        ЗначениеПараметраВывода = НастройкиПоУмолчанию.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("МакетОформления"));
        ЗначениеПараметраВывода.Значение = ИмяСтандартногоМакетаОформления;
        ЗначениеПараметраВывода.Использование = Истина;
    КонецЕсли;
        
    Возврат СКД;
КонецФункции

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

 

17

Скачать файлы

Наименование Файл Версия Размер
Пример универсальной функции для создания схемы компоновки данных с группировкой колонок:
.epf 9,49Kb
09.10.18
1
.epf 9,49Kb 1 Скачать

См. также

Специальные предложения

Избранное Подписка Сортировка: Древо
В этой теме еще нет сообщений.
Оставьте свое сообщение