При работе с данными в 1С часто возникает необходимость преобразовать информацию из плоского, одномерного списка в более наглядный и аналитический вид – двумерную кросс-таблицу, или сводную таблицу. Такая структура позволяет увидеть взаимосвязи между различными измерениями данных. Например, если у нас есть список машин и деталей, которые на них установлены, мы можем захотеть увидеть, какие детали установлены на каких машинах, представленные в виде матрицы, где по строкам идут машины, по колонкам – детали, а на пересечении отмечается факт наличия детали.
Мы рассмотрим, как создать такую кросс-таблицу в 1С, используя возможности Системы Компоновки Данных (СКД) через типовой "Универсальный отчет". Это мощный инструмент, который позволяет гибко настраивать отчеты без необходимости написания сложного кода.
Представим, что у нас есть одномерная таблица с двумя колонками: "Машина" и "Деталь". Например, данные могут выглядеть так:
машина деталь <br>
машина1 деталь 5 <br>
машина2 деталь 2 <br>
машина3 деталь 1 <br>
машина4 деталь 3 <br>
машина5 деталь 4
Наша цель – преобразовать эти данные в следующий вид, где на пересечении строки (Машина) и колонки (Деталь) будет стоять отметка (например, "Х" или "1"), если данная деталь установлена на данной машине:
деталь1 деталь2 деталь3 деталь4 деталь5 <br>
машина1 Х <br>
машина2 Х <br>
машина3 Х <br>
машина4 Х <br>
машина5 Х
Для начала нам потребуется запрос, который будет предоставлять данные для нашего отчета. Если данные хранятся в регистре сведений, например, мт_ДетальНаМашине, мы можем использовать его срез последних, чтобы получить актуальную информацию.
Важным моментом является добавление дополнительного поля, которое будет выступать в качестве ресурса в нашей кросс-таблице. Это поле будет отображаться на пересечении строк и колонок. Поскольку нам нужно просто отметить факт наличия, мы можем добавить поле со значением 1. Мы назовем его Счетчик.
Приведем пример такого запроса:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
мт_ДетальНаМашинеСрезПоследних.Машина КАК Машина,
мт_ДетальНаМашинеСрезПоследних.Деталь КАК Деталь,
1 КАК Счетчик
ИЗ
РегистрСведений.мт_ДетальНаМашине.СрезПоследних({(&КонецПериода)}, ) КАК мт_ДетальНаМашинеСрезПоследних
В этом запросе мы выбираем поля Машина и Деталь, а также добавляем константу 1 в поле Счетчик. Это поле Счетчик и будет использоваться для заполнения ячеек нашей кросс-таблицы.
Обратите внимание, что мы используем виртуальную таблицу СрезПоследних. Это позволяет получить только самые актуальные данные по каждой машине и детали на указанный период (КонецПериода).
Теперь, когда у нас есть запрос, мы перейдем к настройке отчета в 1С. Мы будем использовать типовой "Универсальный отчет" (или другой отчет, использующий СКД), который предоставляет широкие возможности для компоновки данных.
Разберем процесс по шагам:
Откройте Универсальный отчет. Обычно его можно найти в разделе "Отчеты" или "Администрирование".
Выберите объект данных. В Универсальном отчете вам нужно будет указать, какой объект вы используете. В нашем случае это будет регистр сведений мт_ДетальНаМашине. Убедитесь, что выбран правильный тип объекта (например, "Регистр сведений").
Перейдите в расширенные настройки. В форме отчета найдите кнопку "Настройки" и нажмите ее. Затем в открывшемся окне настроек выберите вид "Расширенный". Это даст нам доступ ко всем необходимым параметрам СКД.
Настройте структуру отчета. На закладке "Структура" мы будем определять, как данные будут группироваться. Мы хотим получить табличный вид, поэтому выполним следующие действия:
Удалите существующие группировки. Если в структуре уже есть какие-либо элементы, выделите их и удалите.
Добавьте таблицу. Нажмите кнопку "Ещё" и выберите "Добавить таблицу". Это создаст базовую структуру для нашей кросс-таблицы.
Определите строки. Выделите элемент "Строки" внутри добавленной таблицы. Затем нажмите кнопку "Добавить" (или используйте контекстное меню) и выберите поле Машина. Это поле будет использоваться для горизонтальной группировки, то есть каждая уникальная машина будет отдельной строкой в отчете.
Определите колонки. Выделите элемент "Колонки" внутри добавленной таблицы. Аналогично, нажмите кнопку "Добавить" и выберите поле Деталь. Каждая уникальная деталь станет отдельной колонкой в отчете.
Настройте ресурсы. Перейдите на закладку "Ресурсы". Здесь мы указываем, какие значения будут отображаться на пересечении строк и колонок. Нам нужно добавить поле Счетчик, которое мы определили в запросе.
Добавьте ресурс Счетчик. Нажмите кнопку "Добавить" и выберите Счетчик.
Установите агрегатную функцию. Для ресурса Счетчик установите агрегатную функцию Сумма или Максимум. Поскольку мы всегда возвращаем 1, оба варианта будут работать одинаково, отображая 1 там, где есть соответствие.
На этом этапе, если вы сформируете отчет, вы уже увидите желаемую структуру с единичками в ячейках, но, скорее всего, с лишними заголовками и итогами.
После базовой настройки отчета, вы, вероятно, заметите, что над названием колонок присутствует дополнительный заголовок "Счетчик" (или имя вашего ресурса), а также в конце строк и колонок выводятся "Итого". Мы разберем, как это убрать.
Чтобы убрать лишний заголовок "Счетчик" над колонками, мы можем настроить представление поля.
Перейдите на закладку "Поля". В настройках отчета найдите закладку "Поля".
Настройте поле Счетчик. Найдите в списке поле Счетчик. В его свойствах вы можете найти опции для настройки заголовка. Как правило, есть возможность убрать заголовок для полей ресурсов или изменить его на пустую строку.
Очистите заголовок. В свойствах поля Счетчик очистите значение "Заголовок" или уберите флажок, отвечающий за его вывод. Это позволит скрыть название ресурса из шапки таблицы.
Часто возникает желание убрать строки и колонки с "Итого", чтобы получить чистую матрицу. Однако, с этим нужно быть осторожным, так как есть два типа итогов: итоги по группировкам и общие итоги.
Если мы просто отключим "Расположение итогов" в общих настройках, то, помимо самих итогов, из ячеек отчета пропадут и наши "единички" (или другие значения ресурсов), что нам не подходит.
Правильный подход заключается в отключении общих итогов, сохраняя при этом значения в самих ячейках кросс-таблицы.
Перейдите на закладку "Прочие настройки". В окне настроек отчета найдите закладку "Прочие настройки" или похожую, где располагаются глобальные параметры отчета.
Найдите параметры общих итогов. Здесь вы должны найти параметры, отвечающие за расположение общих итогов:
Расположение общих итогов по горизонтали
Расположение общих итогов по вертикали
Установите значение "Нет". Для обоих этих параметров установите значение "Нет" (или аналогичное, которое полностью отключает вывод общих итогов). Не трогайте параметр Расположение итогов, который может обнулить значения в ячейках.
После этих настроек отчет будет выглядеть именно так, как нам нужно: машины по строкам, детали по колонкам, "1" на пересечении, и никаких лишних заголовков или итоговых строк/колонок.
Вместо числа "1" в ячейках, возможно, нам захочется видеть символ "Х" или просто закрашенную ячейку. Это легко достигается с помощью условного оформления СКД.
Перейдите на закладку "Условное оформление". В настройках отчета выберите эту закладку.
Добавьте новый элемент условного оформления. Нажмите кнопку "Добавить".
Настройте условие. В открывшемся окне настроек условного оформления:
В поле "Условие" укажите, что Счетчик = 1. Это значит, что оформление будет применяться только к ячейкам, где наш ресурс равен единице.
В поле "Оформление" выберите нужный параметр. Если вы хотите отобразить "Х":
Найдите свойство "Текст" и введите "Х".
Если вы хотите закрасить ячейку:
Найдите свойство "Цвет фона" и выберите желаемый цвет.
В поле "Оформляемые поля" укажите Счетчик, чтобы оформление применялось именно к значению нашего ресурса.
После применения условного оформления, вместо "1" в отчете будет отображаться "Х" или ячейка будет закрашена, что сделает отчет еще более наглядным.
Система Компоновки Данных (СКД) в 1С – это мощный инструмент, который предоставляет гораздо больше возможностей, чем просто создание кросс-таблиц. Рассмотрим некоторые из них:
При работе с большими объемами данных очень важно оптимизировать запросы, используемые в СКД. Мы можем использовать виртуальные таблицы, предварительно агрегируя данные, если это требуется. Это может значительно ускорить формирование отчета.
Например, если нам нужно посчитать количество деталей определенного типа, мы можем агрегировать данные на уровне запроса, а не только в СКД.
СКД по своей природе отлично справляется с динамическими колонками, то есть с ситуациями, когда набор колонок заранее неизвестен и формируется на основе данных (как в нашем случае с деталями). По умолчанию колонки могут сортироваться по наименованию.
Если вам нужно упорядочить динамические колонки по определенной логике (например, по порядку, по дате создания детали), вы можете:
Добавить в запрос поле-порядок (например, ПорядокДетали).
Сделать это поле ресурсом в СКД с агрегатной функцией Максимум (или Минимум, в зависимости от логики).
Использовать этот ресурс для сортировки колонок в настройках группировки "Колонки" на закладке "Структура".
СКД позволяет объединять данные из разных источников (регистров, документов, справочников) в одном отчете. Это делается с помощью оператора ОБЪЕДИНИТЬ в запросе набора данных. Таким образом, вы можете строить сложные аналитические отчеты, консолидируя информацию из различных подсистем.
Иногда требуется отобразить в одной ячейке не одно значение, а комбинацию нескольких полей. Это можно сделать через вычисляемые поля в СКД, формируя строку из нескольких значений, или через настройки макета СКД.
Для более компактного представления отчета можно использовать настройки уплотнения строк. Это особенно полезно, когда у вас много строк с повторяющимися значениями в некоторых полях.
В некоторых случаях бывает нужно, чтобы после всех динамических колонок в кросс-таблице располагались одна или несколько фиксированных колонок (например, "Итого по строке" или "Комментарий"). Это сложнее реализовать через стандартные средства СКД, но возможно с помощью использования нескольких таблиц в структуре отчета или специфических настроек макета.
Если у вас есть несколько колонок, относящихся к одной категории (например, "Количество.ОбращенийВчера", "Количество.ОбращенийСегодня"), вы можете объединить их одной общей шапкой. Для этого в запросе или вычисляемых полях СКД используйте общий префикс с разделителем (например, точкой). СКД автоматически сгруппирует такие поля под общей шапкой.
Создание двухмерной кросс-таблицы в 1С с использованием Универсального отчета и Системы Компоновки Данных является эффективным способом визуализации и анализа данных. Мы с вами разобрали пошаговый процесс: от формирования запроса с дополнительным ресурсом до тонкой настройки структуры отчета, управления итогами и применения условного оформления. Этот подход позволяет гибко настраивать отчеты без глубокого программирования, что делает его доступным для широкого круга специалистов по 1С.
Помните, что СКД — это очень гибкий инструмент. Изучая его возможности и экспериментируя с настройками, вы сможете создавать отчеты практически любой сложности и вида, значительно расширяя аналитические возможности вашей системы 1С.