При разработке отчетов для сферы ЖКХ или ресурсоснабжающих организаций программисты часто сталкиваются с задачей вывода показаний приборов учета в виде кросс-таблицы. Типичная структура такого отчета: по вертикали располагаются адреса (квартиры), а по горизонтали — виды услуг (ХВС, ГВС, Электроэнергия). Однако сложность возникает тогда, когда в одной квартире установлено несколько приборов учета одной и той же услуги (например, два счетчика ГВС — на кухне и в санузле). В этом случае стандартная группировка СКД может «схлопнуть» данные в одну строку или вывести их некорректно.
В данной статье мы разберем, как правильно подготовить запрос и настроить систему компоновки данных, чтобы отчет выводил каждый счетчик в отдельной строке, сохраняя при этом общую структуру таблицы.
Рассмотрим ситуацию, когда данные хранятся непосредственно в документах или регистрах, где каждая запись содержит ссылку на квартиру, вид услуги и показания. Нам необходимо получить следующий вид отчета:
Основная проблема заключается в том, что СКД группирует данные по ключевым полям. Если мы сгруппируем только по полю Квартира, система попытается просуммировать показания всех счетчиков в одну ячейку. Если добавим группировку по Счетчику, то структура колонок может «поплыть». Нам нужно найти способ «размножить» строки квартиры ровно столько раз, сколько максимально счетчиков установлено для любой из услуг в этой квартире.
Самый надежный способ решить задачу — присвоить каждому счетчику внутри квартиры порядковый номер. Проанализируем, как это можно сделать в запросе СКД. Мы можем объединить данные разных счетчиков, явно указав их индекс.
Рассмотрим пример запроса, где мы объединяем данные из разных полей документа:
ВЫБРАТЬ
Док.Квартира КАК Квартира,
1 КАК НомерСтрокиВКвартире,
Док.ГВС1 КАК Показание,
"ГВС" КАК ВидУслуги
ИЗ
Документ.ПоказанияСчетчиков КАК Док
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Док.Квартира,
2 КАК НомерСтрокиВКвартире,
Док.ГВС2,
"ГВС"
ИЗ
Документ.ПоказанияСчетчиков КАК Док
ГДЕ
Док.ГВС2 <> 0
В данном примере поле НомерСтрокиВКвартире является ключевым для СКД. Именно оно заставит систему создать две разные строки для одной квартиры. Выясним, как это применить в настройках компоновки.
После того как в наборе данных появилось поле НомерСтрокиВКвартире (или аналогичный индекс), перейдем к настройке структуры отчета на вкладке "Настройки":
Квартира.НомерСтрокиВКвартире.НомерСтрокиВКвартире.ВидУслуги.Таким образом, для квартиры №425 система увидит записи с индексом «1» и индексом «2». Она создаст две строки. В первой строке выведутся все услуги с индексом 1, во второй — только те, у которых есть данные под индексом 2 (например, дополнительные счетчики воды).
Если в большинстве случаев в квартирах не более двух групп счетчиков (например, основная и дополнительная), можно воспользоваться упрощенным методом, добавив в базу данных или вычислив в запросе булево поле СчетчикОсновной.
Рассмотрим логику этого подхода:
Истина.Ложь.В настройках СКД мы делаем группировку сначала по квартире, а затем по этому булеву полю. Это гарантирует, что данные не смешаются. Однако, как правильно отмечают технические специалисты, этот метод ограничен: если в будущем появится квартира с тремя и более счетчиками одной услуги, отчет снова начнет «склеивать» данные. Поэтому метод с числовым индексом (1, 2, 3...) является более универсальным.
При настройке полей ресурсов важно правильно указать функции агрегирования. Поскольку мы выводим конкретные значения (номера счетчиков и показания), а не их сумму, в поле «Выражение» на вкладке «Ресурсы» следует использовать функции Максимум(Показание) или Минимум(Показание).
Проанализируем настройку колонок. Чтобы отчет содержал информацию о номере счетчика и показаниях на начало и конец периода, в группировку колонок ВидУслуги нужно добавить соответствующие выбранные поля:
НомерСчетчикаПоказаниеНачалоПоказаниеКонецВыясним причину, почему работа напрямую с документами может быть неоптимальной. Как правило, показания счетчиков — это периодические данные. Профессиональным подходом считается использование Регистра сведений.
Рассмотрим преимущества хранения данных в периодическом регистре сведений с измерениями Квартира и Счетчик:
Если вы используете регистр, то порядковый номер внутри квартиры можно вычислить динамически в запросе, используя соединение таблицы регистра самой с собой по условию Т1.Счетчик.Код > Т2.Счетчик.Код, что позволит пронумеровать устройства без добавления лишних реквизитов в конфигурацию.
Чтобы отчет был читабельным, воспользуемся вкладкой "Условное оформление":
Таким образом, комбинируя правильную подготовку выборки в запросе (индексацию строк) и иерархическую настройку группировок в СКД, мы получаем гибкий и масштабируемый отчет, способный корректно отображать любое количество приборов учета в рамках одного объекта учета.