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