При доработке типовых отчетов в конфигурациях на обычных формах (например, «Управление торговлей 10.3», «Управление производственным предприятием 1.3» или «Комплексная автоматизация 1.1») разработчики часто сталкиваются с задачей добавления дополнительных расчетных колонок. Например, в отчете «Ведомость по взаиморасчетам с контрагентами» может потребоваться вывести остатки и обороты в дополнительных валютах или вывести пустые колонки для заполнения по собственным алгоритмам.
Попытка просто зарегистрировать новые показатели через методы объекта УниверсальныйОтчет без изменения источника данных не приносит результата. Разберем по шагам внутреннее устройство механизма и выясним причину такого поведения, а также подробно рассмотрим способы реализации задачи.
Проанализируем типовой фрагмент модуля объекта отчета, с которым чаще всего пытаются работать начинающие разработчики:
// Представления полей отчета
УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("СуммаВзаиморасчетовНачальныйОстаток", "Сумма взаиморасчетов начальный остаток");
// Добавление показателей
УниверсальныйОтчет.ДобавитьПоказатель("СуммаВзаиморасчетовНачальныйОстаток", "нач. остаток", Истина, "ЧЦ=15; ЧДЦ=2", "СуммаВзаиморасчетов", "Сумма взаиморасчетов");
Если в этот блок просто скопировать существующую строку или добавить вызов с новым именем поля, колонка в табличном документе не появится. Этому есть три основные причины:
мСтруктураПредставлениеПолей является объектом Структура. Если попытаться повторно вызвать метод Вставить с тем же именем поля, значение ключа будет просто перезаписано, и вторая колонка не создастся.УниверсальныйОтчет является надстройкой над объектом платформы ПостроительОтчета. Метод ДобавитьПоказатель не создает новые данные самостоятельно — он лишь описывает правила визуализации (формат, заголовок, группу) для поля, которое уже присутствует в тексте запроса или во внешнем источнике данных. Если в секции ВЫБРАТЬ базового запроса нет соответствующего поля, отчету нечего выводить.Рассмотрим основной способ решения задачи. Чтобы в отчете появились дополнительные валютные показатели или пустые колонки под расчет, необходимо добавить их в исходный текст запроса ПостроительОтчета в процедуре инициализации отчета (обычно это процедура УстановитьНачальныеНастройки модуля объекта).
Разберем процесс поэтапно:
УниверсальныйОтчет.ПостроительОтчета.Текст.
ВЫРАЗИТЬ(0 КАК ЧИСЛО(15, 2)) КАК СуммаВал1НачальныйОстаток,
ВЫРАЗИТЬ(0 КАК ЧИСЛО(15, 2)) КАК СуммаВал1КонечныйОстаток
КурсыВалют и выполняем пересчет сумм непосредственно в выражении запроса.{ИТОГИ} добавляем расчет итогов по новым колонкам:
{ИТОГИ
СУММА(СуммаВал1НачальныйОстаток),
СУММА(СуммаВал1КонечныйОстаток)}
// Задаем заголовки полей
УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("СуммаВал1НачальныйОстаток", "Сумма USD нач. остаток");
УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("СуммаВал1КонечныйОстаток", "Сумма USD кон. остаток");
// Регистрируем показатели отчета
УниверсальныйОтчет.ДобавитьПоказатель("СуммаВал1НачальныйОстаток", "нач. остаток USD", Истина, "ЧЦ=15; ЧДЦ=2", "СуммаВал1", "Сумма USD");
УниверсальныйОтчет.ДобавитьПоказатель("СуммаВал1КонечныйОстаток", "кон. остаток USD", Истина, "ЧЦ=15; ЧДЦ=2", "СуммаВал1", "Сумма USD");
Бывают ситуации, когда расчет данных в валютах требует сложных процедур встроенного языка, вызова общих модулей или обращений к внешним источникам, которые невозможно реализовать простым запросом. В таком случае в качестве источника данных для универсального отчета используют ТаблицаЗначений.
Рассмотрим алгоритм реализации:
ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
ТаблицаРезультат.Колонки.Добавить("СуммаВал1НачальныйОстаток", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
ТаблицаРезультат.Колонки.Добавить("СуммаВал1КонечныйОстаток", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
Для Каждого СтрокаДанных Из ТаблицаРезультат Цикл
// Выполняем произвольный пересчет
СтрокаДанных.СуммаВал1НачальныйОстаток = РассчитатьСуммуВВалюте(СтрокаДанных.СуммаВзаиморасчетовНачальныйОстаток, ВалютаОтчета);
СтрокаДанных.СуммаВал1КонечныйОстаток = РассчитатьСуммуВВалюте(СтрокаДанных.СуммаВзаиморасчетовКонечныйОстаток, ВалютаОтчета);
КонецЦикла;
ОписаниеИсточникаДанных:
Источник = Новый ОписаниеИсточникаДанных(ТаблицаРезультат);
УниверсальныйОтчет.ПостроительОтчета.ИсточникДанных = Источник;
УниверсальныйОтчет.ДобавитьПоказатель() — теперь поля таблицы корректно отобразятся в отчете.Если требуется минимальное вмешательство в структуру отчета, можно использовать прямое редактирование сформированного результата. В этом случае отчет сначала строится стандартными механизмами, после чего модифицируется результирующий ТабличныйДокумент.
УниверсальныйОтчет.СформироватьОтчет()).ТабличныйДокумент.НайтиТекст() находим область шапки нужного показателя.ВставитьОбласть() для добавления новых колонок справа или слева от найденных ячеек.Этот способ наименее предпочтителен, так как требует ручного управления итоговыми строками и может нарушать форматирование при изменении группировок пользователем.