В настоящее время большинство отчётов пишется с использованием системы компоновки данных. Это удобно для разработчика, но не всегда удобно для пользователя. Чаще всего у пользователя нет ни времени, ни желания разбираться во всех широких возможностях отчёта, ему просто хочется видеть нужные ему настройки на форме и быстро получить желаемый результат. В данной статье я хочу привести пример как можно вынести на форму настройки системы компоновки данных и программно сформировать отчёт на основе этих настроек. Когда впервые столкнулась с подобным требованием пользователя пришлось потратить немало времени на изучение вопроса.. Надеюсь, что моя статья окажется полезной и сэкономит кому-нибудь время и силы.
Пример программного заполнения настроек построю на основе отчёта по оборотному регистру накопления Продажи с измерениями: Контрагент, Номенклатура и ресурсами: Количество и Сумма.
Создание отчёта и настройка схемы компоновки данных.
Итак. Создаём новый отчёт. Открываем схему компоновки данных и добавляем новый набор данных запрос. В окне запроса пишем следующий запрос:
|ВЫБРАТЬ
| ПродажиОбороты.Регистратор,
| ПродажиОбороты.Контрагент,
| ПродажиОбороты.Номенклатура,
| ПродажиОбороты.СуммаОборот,
| ПродажиОбороты.КоличествоОборот
|ИЗ
| РегистрНакопления.Продажи.Обороты(, , Авто, ) КАК ПродажиОбороты
СписокДоступныхПолейГруппировки = Новый СписокЗначений;
СписокДоступныхПолейГруппировки.Добавить("Регистратор");
СписокДоступныхПолейГруппировки.Добавить("Контрагент");
СписокДоступныхПолейГруппировки.Добавить("Номенклатура");
СписокДоступныхТиповГруппировки = Новый СписокЗначений;
СписокДоступныхТиповГруппировки.Добавить("Иерархия");
СписокДоступныхТиповГруппировки.Добавить("Элементы");
Группировки.Очистить();
НоваяГруппировка = Группировки.Добавить();
НоваяГруппировка.Поле = "Регистратор";
НоваяГруппировка.ТипГруппировки = "Элементы";
НоваяГруппировка = Группировки.Добавить();
НоваяГруппировка.Поле = "Контрагент";
НоваяГруппировка.ТипГруппировки = "Элементы";
НоваяГруппировка = Группировки.Добавить();
НоваяГруппировка.Поле = "Номенклатура";
НоваяГруппировка.ТипГруппировки = "Элементы";
ЭлементыФормы.Группировки.Колонки.Поле.ЭлементУправления.СписокВыбора = СписокДоступныхПолейГруппировки;
ЭлементыФормы.Группировки.Колонки.ТипГруппировки.ЭлементУправления.СписокВыбора = СписокДоступныхТиповГруппировки;
// Добавляет колонки (поля ресурсов) в соответствии с флажками на форме
Если Количество И Не НайтиПолеКомпоновки("КоличествоОборот", НастройкиСКД.Выбор.Элементы) Тогда
ВыбранноеПоле = НастройкиСКД.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Заголовок = "Количество";
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("КоличествоОборот");
КонецЕсли;
Если Сумма И Не НайтиПолеКомпоновки("СуммаОборот", НастройкиСКД.Выбор.Элементы) Тогда
ВыбранноеПоле = НастройкиСКД.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Заголовок = "Сумма";
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("СуммаОборот");
КонецЕсли;
//Удаляет колонки, соответствующие флажки которых не были отмечены
Счетчик = 0;
Пока Счетчик < НастройкиСКД.Выбор.Элементы.Количество() Цикл
ПолеКомпоновкиДанных = НастройкиСКД.Выбор.Элементы[Счетчик];
Если ПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("КоличествоОборот") И Не Количество Тогда
НастройкиСКД.Выбор.Элементы.Удалить(ПолеКомпоновкиДанных);
Продолжить;
ИначеЕсли ПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("СуммаОборот") И Не Сумма Тогда
НастройкиСКД.Выбор.Элементы.Удалить(ПолеКомпоновкиДанных);
Продолжить;
КонецЕсли;
Счетчик = Счетчик + 1;
КонецЦикла;
//заполняем поля группировок в соответствии с настройками в табличной части Группировки
НастройкиСКД.Структура.Очистить();
ЭлементСтруктуры = НастройкиСКД;
Для Каждого Группировка Из Группировки Цикл
ЭлементСтруктуры = ЭлементСтруктуры.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ЭлементГруппировки = ЭлементСтруктуры.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ЭлементГруппировки.Использование = Истина;
ЭлементГруппировки.Поле = Новый ПолеКомпоновкиДанных(Группировка.Поле);
Если СписокДоступныхТиповГруппировки.НайтиПоЗначению(Группировка.ТипГруппировки)=Неопределено Тогда
ЭлементГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
Иначе
ЭлементГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных[Группировка.ТипГруппировки];
КонецЕсли;
ПолеСортировки = ЭлементСтруктуры.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
ПолеСортировки.Использование = Истина;
ВыбранноеПоле = ЭлементСтруктуры.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Использование = Истина;
КонецЦикла;
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период",Период);
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Функция НайтиПолеКомпоновки(Имя, Коллекция)
Для Каждого ПолеКомпоновкиДанных Из Коллекция Цикл
Если ПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных(Имя) Тогда
Возврат Истина;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
СтандартнаяОбработка = ложь;
Если ДанныеРасшифровки = Неопределено Тогда Возврат КонецЕсли;
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
Настройки = ОбработкаРасшифровки.Выполнить(Расшифровка);
Если Настройки<>Неопределено Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
ЭтоРасшифровка = Истина;
ЭлементыФормы.Результат.Очистить();
СкомпоноватьРезультат(ЭлементыФормы.Результат,ДанныеРасшифровки);
КонецЕсли;
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Если Не (Количество ИЛИ Сумма ) Тогда
СтандартнаяОбработка = Ложь;
Сообщить("Необходимо выбрать хотя бы один показатель!");
Возврат;
КонецЕсли;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Если НЕ ЭтоРасшифровка Тогда
УстановитьСтруктуруГруппировокСКД(Настройки);
КонецЕсли;
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период",Период);
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
ЭтоРасшифровка = ложь;
КонецПроцедуры
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua