Как убрать лишнюю или двойную шапку в отчете СКД

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

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

Метод 1. Использование системной настройки «Выводить заголовки полей»

Прежде чем приступать к сложным манипуляциям с кодом или макетами, проанализируем стандартные возможности СКД. Самый «чистый» способ убрать шапку для конкретной ветки отчета заключается в использовании штатных параметров вывода.

Рассмотрим пошагово, как это сделать:

  1. Откроем схему компоновки данных и перейдем на вкладку «Настройки».
  2. В дереве настроек (левая панель) выберем не весь отчет целиком, а именно ту группировку, для которой необходимо скрыть заголовок. Это важный момент: настройки на уровне отчета и на уровне группировки могут различаться.
  3. В нижней части окна перейдем на вкладку «Другие настройки».
  4. Найдем параметр Выводить заголовки полей (в англоязычной версии — Output field names).
  5. Установим значение в «Не выводить».

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

Метод 2. Использование пустого макета заголовка

Если стандартная настройка по каким-то причинам не срабатывает (например, в сложных иерархических структурах), мы можем воспользоваться механизмом макетов. Суть метода заключается в подмене стандартной генерации шапки «пустым» определением.

Разберем алгоритм действий:

  1. Перейдем на закладку «Макеты» в схеме СКД.
  2. Нажмем кнопку «Добавить макет» и выберем пункт «Добавить макет заголовка группировки».
  3. В появившемся окне укажем имя той группировки, шапку которой хотим скрыть.
  4. Система предложит выбрать область (ячейки) табличного документа. Выберем одну пустую ячейку.
  5. Важный нюанс: если оставить область абсолютно пустой, 1С может проигнорировать макет и вывести стандартную шапку. Чтобы обхитрость систему, установим для этой ячейки минимальную высоту строки (например, 0.1 или 1 пиксель) и уберем все границы (рамки).

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

Метод 3. Оптимизация структуры запроса (UNION ALL)

Проанализируем ситуацию, описанную в сообщениях форума: автор использует две идентичные группировки, различающиеся только отборами. С точки зрения архитектуры 1С, правильнее объединить эти данные еще на уровне запроса. Это позволит вывести одну общую шапку и разделить данные логически внутри таблицы.

Посмотрим на пример того, как может выглядеть такой запрос:


ВЫБРАТЬ
    "Закупки" КАК ТипОперации,
    Номенклатура,
    Количество КАК Количество
ИЗ
    РегистрНакопления.Закупки
ГДЕ
    ... (ваши условия для закупок)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Продажи" КАК ТипОперации,
    Номенклатура,
    Количество КАК Количество
ИЗ
    РегистрНакопления.Продажи
ГДЕ
    ... (ваши условия для продаж)

После такого объединения в настройках СКД нам достаточно использовать одну группировку. Мы сможем добавить поле ТипОперации в группировку или оставить его как вспомогательное. Проверить и отладить получившийся набор данных удобно через инструменты вроде управляемой консоли запросов и отчетов — для этого подойдёт универсальная консоль запросов и СКД для 1С. В результате система сформирует одну единую шапку, так как набор данных теперь один.

Метод 4. Трюк с автозаголовком и пробелом

Иногда требуется скрыть заголовок только одного конкретного поля, а не всей шапки группировки. В этом случае поможет метод, упомянутый в сообщении №5 форума.

Рассмотрим, как это реализовать:

  1. В наборе данных СКД выберем нужное поле.
  2. В колонке «Заголовок» установим флаг (если он не стоит) или просто переопределим текст.
  3. Вместо названия поля введем один символ пробела " ".
  4. В настройках выбранных полей отчета убедимся, что для этого поля не стоит автоматическое формирование заголовка.

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

Метод 5. Условное оформление для скрытия текста

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

Выполним следующие шаги:

Метод 6. Программная обработка результата

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

Для этого в модуле объекта отчета необходимо переопределить процедуру ПриКомпоновкеРезультата. Разберем пример кода:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Инициализируем схему и настройки
    Схема = ЭтотОбъект.СхемаКомпоновкиДанных;
    Настройки = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
    
    // Формируем результат
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    
    // Начинаем вывод
    ПроцессорВывода.НачатьВывод();
    
    Пока Истина Цикл
        ЭлементРезультата = ПроцессорКомпоновки.Следующий();
        Если ЭлементРезультата = Неопределено Тогда
            Прервать;
        КонецЕсли;
        
        // Проверяем тип элемента. Если это заголовок, который нам не нужен — пропускаем
        Если ЭлементРезультата.ЗначенияПараметров.Количество() > 0 Тогда
            // Здесь можно добавить логику анализа конкретных параметров элемента
            // Если это "ненужная" шапка, просто не вызываем ПроцессорВывода.ВывестиЭлемент()
        КонецЕсли;
        
        ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
    КонецЦикла;
    
    ПроцессорВывода.ЗакончитьВывод();
    
КонецПроцедуры

В данном примере мы полностью берем управление выводом в свои руки. С помощью анализа ЭлементРезультата можно определить, является ли текущий блок данных заголовком, и принять решение о его выводе в Результат (объект типа ТабличныйДокумент), решая даже такие сложные задачи, как вывод другого внешнего отчета в один табличный документ.

Резюме

Мы рассмотрели целый арсенал средств для борьбы с лишними шапками в СКД. Подведем итоги: начинайте с самого простого — настройки «Выводить заголовки полей» в параметрах группировки. Если это не помогает из-за сложной структуры — используйте пустые макеты. Если же ваш отчет перегружен дублирующимися группировками, лучшим решением будет оптимизация запроса через ОБЪЕДИНИТЬ ВСЕ, что сделает отчет более производительным и предсказуемым в оформлении.

← На главную