Как реализовать отчет «Шахматка» в 1С с помощью СКД?

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

При разработке отчетов для строительных компаний или агентств недвижимости часто возникает задача построения так называемой «Шахматки» (или квартирограммы). Основная сложность здесь заключается в том, чтобы вывести данные о помещениях в виде двумерной сетки, где по вертикали располагаются этажи, а по горизонтали — подъезды, при этом внутри каждого подъезда на одном этаже может быть несколько квартир, которые должны располагаться в одну строку, а не плодить новые строки этажей.

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

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

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

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

Решение №1: Использование вложенных группировок и порядкового номера

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

Шаг 1: Подготовка данных в запросе

Нам необходимо пронумеровать квартиры внутри каждой связки «Этаж + Подъезд». Это позволит СКД понять, что квартиры не идентичны по горизонтальной позиции. Если ваша версия платформы поддерживает оконные функции (в составе 1С:Предприятие 8.3.21 и выше), это делается очень просто. Если нет — используем классическое соединение.

Пример запроса с получением порядкового номера:


ВЫБРАТЬ
    Квартиры.Ссылка КАК Квартира,
    Квартиры.Этаж КАК Этаж,
    Квартиры.Подъезд КАК Подъезд,
    Квартиры.Номер КАК НомерКвартиры,
    (ВЫБРАТЬ КОЛИЧЕСТВО(*) 
     ИЗ Справочник.Квартиры КАК КвВнутр 
     ГДЕ КвВнутр.Этаж = Квартиры.Этаж 
       И КвВнутр.Подъезд = Квартиры.Подъезд 
       И КвВнутр.Ссылка < Квартиры.Ссылка) + 1 КАК НомерПорядкаНаЭтаже
ИЗ
    Справочник.Квартиры КАК Квартиры

В данном запросе поле НомерПорядкаНаЭтаже является ключевым. Оно определяет, в какую «микро-колонку» попадет квартира внутри своего подъезда.

Шаг 2: Настройка структуры отчета (схожий принцип построения сетки использует тестовая задача: таблица умножения на СКД)

Теперь перейдем в настройки СКД на закладку «Настройки» и выполним следующие действия:

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

Проанализируем, что произойдет: СКД создаст строку для этажа. Затем она создаст колонку для подъезда. Внутри колонки подъезда она создаст столько под-колонок, сколько максимально квартир встречается на этаже. В результате все квартиры выстроятся в один ряд.

Решение №2: Выравнивание сетки (Динамическое количество комнат)

Часто возникает проблема: в одном подъезде на этаже 4 квартиры, а в другом — 6. Шахматка может выглядеть «рваной». Чтобы сетка была ровной, как в настоящем чертеже, проанализируем ситуацию и добавим «пустышки».

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

Решение №3: Метод «По старинке» (Программный вывод)

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

Алгоритм действий следующий:

  1. Создаем макет с областями: «Шапка», «Этаж», «ЯчейкаКвартиры».
  2. В коде получаем данные, сгруппированные по этажам и подъездам.
  3. Запускаем цикл по этажам (от максимального к первому).
  4. Внутри цикла выводим область этажа, а затем в горизонтальном цикле выводим области квартир.

Пример фрагмента кода для вывода:


ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетШахматки");

ВыборкаЭтаж = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаЭтаж.Следующий() Цикл
    ОбластьЭтаж = Макет.ПолучитьОбласть("Строка|ЗаголовокЭтажа");
    ОбластьЭтаж.Параметры.Этаж = ВыборкаЭтаж.Этаж;
    ТабДок.Вывести(ОбластьЭтаж);
    
    ВыборкаПодъезд = ВыборкаЭтаж.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаПодъезд.Следующий() Цикл
        ВыборкаКв = ВыборкаПодъезд.Выбрать();
        Пока ВыборкаКв.Следующий() Цикл
            ОбластьКв = Макет.ПолучитьОбласть("Строка|Ячейка");
            ОбластьКв.Параметры.Номер = ВыборкаКв.НомерКвартиры;
            ТабДок.Присоединить(ОбластьКв);
        КонецЦикла;
    КонецЦикла;
КонецЦикла;

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

Оформление и визуализация (Условное оформление)

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

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

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

Резюме

Мы выяснили, что для создания корректной шахматки в СКД не нужно отказываться от инструментов компоновки в пользу «ручного» рисования. Достаточно внедрить в запрос порядковый номер записи в группе и использовать его как вложенную горизонтальную группировку. Это позволит сохранить все преимущества СКД (фильтры, расшифровки, варианты отчетов) и при этом получить требуемую структуру «здания» в отчете.

← На главную