Предлагаемый отчет интересен применением объекта СхемаЗапроса, который позволяет сократить код, отвечающий за формирование итогового запроса. Как и в аналогичных решениях, идет перебор документов на основании метаданных. Итоговый запрос состоит из объединения отдельных запросов для каждого вида документа. В качестве заготовки для запросов используются два шаблона.
мШаблонО="ВЫБРАТЬ
| КОЛИЧЕСТВО(Док.Ссылка) КАК Счетчик,
| ""АвансовыйОтчет"" КАК Имя,
| Док.Организация КАК Организация
|ИЗ
| Документ.АвансовыйОтчет КАК Док
|ГДЕ
| Док.Дата <= &Дата2
| И Док.Дата >= &Дата1
| И Док.Проведен = ИСТИНА
|{ГДЕ
| Док.Организация.*}
|
|СГРУППИРОВАТЬ ПО
| Док.Организация";
мШаблон="ВЫБРАТЬ
| КОЛИЧЕСТВО(Док.Ссылка) КАК Счетчик,
| ""АвансовыйОтчет"" КАК Имя,
| NULL КАК Организация
|ИЗ
| Документ.АвансовыйОтчет КАК Док
|ГДЕ
| Док.Дата <= &Дата2
| И Док.Дата >= &Дата1
| И Док.Проведен = ИСТИНА";
мШаблонО предназначен для документов, у которых присутствует реквизит Организация, мШаблон - для остальных. Ниже приводится код для заполнения схемы запроса.
Схема=новый СхемаЗапроса;
н=0;
для каждого мета из Метаданные.Документы цикл
если мета.Реквизиты.Найти("Организация")<>неопределено тогда
мТекстЗапроса=СтрЗаменить(мШаблонО,"АвансовыйОтчет",мета.Имя);
иначе
мТекстЗапроса=СтрЗаменить(мШаблон ,"АвансовыйОтчет",мета.Имя);
конецесли;
если н=0 тогда
схема.УстановитьТекстЗапроса(мТекстЗапроса);
мОператоры=схема.ПакетЗапросов[0].Операторы;
иначе
буфер=новый СхемаЗапроса;
буфер.УстановитьТекстЗапроса(мТекстЗапроса);
мОператоры.Добавить(буфер.ПакетЗапросов[0].Операторы[0]);
конецесли;
н=н+1;
конеццикла;
Каждый запрос, кроме первого добавляется в коллекцию операторы. Текст итогового запроса возвращает функция ПолучитьТекстЗапроса().
мТекст=Схема.ПолучитьТекстЗапроса();
В рассмотренном коде используется шаблон текста запроса. Код получился достаточно понятным. Но интересно было бы все сделать только средствами объекта СхемаЗапроса. Теперь мы расширили список полей запроса и добавили реквизит документа Проведен. Ниже приводится именно такой вариант.
Схема=новый СхемаЗапроса;
н=0;
для каждого мета из Метаданные.Документы цикл
если н=0 тогда
мОператор=схема.ПакетЗапросов[0].Операторы[0];
иначе
мОператор=схема.ПакетЗапросов[0].Операторы.Добавить();
конецесли;
мИсточник=мОператор.Источники.Добавить("Документ."+мета.Имя) ;
мИсточник.Источник.Псевдоним="Док";
мОператор.ВыраженияОтбораКомпоновкиДанных.Добавить("Док.Дата");
мОператор.ВыраженияОтбораКомпоновкиДанных.Добавить("Док.Проведен");
мПоле =мОператор.ВыбираемыеПоля.Добавить("КОЛИЧЕСТВО(Док.Ссылка)");
мПоле =мОператор.ВыбираемыеПоля.Добавить(""""+мета.Имя+"""");
мПоле =мОператор.ВыбираемыеПоля.Добавить("Док.Проведен");
если мета.Реквизиты.Найти("Организация")=неопределено тогда
мПоле =мОператор.ВыбираемыеПоля.Добавить("NULL");
иначе
мПоле =мОператор.ВыбираемыеПоля.Добавить("Док.Организация");
мОператор.ВыраженияОтбораКомпоновкиДанных.Добавить("Док.Организация");
конецесли;
н=н+1;
конеццикла;
схема.ПакетЗапросов[0].Колонки[0].Псевдоним="Счетчик";
схема.ПакетЗапросов[0].Колонки[1].Псевдоним="Имя";
инд=схема.ПакетЗапросов[0].Колонки.Количество()-1;
мИмя=схема.ПакетЗапросов[0].Колонки[инд].Псевдоним;
если СтрНайти(мИмя,"Поле")<>0 тогда
схема.ПакетЗапросов[0].Колонки.Удалить(инд);
конецесли;
мТекст=Схема.ПолучитьТекстЗапроса();
Кроме этого, в модуле обработки можно найти примеры работы с параметрами и отборами компоновщика настроек.
Разработанный отчет тестировался на платформе 1С:Предприятие 8.3 (8.3.21.1508) в операционной системе Windows, в конфигурации Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.100.16) .