Как в СКД разбить отчет по датам в колонки и скрыть пустые строки

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

В этой статье мы подробно разберем, как преобразовать плоский отчет в кросс-таблицу, расположить даты в колонках, а также рассмотрим эффективные способы борьбы с пустыми строками и колонками, что особенно актуально при работе на обычных формах в «1С:Предприятие».

Шаг 1. Преобразование структуры отчета в Таблицу (кросс-таблицу)

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

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

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

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

Шаг 2. Настройка ресурсов для пересечения строк и колонок

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

Рассмотрим, как правильно настроить ресурсы:

  1. Перейдем на вкладку «Ресурсы» в схеме СКД.
  2. Перенесем поле Сотрудник (или любое другое поле, которое должно отображаться внутри таблицы) в список ресурсов.
  3. В поле «Выражение» нам нужно указать агрегатную функцию. Так как поле текстовое, стандартное суммирование не подойдет. Мы можем использовать следующие функции:
    • Максимум(Сотрудник) — отлично подходит, если на одну дату по конкретной строке гарантированно приходится только одна запись.
    • СоединитьСтроки(Сотрудник, ", ") — универсальный вариант. Если на одну дату по сотруднику окажется несколько записей, система красиво объединит их в одной ячейке через запятую, предотвратив потерю данных.
  4. Перейдем обратно на вкладку «Настройки» и в окне «Выбранные поля» на самом верхнем уровне настроек убедимся, что наш ресурс Сотрудник добавлен в список выводимых полей.

Проанализируем ситуацию: теперь при формировании отчета СКД автоматически распределит сотрудников по соответствующим датам-колонкам. Но здесь возникает сопутствующая проблема — появление большого количества пустых ячеек, строк или неинформативных колонок.

Шаг 3. Как исключить вывод пустых строк и колонок в СКД

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

Способ А. Применение отбора на уровне конкретной группировки

Самый простой и производительный способ убрать пустые колонки — наложить отбор непосредственно на саму группировку колонок. Если мы наложим общий отбор на весь отчет, мы можем случайно отсечь нужные строки. Отбор внутри группировки работает локально.

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

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

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

Способ Б. Использование условного оформления (визуальное скрытие)

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

  1. В настройках отчета перейдем на вкладку «Условное оформление».
  2. Добавим новый элемент оформления и настроим его свойства:
    • Вкладка «Оформление»: найдем параметры Минимальная ширина и Максимальная ширина и установим их значения равными 0.1 (или 0.01).
    • Вкладка «Условие»: добавим условие отбора пустых ячеек, например: Сотрудник Не заполнено.
    • Вкладка «Оформляемые поля»: выберем поле группировки колонки Дата и сам ресурс Сотрудник.

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

Шаг 4. Программное скрытие пустых колонок (для обычных форм)

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

Рассмотрим пример программной обработки табличного документа. Этот код можно вызвать сразу после того, как процессор компоновки вывел результат в элемент формы ПолеТабличногоДокумента.


Процедура СкрытьПустыеКолонкиНаФорме(ТабличныйДокумент) Экспорт
    
    // Получаем реальные размеры сформированной таблицы
    ВсегоКолонок = ТабличныйДокумент.ШиринаТаблицы;
    ВсегоСтрок = ТабличныйДокумент.ВысотаТаблицы;
    
    // Предположим, что первые 2 строки занимают шапку и группировки колонок,
    // а данные начинаются с 3-й строки.
    СтартоваяСтрокаДанных = 3; 
    
    // Будем обходить колонки справа налево. 
    // Это хорошая практика при работе со структурами таблиц.
    Для НомерКолонки = 1 По ВсегоКолонок Цикл
        
        КолонкаПустая = Истина;
        
        // Перебираем строки в текущей колонке, чтобы проверить наличие заполненных ячеек
        Для НомерСтроки = СтартоваяСтрокаДанных По ВсегоСтрок Цикл
            ТекущаяОбласть = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки);
            
            // Проверяем тип значения и текст в ячейке
            Если ЗначениеЗаполнено(ТекущаяОбласть.Текст) Тогда
                КолонкаПустая = Ложь;
                Прервать; // Если нашли хотя бы одно значение, колонка не пустая
            КонецЕсли;
        КонецЦикла;
        
        // Если в процессе обхода строк не было найдено ни одного значения
        Если КолонкаПустая Тогда
            // Получаем область всей колонки по ее индексу и скрываем ее
            ОбластьКолонки = ТабличныйДокумент.Область(, НомерКолонки, , НомерКолонки);
            ОбластьКолонки.Видимость = Ложь;
        КонецЕсли;
        
    КонецЦикла;

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

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

← На главную