Как добавить новые колонки и показатели во внешний отчет на базе Универсального отчета в 1С?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При доработке типовых отчетов в конфигурациях на обычных формах (например, «Управление торговлей 10.3», «Управление производственным предприятием 1.3» или «Комплексная автоматизация 1.1») разработчики часто сталкиваются с задачей добавления дополнительных расчетных колонок. Например, в отчете «Ведомость по взаиморасчетам с контрагентами» может потребоваться вывести остатки и обороты в дополнительных валютах или вывести пустые колонки для заполнения по собственным алгоритмам.

Попытка просто зарегистрировать новые показатели через методы объекта УниверсальныйОтчет без изменения источника данных не приносит результата. Разберем по шагам внутреннее устройство механизма и выясним причину такого поведения, а также подробно рассмотрим способы реализации задачи.

Почему новые колонки не появляются в отчете

Проанализируем типовой фрагмент модуля объекта отчета, с которым чаще всего пытаются работать начинающие разработчики:


// Представления полей отчета
УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("СуммаВзаиморасчетовНачальныйОстаток", "Сумма взаиморасчетов начальный остаток");

// Добавление показателей
УниверсальныйОтчет.ДобавитьПоказатель("СуммаВзаиморасчетовНачальныйОстаток", "нач. остаток", Истина, "ЧЦ=15; ЧДЦ=2", "СуммаВзаиморасчетов", "Сумма взаиморасчетов");

Если в этот блок просто скопировать существующую строку или добавить вызов с новым именем поля, колонка в табличном документе не появится. Этому есть три основные причины:

  1. Уникальность ключей структуры: свойство мСтруктураПредставлениеПолей является объектом Структура. Если попытаться повторно вызвать метод Вставить с тем же именем поля, значение ключа будет просто перезаписано, и вторая колонка не создастся.
  2. Зависимость от Построителя отчета: объект УниверсальныйОтчет является надстройкой над объектом платформы ПостроительОтчета. Метод ДобавитьПоказатель не создает новые данные самостоятельно — он лишь описывает правила визуализации (формат, заголовок, группу) для поля, которое уже присутствует в тексте запроса или во внешнем источнике данных. Если в секции ВЫБРАТЬ базового запроса нет соответствующего поля, отчету нечего выводить.
  3. Кэширование сохраненных настроек: даже если поле добавлено корректно в коде, платформа при открытии формы может восстанавливать пользовательские настройки отчета из информационной базы, где новый показатель отключен по умолчанию.

Способ 1. Модификация текста запроса Построителя отчета (Рекомендуемый)

Рассмотрим основной способ решения задачи. Чтобы в отчете появились дополнительные валютные показатели или пустые колонки под расчет, необходимо добавить их в исходный текст запроса ПостроительОтчета в процедуре инициализации отчета (обычно это процедура УстановитьНачальныеНастройки модуля объекта).

Разберем процесс поэтапно:

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

Способ 2. Подготовка данных через Таблицу значений

Бывают ситуации, когда расчет данных в валютах требует сложных процедур встроенного языка, вызова общих модулей или обращений к внешним источникам, которые невозможно реализовать простым запросом. В таком случае в качестве источника данных для универсального отчета используют ТаблицаЗначений.

Рассмотрим алгоритм реализации:

  1. Выполняем базовый запрос к регистрам взаиморасчетов и выгружаем результат: ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
  2. Добавляем в созданную таблицу значений необходимые колонки:
    
    ТаблицаРезультат.Колонки.Добавить("СуммаВал1НачальныйОстаток", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
    ТаблицаРезультат.Колонки.Добавить("СуммаВал1КонечныйОстаток", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
    
  3. В цикле обходим строки таблицы и рассчитываем показатели по собственному алгоритму:
    
    Для Каждого СтрокаДанных Из ТаблицаРезультат Цикл
        // Выполняем произвольный пересчет
        СтрокаДанных.СуммаВал1НачальныйОстаток = РассчитатьСуммуВВалюте(СтрокаДанных.СуммаВзаиморасчетовНачальныйОстаток, ВалютаОтчета);
        СтрокаДанных.СуммаВал1КонечныйОстаток = РассчитатьСуммуВВалюте(СтрокаДанных.СуммаВзаиморасчетовКонечныйОстаток, ВалютаОтчета);
    КонецЦикла;
    
  4. Назначаем подготовленную таблицу источником данных построителя отчета через ОписаниеИсточникаДанных:
    
    Источник = Новый ОписаниеИсточникаДанных(ТаблицаРезультат);
    УниверсальныйОтчет.ПостроительОтчета.ИсточникДанных = Источник;
    
  5. После переопределения источника вызываем стандартный метод УниверсальныйОтчет.ДобавитьПоказатель() — теперь поля таблицы корректно отобразятся в отчете.

Способ 3. Постобработка готового Табличного документа

Если требуется минимальное вмешательство в структуру отчета, можно использовать прямое редактирование сформированного результата. В этом случае отчет сначала строится стандартными механизмами, после чего модифицируется результирующий ТабличныйДокумент.

  1. В модуле отчета или формы перехватываем процедуру вывода (например, после выполнения УниверсальныйОтчет.СформироватьОтчет()).
  2. С помощью метода ТабличныйДокумент.НайтиТекст() находим область шапки нужного показателя.
  3. Используем метод ВставитьОбласть() для добавления новых колонок справа или слева от найденных ячеек.
  4. Обходим строки таблицы и заполняем созданные колонки расчетными значениями.

Этот способ наименее предпочтителен, так как требует ручного управления итоговыми строками и может нарушать форматирование при изменении группировок пользователем.

← На главную