Как в СКД настроить вывод нескольких счетчиков одной услуги в разные строки для одной квартиры

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

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

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

Анализ структуры данных и постановка задачи

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

  1. Первая строка: Адрес квартиры, данные по ХВС (счетчик 1), ГВС (счетчик 1), Электроэнергия.
  2. Вторая строка: Тот же адрес (или пустое поле адреса для визуальной чистоты), данные по ХВС (счетчик 2), ГВС (счетчик 2), а колонки по электроэнергии должны остаться пустыми, если там нет второго прибора.

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

Метод 1: Использование индекса (порядкового номера) в запросе

Самый надежный способ решить задачу — присвоить каждому счетчику внутри квартиры порядковый номер. Проанализируем, как это можно сделать в запросе СКД. Мы можем объединить данные разных счетчиков, явно указав их индекс.

Рассмотрим пример запроса, где мы объединяем данные из разных полей документа:


ВЫБРАТЬ
    Док.Квартира КАК Квартира,
    1 КАК НомерСтрокиВКвартире,
    Док.ГВС1 КАК Показание,
    "ГВС" КАК ВидУслуги
ИЗ
    Документ.ПоказанияСчетчиков КАК Док

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

ВЫБРАТЬ
    Док.Квартира,
    2 КАК НомерСтрокиВКвартире,
    Док.ГВС2,
    "ГВС"
ИЗ
    Документ.ПоказанияСчетчиков КАК Док
ГДЕ
    Док.ГВС2 <> 0

В данном примере поле НомерСтрокиВКвартире является ключевым для СКД. Именно оно заставит систему создать две разные строки для одной квартиры. Выясним, как это применить в настройках компоновки.

Настройка группировок в СКД

После того как в наборе данных появилось поле НомерСтрокиВКвартире (или аналогичный индекс), перейдем к настройке структуры отчета на вкладке "Настройки":

  1. Создадим группировку по полю Квартира.
  2. Внутри нее добавим вложенную группировку по полю НомерСтрокиВКвартире.
  3. Для того чтобы отчет выглядел аккуратно, в выбранных полях вложенной группировки не нужно выводить сам НомерСтрокиВКвартире.
  4. В области «Колонки» создадим группировку по полю ВидУслуги.

Таким образом, для квартиры №425 система увидит записи с индексом «1» и индексом «2». Она создаст две строки. В первой строке выведутся все услуги с индексом 1, во второй — только те, у которых есть данные под индексом 2 (например, дополнительные счетчики воды).

Метод 2: Добавление признака основного счетчика

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

Рассмотрим логику этого подхода:

  1. Первая группа приборов учета помечается как Истина.
  2. Вторая группа (дополнительные) помечается как Ложь.

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

Работа с кросс-таблицей и ресурсами

При настройке полей ресурсов важно правильно указать функции агрегирования. Поскольку мы выводим конкретные значения (номера счетчиков и показания), а не их сумму, в поле «Выражение» на вкладке «Ресурсы» следует использовать функции Максимум(Показание) или Минимум(Показание).

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

Рекомендации по архитектуре данных

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

Рассмотрим преимущества хранения данных в периодическом регистре сведений с измерениями Квартира и Счетчик:

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

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

Итоговое оформление отчета

Чтобы отчет был читабельным, воспользуемся вкладкой "Условное оформление":

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

← На главную