Итак. Отчет формируется программно. Есть возможность изменить текст отчета, если отборами и параметрами решить задачу неудобно|невозможно.
Работает простейшая расшифровка (как стандартная). Установка параметров и отборов (простейший вариант). Открытие настроек без формы настроек.
Весь код на форме отчета.
На поиск информации ушло несколько часов. Тут все выкладываю в кучке.
Качать не обязательно, весь код формы выложен здесь.
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьНаСервере();
Элементы.Результат.ОтображениеСостояния.Видимость = Ложь;
Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
КонецПроцедуры
&НаСервере
Процедура СформироватьНаСервере()
ОбъектОтчетНаСервере = РеквизитФормыВЗначение("Отчет");
СхемаКомпоновки = ОбъектОтчетНаСервере.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
//При необходимости модифицировать текст запроса
//Запрос = СхемаКомпоновки.НаборыДанных.НаборДанных1.Запрос;
//СхемаКомпоновки.НаборыДанных.НаборДанных1.Запрос = ОбработатьТекстЗапроса(Запрос);
//Когда-то это была переменная модуля, но в связи с использованием УФ теперь это реквизит формы с типом "Произвольный"
Настройки = СхемаКомпоновки.НастройкиПоУмолчанию;
УстановитьНастройки();
СформироватьОтчет(СхемаКомпоновки);
КонецПроцедуры
&НаСервере
Процедура УстановитьНастройки()
//Установка параметров. Делаем их недоступными пользователю в на закладке Параметры СКД
//Здесь используется параметр, а не отбор, т.к. отбор используется во временной таблице-фильтре и не выводится в результат, т.е. поля для
//отбора нет.
ПараметрДанныхКонтрагент = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[0];
ПараметрДанныхКонтрагент.Значение = Контрагент;
ПараметрДанныхКонтрагент.Использование = Истина;
//А здесь используется именно установка отбора, т.к. для даты нет конструкции типа "В иерархии", позволяющей игнорировать незаполненные значения.
//Хотя можно было использовать что-то типа "Дата <= &НачДата или &НачДата = ДатаВремя(1,1,1)" и тогда работать с параметрами.
//СброситьОтборПоПолюКомпоновки("Контрагент"); // Нужно когда меняется вид сравнения или поле отбора, чтобы не оставалось старых отборов
УстановитьОтборПоПолюКомпоновки("Ссылка.Дата", Период.ДатаНачала, ВидСравненияКомпоновкиДанных.БольшеИлиРавно, ЗначениеЗаполнено(Период.ДатаНачала));
УстановитьОтборПоПолюКомпоновки("Ссылка.Дата", КонецДня(Период.ДатаОкончания), ВидСравненияКомпоновкиДанных.МеньшеИлиРавно, ЗначениеЗаполнено(Период.ДатаОкончания));
Настройки = Отчет.КомпоновщикНастроек.Настройки;
КонецПроцедуры
&НаСервере
Процедура СформироватьОтчет(СхемаКомпоновки) Экспорт
Перем ДанныеРасшифровкиВрем; //Если не создать, то будет ошибка в КомпоновщикМакета.Выполнить()
//Важно не использовать "ДанныеРасшифровки" при инициалиации Процессора компоновки, т.к. это реквизит формы
//и он нужен для обработки расшифровки, но туда надо поместить адрес во врем. хранилище. (через 2 строки)
//Иначе расшифровка будет выводить только индексы элементов расшифровки.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, ДанныеРасшифровкиВрем);
ДанныеРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровкиВрем, УникальныйИдентификатор);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровкиВрем);
Результат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
//ДокументРезультат.ПоказатьУровеньГруппировокСтрок(0); //0 - следующий за общим итогом
КонецПроцедуры
&НаСервере
Процедура УстановитьОтборПоПолюКомпоновки(Имя, Значение, ВидСравнения, Использование)
Для Каждого ЭлементОтбора Из Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Имя) И ЭлементОтбора.ВидСравнения = ВидСравнения Тогда
Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы.Удалить(ЭлементОтбора);
КонецЕсли;
КонецЦикла;
ЭлементОтбора = Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Имя);
ЭлементОтбора.ВидСравнения = ВидСравнения;
ЭлементОтбора.ПравоеЗначение = Значение;
ЭлементОтбора.Использование = Использование;
КонецПроцедуры
Процедура СброситьОтборПоПолюКомпоновки(Имя)
Для Каждого ЭлементОтбора Из Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Имя) Тогда
Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы.Удалить(ЭлементОтбора);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ОбработатьТекстЗапроса(Запрос)
//Здесь можно программно обработать текст запроса
//например в зависимости от реквизитов формы.
КонецФункции
Раньше в одном из примеров использовалась переменная модуля "Настройки". Сделал реквизит произвольного типа, т.к. теперь на переменные модуля рассчитывать ...
1С:Предприятие 8.3 (8.3.16.1148).