Как убрать отображение цены в строках-группах номенклатуры в отчетах 1С?

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

При формировании отчетов с иерархической группировкой по номенклатуре (например, прайс-листов или отчетов по ценам номенклатуры по контрагентам) разработчики и пользователи часто сталкиваются с ситуацией, когда напротив папок-групп отображаются числовые значения цен. Обычно это максимальная, минимальная цена или сумма по элементам, входящим в эту группу.

Для несуммируемых показателей, таких как цена, вывод значений в иерархических итогах некорректен. Разберем причины такого поведения платформы 1С и рассмотрим различные варианты решения этой задачи — от стандартных настроек до программной обработки.

Выясним причину: почему цена выводится в группах

Проанализируем ситуацию: когда поле Цена добавлено в отчет как числовой ресурс или включено в секцию общих итогов запроса, механизм компоновки данных или построитель отчета автоматически рассчитывает агрегатную функцию (например, МАКСИМУМ(Цена) или СУММА(Цена)) для всех уровней группировки, включая папки (узлы иерархии). Если просто убрать ресурс из итогов, значение цены может перестать выводиться вовсе.

Для устранения этой проблемы рассмотрим 4 основных способа решения.

Способ 1. Использование механизма «Условное оформление»

Это наиболее универсальный способ, не требующий изменения структуры запроса. Он доступен как в отчетах на базе схемы компоновки данных (СКД), так и в типовом универсальном отчете.

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

При таком подходе платформа физически рассчитывает итог, но на этапе вывода в табличный документ скрывает текстовое представление в строках-папках.

Способ 2. Вывод цены как дополнительного поля группировки

Если отчет строится с использованием СКД, цену можно исключить из состава агрегируемых ресурсов.

  1. Перейдем на вкладку Ресурсы схемы компоновки данных и удалим поле Цена из списка рассчитываемых ресурсов.
  2. В настройках структуры отчета выберем группировку Номенклатура (Иерархия).
  3. Перейдем на вкладку Дополнительные поля для этой группировки и добавим поле Цена.
  4. Установим параметр Расположение в значение В отдельной колонке.

Поскольку дополнительные поля заполняются только для детальных записей и элементов справочника, для иерархических папок колонка цены автоматически останется пустой.

Способ 3. Ограничение расчета ресурса по группировкам в СКД

Если поле цены обязательно должно оставаться ресурсом (например, для вычисления формул в детальных строках), можно явно ограничить список группировок, для которых рассчитывается ресурс:

  1. Откроем схему компоновки данных на вкладке Ресурсы.
  2. Для поля Цена в колонке Рассчитывать по... укажем только группировку элементов (без иерархии) или оставим расчет только для детальных записей.
  3. Для группировки с типом иерархии и общего итога расчет выполняться не будет, и ячейка останется пустой.

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

В отчетах на базе типового объекта УниверсальныйОтчет (в обычных формах на базе ПостроительОтчета) разработчики часто применяют постобработку сформированного табличного документа. Посмотрим на практический пример процедуры формирования, в которой после генерации отчета очищаются значения в строках заголовков групп:


Процедура СформироватьОтчет(ТабличныйДокумент) Экспорт
    
    // Формируем отчет типовыми средствами
    УниверсальныйОтчет.СформироватьОтчет(ТабличныйДокумент);
    
    НомерКолонки = 0;
    
    // Ищем целевую колонку по ее заголовку
    Для а = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
        Для б = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
            текстЯчейка = ТабличныйДокумент.Область("R" + а + "C" + б).Текст;
            Если текстЯчейка = "Артикул" Тогда
                НомерКолонки = б;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        Если НомерКолонки > 0 Тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    // Обходим строки отчета и очищаем ячейки в строках группировок
    Если НомерКолонки > 0 Тогда
        Для а = 8 По ТабличныйДокумент.ВысотаТаблицы Цикл
            Ячейка = ТабличныйДокумент.Область("R" + СтрЗаменить(а, Символы.НПП, "") + "C" + НомерКолонки);
            Если Строка(Ячейка.ЦветФона) = "стиль: Фон кнопки" И Ячейка.Текст <> "Артикул" Тогда
                Ячейка.Текст = "";
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

КонецПроцедуры

Разберем логику данного кода: после генерации макета процедура находит требуемую колонку по наименованию в шапке, а затем циклически проверяет цвет фона ячеек. Строки группировок в стандартном оформлении выделяются специальным стилем фона (стиль: Фон кнопки), что позволяет однозначно идентифицировать итоговую строку папки и очистить ее текстовое содержимое.

← На главную