При разработке печатных форм в 1С программисты часто сталкиваются с задачей, когда необходимо отобразить группировку (например, «Фаза производства») в одной широкой или высокой ячейке слева, а справа от нее расположить список связанных с ней строк (например, «Работы» или «Материалы»).
Стандартный метод Присоединить() работает таким образом, что каждая новая область добавляется строго справа от предыдущей в рамках текущей строки. Если мы попытаемся «присоединять» несколько строк подряд, платформа будет выстраивать их в одну горизонтальную линию, что не соответствует требуемому результату. Рассмотрим, как правильно реализовать вертикальный вывод строк справа от одной ячейки-заголовка.
Основная сложность заключается в том, что ТабличныйДокумент в 1С представляет собой жесткую сетку. Мы не можем просто вставить «таблицу внутрь ячейки». Чтобы добиться визуального эффекта, как на макетах с объединенными ячейками слева, существует три основных подхода:
Проанализируем самый надежный способ. Суть его заключается в том, что мы запоминаем номер строки начала вывода фазы и номер строки окончания. После того как все детальные записи для конкретной фазы выведены, мы обращаемся к колонке фазы и вызываем метод Объединить().
Разберем пример кода, который реализует эту логику:
// Инициализируем табличный документ и макет
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ВыборкаФаза = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаФаза.Следующий() Цикл
// Запоминаем номер первой строки текущей фазы
НомерНачала = ТабДок.ВысотаТаблицы + 1;
ВыборкаДетали = ВыборкаФаза.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
// Заполняем параметры детальной строки (включая название фазы)
ОбластьСтрока.Параметры.Заполнить(ВыборкаДетали);
// Выводим строку целиком
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
// Номер последней строки текущей фазы
НомерОкончания = ТабДок.ВысотаТаблицы;
// Проверяем, есть ли что объединять
Если НомерОкончания > НомерНачала Тогда
// Предположим, что Фаза находится в колонке 1
ОбластьОбъединения = ТабДок.Область(НомерНачала, 1, НомерОкончания, 1);
ОбластьОбъединения.Объединить();
// Настраиваем вертикальное положение текста для красоты
ОбластьОбъединения.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
КонецЕсли;
КонецЦикла;
Важный нюанс: метод ТабДок.ВысотаТаблицы возвращает количество уже выведенных строк, что позволяет точно определить границы для метода Объсть().
Если структура макета сложная и включает множество колонок, удобно использовать пересечение секций. В макете определяются именованные горизонтальные области (строки) и вертикальные области (колонки). Вывод осуществляется в два этапа: сначала выводится «шапка» или левая часть, а затем к ней присоединяются данные.
Однако, как было отмечено в обсуждении на форуме, обычное использование Присоединить() для детальных записей вытянет их в ширину. Чтобы они шли вниз, нам все равно придется вызывать Вывести() для каждой новой строки детальных записей. Если при этом слева должна остаться «пустота» под первой ячейкой фазы, мы можем использовать пустую область макета соответствующей ширины и присоединять к ней данные, либо выводить строку целиком, где левая ячейка будет пустой (без границ или с объединением).
Если программное объединение кажется избыточным, можно воспользоваться свойством Размещение текста. Рассмотрим ситуацию, когда мы не хотим объединять ячейки программно:
Перекрывать или Авто.Проанализируем пример кода для этого способа:
ПерваяСтрокаФазы = Истина;
Пока ВыборкаДетали.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(ВыборкаДетали);
Если НЕ ПерваяСтрокаФазы Тогда
// Очищаем параметр, чтобы он не дублировался
ОбластьСтрока.Параметры.НазваниеФазы = "";
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);
ПерваяСтрокаФазы = Ложь;
КонецЦикла;
Этот метод проще в реализации, но он имеет недостаток: если детальные записи переносятся на следующую страницу, название фазы может остаться на предыдущем листе, и пользователь не увидит заголовка группировки на новом листе.
Для достижения профессионального вида отчета рекомендуем придерживаться следующих правил:
Объединить() всегда устанавливайте ВертикальноеПоложение = ВертикальноеПоложение.Центр, чтобы текст фазы находился посередине высокого блока.Присоединить(), помните, что он всегда работает в рамках текущей «активной» строки табличного документа. Чтобы «спуститься» ниже, нужно использовать Вывести().Таким образом, комбинируя методы Вывести() для создания строк и Объединить() для постобработки колонок группировки, мы получаем наиболее гибкий и корректный способ формирования сложных отчетов в 1С.