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