Как в 1С вывести одну область слева от нескольких строк с объединением ячеек?

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

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

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

Анализ проблемы и выбор стратегии

Основная сложность заключается в том, что ТабличныйДокумент в 1С представляет собой жесткую сетку. Мы не можем просто вставить «таблицу внутрь ячейки». Чтобы добиться визуального эффекта, как на макетах с объединенными ячейками слева, существует три основных подхода:

  1. Программное объединение ячеек после вывода строк. Мы выводим значение группировки в каждой строке, а затем объединяем эти ячейки в одну область.
  2. Использование пересечения горизонтальных и вертикальных секций. Это классический метод работы с макетом, позволяющий гибко управлять структурой документа.
  3. Условный вывод (вывод заголовка только в первой строке). В этом случае значение группировки выводится один раз, а в последующих строках ячейка остается пустой, но границы настраиваются так, чтобы это выглядело как единый блок.

Метод 1: Программное объединение (рекомендуемый)

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

Разберем пример кода, который реализует эту логику:


// Инициализируем табличный документ и макет
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

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

Пока ВыборкаФаза.Следующий() Цикл
    
    // Запоминаем номер первой строки текущей фазы
    НомерНачала = ТабДок.ВысотаТаблицы + 1;
    
    ВыборкаДетали = ВыборкаФаза.Выбрать();
    Пока ВыборкаДетали.Следующий() Цикл
        
        // Заполняем параметры детальной строки (включая название фазы)
        ОбластьСтрока.Параметры.Заполнить(ВыборкаДетали);
        
        // Выводим строку целиком
        ТабДок.Вывести(ОбластьСтрока);
        
    КонецЦикла;
    
    // Номер последней строки текущей фазы
    НомерОкончания = ТабДок.ВысотаТаблицы;
    
    // Проверяем, есть ли что объединять
    Если НомерОкончания > НомерНачала Тогда
        // Предположим, что Фаза находится в колонке 1
        ОбластьОбъединения = ТабДок.Область(НомерНачала, 1, НомерОкончания, 1);
        ОбластьОбъединения.Объединить();
        // Настраиваем вертикальное положение текста для красоты
        ОбластьОбъединения.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
    КонецЕсли;
    
КонецЦикла;

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

Метод 2: Работа с горизонтальными и вертикальными секциями

Если структура макета сложная и включает множество колонок, удобно использовать пересечение секций. В макете определяются именованные горизонтальные области (строки) и вертикальные области (колонки). Вывод осуществляется в два этапа: сначала выводится «шапка» или левая часть, а затем к ней присоединяются данные.

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

Метод 3: Оптимизация визуального отображения

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

  1. В макете для ячейки с названием фазы установим параметр Размещение текста в значение Перекрывать или Авто.
  2. В цикле вывода выводим название фазы только в самой первой строке группы.
  3. Для всех последующих строк этой фазы параметр ячейки «НазваниеФазы» оставляем пустым.
  4. Чтобы границы смотрелись цельно, у ячеек фазы в макете можно отключить нижнюю границу (для промежуточных строк) и верхнюю (для всех, кроме первой).

Проанализируем пример кода для этого способа:


ПерваяСтрокаФазы = Истина;
Пока ВыборкаДетали.Следующий() Цикл
    ОбластьСтрока.Параметры.Заполнить(ВыборкаДетали);
    
    Если НЕ ПерваяСтрокаФазы Тогда
        // Очищаем параметр, чтобы он не дублировался
        ОбластьСтрока.Параметры.НазваниеФазы = "";
    КонецЕсли;
    
    ТабДок.Вывести(ОбластьСтрока);
    ПерваяСтрокаФазы = Ложь;
КонецЦикла;

Этот метод проще в реализации, но он имеет недостаток: если детальные записи переносятся на следующую страницу, название фазы может остаться на предыдущем листе, и пользователь не увидит заголовка группировки на новом листе.

Рекомендации по форматированию

Для достижения профессионального вида отчета рекомендуем придерживаться следующих правил:

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

← На главную