Допустим, в конфигурации 1С имеется отчет на СКД и нам нужно его формировать из другой формы, не связанной с ним.
Казалось бы, все просто – можно взять из отчета схему, исполнить ее программно и вывести на форму того же отчета.
Например, так:
Процедура ПоказатьОтчет(Кнопка) Отчет = Отчеты.НашОтчет.Создать(); ФормаОтчета = Отчеты.НашОтчет.ПолучитьФорму(); СхемаКомпоновкиДанных = Отчет.СхемаКомпоновкиДанных; Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ФормаОтчета.ЭлементыФормы.Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки); ФормаОтчета.Открыть(); КонецПроцедуры
Как можно заметить, в процедуре ПроцессорВывода.УстановитьДокумент(ФормаОтчета.ЭлементыФормы.Результат) используется форма отчета, которая должна быть создана в конфигураторе в явном виде и на ней должно присутствовать поле табличного документа с именем «Результат».
Здесь я не буду заострять внимание на установке параметров, отборов, условного оформления и прочего, так как данный код работоспособен и без этого. Но хочу обратить внимание на то, что же возвращает схема компоновки. В большинстве случаев при решении подобной задачи нам нужно будет вывести некоторые ссылочные данные. Мы исходим из того, что сам НашОтчет выводит их корректно – как представление ссылки, которые можно открыть двойным кликом мыши.
Однако, нажав кнопку, вызывающую процедуру ПоказатьОтчет(), мы увидим лишь представления ссылочных данных, без возможности расшифровки. Хотя сам отчет нормально расшифровывает выводимые данные. Значит, нам придется самостоятельно передать эту расшифровку на вызываемую форму отчета.
Создадим на форме реквизит, в который будем передавать расшифровку, создаваемую СКД. Тип реквизита зададим как «Произвольный», так как тип ДанныеРасшифровкиКомпоновкиДанных отсутствует в списке доступных.
И при открытии формы передадим в нее сформированную СКД расшифровку.
Процедура ПоказатьОтчет(Кнопка) ФормаОтчета = Отчеты. НашОтчет.ПолучитьФорму(); Отчет = Отчеты. НашОтчет.Создать(); СхемаКомпоновкиДанных = Отчет.СхемаКомпоновкиДанных; Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; ДанныеРасшифровкиКомпоновки = Новый ДанныеРасшифровкиКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровкиКомпоновки); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровкиКомпоновки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ФормаОтчета.ЭлементыФормы.Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); МакетКомпоновки = КомпоновщикМакета.Выполнить(Отчет.СхемаКомпоновкиДанных, Настройки); ФормаОтчета.ДанныеРасшифровки = ДанныеРасшифровкиКомпоновки; ФормаОтчета.Открыть(); КонецПроцедуры
Таким образом мы получим отчет, в котором расшифровка работает так же, как если бы мы его запускали непосредственно из формы отчета.