Как известно, объекты, добавленные в расширении конфигурации недоступны ни во внешних отчетах, ни во внешних обработках во время разработки в конфигураторе. Поэтому для того, чтобы разработать отчет, использующий данные и из объектов расширения, и из объектов конфигурации у нас есть два варианта:
1. Заимствовать все, необходимые объекты из основной конфигурации в расширение и в расширении же уже разрабатывать нужный отчет.
Минус данного подхода в том, что чем больше объектов мы позаимствуем из конфигурации, тем сложнее будет потом анализировать изменения в расширении при обновлении на новый релиз. Есть ещё один момент, который делает такой способ непригодным - необходимость использовать данные из двух и более различных расширений. Поэтому данный способ разработки в данной статье я рассматривать не буду.
2. Сформировать макет СКД в режиме 1С предприятия посредством консоли отчета, а потом встроить его во внешний отчет.
Для формирования макета СКД я использую управляемую консоль отчетов от уважаемого Evg-Lylyk. Чтобы сделать макет СКД, приходится запускать 1С предприятие в режиме толстого клиента. Ну и далее всё по школе - пишу запрос, помещаю его в макет, настраиваю ресурсы, группировки и поля. В консоли отчета, в отличие от конфигуратора, доступны объекты всех расширений.
Далее я сохраняю макет СКД в файл:
и загружаю сохраненный файл в макет СКД внешнего отчета.
Загружается из-за объектов расширений с ошибкой. Ошибку я игнорирую и больше ничего с макетом СКД во внешнем отчете не делаю. Если надо поправить что-то в макете системы компоновки данных, я снова вношу изменения в консоли отчета и повторяю предыдущие шаги.
На этом работа по разработке отчета закончена в большинстве случаев, но есть один нюанс:
В некоторых случаях после проделанных действий, при попытке запустить внешний отчет можно получить следующую ошибку:
"Повторяющееся поле итога".
Теперь, если внимательно посмотреть на ресурсы макета СКД во внешнем отчете и сравнить с аналогичными же ресурсами в макете СКД консоли отчета то увидим, что у нас при переносе макета во внешний отчет не перенеслись некоторые группировки и если какой-то ресурс по-разному рассчитывается для различных группировок, то получаем пересечение поля итога.
макет
Чтобы выйти из положения, я применяю следующий приём:
Добавляю во внешний отчет макет типа "Двоичные данные", в который загружаю выгруженный из консоли файл макета СКД и переопределяю процедуру модуля внешнего отчета "ПриКомпоновкеРезультата" следующим образом:
Функция ПолучитьСхемуКомпоновкиИзФайла()
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
МакетСКД = ПолучитьМакет("СКД");
МакетСКД.Записать(ИмяВременногоФайла);
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла);
СхемаКомпоновкиДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("СхемаКомпоновкиДанных"));
Возврат СхемаКомпоновкиДанных;
КонецФункции
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПользовательскиеНастройкиМодифицированы = Ложь;
НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
СхемаКомпоновкиДанныхОтчета = ПолучитьСхемуКомпоновкиИзФайла();//ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанныхОтчета, НастройкиОтчета, ДанныеРасшифровки);
КомпоновкаДанныхСервер.УстановитьЗаголовкиМакетаКомпоновки(СтруктураЗаголовковПолей(), МакетКомпоновки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
//РасчетСебестоимостиПрикладныеАлгоритмы.АктуализироватьПартииДляОтчетов(ДокументРезультат, КомпоновщикНастроек);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КомпоновкаДанныхСервер.СкрытьВспомогательныеПараметрыОтчета(СхемаКомпоновкиДанныхОтчета, КомпоновщикНастроек, ДокументРезультат, ВспомогательныеПараметрыОтчета());
// Сообщим форме отчета о том, что настройки модифицированы.
Если ПользовательскиеНастройкиМодифицированы Тогда
КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства.Вставить("ПользовательскиеНастройкиМодифицированы", Истина);
КонецЕсли;
КонецПроцедуры
Ключевой момент здесь - подмена макета СКД из отчета макетом, полученным из двоичных данных. Остальной код взят из случайного типового отчета ЕРП. В результате получаем отчет, такой же, как и тот, что формировали в консоли отчетов.
Теперь главное не забыть при внесении изменений в макет СКД, что заменять необходимо как макет СКД отчета, так и макет с двоичными данными.
Разработка на 1С:Предприятие 8.3 (8.3.20.1838), 1С:ERP Управление предприятием 2 (2.5.8.221)