При разработке отчетов для строительных компаний или агентств недвижимости часто возникает задача построения так называемой «Шахматки» (или квартирограммы). Основная сложность здесь заключается в том, чтобы вывести данные о помещениях в виде двумерной сетки, где по вертикали располагаются этажи, а по горизонтали — подъезды, при этом внутри каждого подъезда на одном этаже может быть несколько квартир, которые должны располагаться в одну строку, а не плодить новые строки этажей.
В этой статье мы подробно разберем, почему стандартный подход с таблицей в СКД может выдавать некорректный результат, и как настроить использование ресурсов в СКД на примере создания внешнего табличного отчёта для получения идеальной визуальной схемы здания.
Рассмотрим типичную ситуацию, с которой сталкиваются разработчики. При создании таблицы в СКД, где в строках выбран Этаж, а в колонках — Подъезд, система пытается сопоставить данные. Если на одном этаже в одном подъезде находится четыре квартиры, и вы просто выводите поле НомерКвартиры, СКД не понимает, как расположить эти четыре разных значения в одну ячейку пересечения строки и колонки (если это не ресурс). В результате система создает по одной строке для каждого значения, и мы видим, что этаж дублируется столько раз, сколько квартир на нем находится.
Проанализируем пример из обсуждения: вместо одной строки с четырьмя колонками под квартиры, пользователь получает четыре строки, где в каждой заполнена только одна ячейка, а остальные пустуют. Рассматривая сбор значений колонки из нескольких строк, использование функции Массив() или СоединитьСтроки() в ресурсах также не решает задачу, так как в этом случае все квартиры «схлопываются» в одну ячейку, а нам нужно, чтобы каждая квартира занимала свою отдельную «клетку» в шахматке.
Самый правильный и технологичный способ решения задачи в СКД — это введение дополнительного измерения в колонки, которое будет отвечать за «позицию» квартиры на этаже. Разберем этот метод по шагам.
Шаг 1: Подготовка данных в запросе
Нам необходимо пронумеровать квартиры внутри каждой связки «Этаж + Подъезд». Это позволит СКД понять, что квартиры не идентичны по горизонтальной позиции. Если ваша версия платформы поддерживает оконные функции (в составе 1С:Предприятие 8.3.21 и выше), это делается очень просто. Если нет — используем классическое соединение.
Пример запроса с получением порядкового номера:
ВЫБРАТЬ
Квартиры.Ссылка КАК Квартира,
Квартиры.Этаж КАК Этаж,
Квартиры.Подъезд КАК Подъезд,
Квартиры.Номер КАК НомерКвартиры,
(ВЫБРАТЬ КОЛИЧЕСТВО(*)
ИЗ Справочник.Квартиры КАК КвВнутр
ГДЕ КвВнутр.Этаж = Квартиры.Этаж
И КвВнутр.Подъезд = Квартиры.Подъезд
И КвВнутр.Ссылка < Квартиры.Ссылка) + 1 КАК НомерПорядкаНаЭтаже
ИЗ
Справочник.Квартиры КАК Квартиры
В данном запросе поле НомерПорядкаНаЭтаже является ключевым. Оно определяет, в какую «микро-колонку» попадет квартира внутри своего подъезда.
Шаг 2: Настройка структуры отчета (схожий принцип построения сетки использует тестовая задача: таблица умножения на СКД)
Теперь перейдем в настройки СКД на закладку «Настройки» и выполним следующие действия:
Этаж. Для красивого отображения (сверху вниз) можно настроить обратную сортировку по этажам.Подъезд.Подъезд добавим вложенную группировку по полю НомерПорядкаНаЭтаже.НомерКвартиры. При этом поле НомерКвартиры должно быть либо ресурсом с функцией Максимум(), либо просто выбранным полем, если группировка по номеру порядка однозначно определяет одну запись.Проанализируем, что произойдет: СКД создаст строку для этажа. Затем она создаст колонку для подъезда. Внутри колонки подъезда она создаст столько под-колонок, сколько максимально квартир встречается на этаже. В результате все квартиры выстроятся в один ряд.
Часто возникает проблема: в одном подъезде на этаже 4 квартиры, а в другом — 6. Шахматка может выглядеть «рваной». Чтобы сетка была ровной, как в настоящем чертеже, проанализируем ситуацию и добавим «пустышки».
Для этого в запросе можно использовать временную таблицу чисел (от 1 до максимально возможного количества квартир на этаже) и соединить её левым соединением с вашими реальными данными. Таким образом, даже если в подъезде всего 2 квартиры, в отчете всегда будет зарезервировано, например, 6 ячеек, что сохранит строгую геометрию здания.
Если возможности СКД по оформлению кажутся вам недостаточными (например, нужно объединять ячейки для двухуровневых квартир), рассмотрим вариант программного вывода в ТабличныйДокумент.
Алгоритм действий следующий:
Пример фрагмента кода для вывода:
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетШахматки");
ВыборкаЭтаж = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаЭтаж.Следующий() Цикл
ОбластьЭтаж = Макет.ПолучитьОбласть("Строка|ЗаголовокЭтажа");
ОбластьЭтаж.Параметры.Этаж = ВыборкаЭтаж.Этаж;
ТабДок.Вывести(ОбластьЭтаж);
ВыборкаПодъезд = ВыборкаЭтаж.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПодъезд.Следующий() Цикл
ВыборкаКв = ВыборкаПодъезд.Выбрать();
Пока ВыборкаКв.Следующий() Цикл
ОбластьКв = Макет.ПолучитьОбласть("Строка|Ячейка");
ОбластьКв.Параметры.Номер = ВыборкаКв.НомерКвартиры;
ТабДок.Присоединить(ОбластьКв);
КонецЦикла;
КонецЦикла;
КонецЦикла;
Этот метод дает полный контроль над визуализацией, но требует ручной обработки расшифровок и оформления.
Чтобы ваша шахматка была информативной, обязательно используем Условное оформление в СКД. Выясним причину, почему ячейки должны быть разного цвета. Например:
Для реализации этого в настройках СКД на закладке «Условное оформление» добавим правила, где условием будет выступать статус квартиры, а оформлением — цвет фона соответствующей ячейки.
Также рекомендуем использовать Макеты оформления в СКД для настройки границ ячеек. Для шахматки критично, чтобы границы были четкими, создавая эффект таблицы. В макете поля можно зафиксировать ширину и высоту ячейки, чтобы они стремились к форме квадрата — это делает отчет визуально похожим на архитектурный план.
Мы выяснили, что для создания корректной шахматки в СКД не нужно отказываться от инструментов компоновки в пользу «ручного» рисования. Достаточно внедрить в запрос порядковый номер записи в группе и использовать его как вложенную горизонтальную группировку. Это позволит сохранить все преимущества СКД (фильтры, расшифровки, варианты отчетов) и при этом получить требуемую структуру «здания» в отчете.