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

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

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

Почему метод Присоединить() работает некорректно?

Рассмотрим механику работы табличного документа. В 1С ТабличныйДокумент базируется на единой сетке колонок. Когда мы используем метод Вывести(), мы добавляем строки вниз. Когда используем Присоединить(), система пытается сопоставить колонки нового блока с уже существующей сеткой. Если в присоединяемом макете ширина колонок отличается от тех, что уже выведены в этих строках, 1С вынуждена принимать решение: либо растянуть существующие, либо сжать новые.

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

Решение 1: Использование «пустышки» для инициализации сетки

Один из эмпирических способов, найденных разработчиками, заключается в предварительном выводе пустого табличного документа. Это позволяет «сбросить» глобальные установки ширины и подготовить почву для более гибкого применения форматов последующих блоков. Проанализируем пример кода:


&НаСервере
Процедура ВывестиНаСервере()
    Результат.Очистить();
    ОбъектМетаданных = РеквизитФормыВЗначение("Объект");
    
    Макет1 = ОбъектМетаданных.ПолучитьМакет("М1");
    Макет2 = ОбъектМетаданных.ПолучитьМакет("М2");
    
    // Выводим пустой документ для инициализации
    Результат.Присоединить(Новый ТабличныйДокумент);
    
    // Теперь присоединяем основные макеты
    Результат.Присоединить(Макет1);
    Результат.Присоединить(Макет2);
КонецПроцедуры

Как показывает практика, без добавления пустого ТабличныйДокумент в начало таблицы, визуальное представление колонок может бесконтрольно меняться. Этот метод заставляет 1С пересчитывать границы более корректно.

Решение 2: Программная корректировка и удаление лишних областей

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

  1. Определяем высоту документа до вывода новой секции.
  2. Выводим промежуточный макет или «разделитель».
  3. Присоединяем основные данные.
  4. Определяем новую высоту и удаляем первую колонку в этом диапазоне строк.

&НаСервере
Процедура ВывестиСКорректировкойНаСервере()
    Результат.Очистить();
    ОбъектОбъ = РеквизитФормыВЗначение("Объект");
    
    // Выводим заголовочную часть
    М0 = ОбъектОбъ.ПолучитьМакет("М0");
    Результат.Вывести(М0);
    
    НачалоБлока = Результат.ВысотаТаблицы + 1;
    
    // Присоединяем данные
    Т = Новый ТабличныйДокумент;
    Результат.Присоединить(Т);
    
    М1 = ОбъектОбъ.ПолучитьМакет("М1");
    Результат.Присоединить(М1);
    
    КонецБлока = Результат.ВысотаТаблицы;
    
    // Удаляем первую колонку, если она пустая или портит вид
    ОбластьДляУдаления = Результат.Область(НачалоБлока, 1, КонецБлока, 1);
    Результат.УдалитьОбласть(ОбластьДляУдаления, ТипСмещенияТабличногоДокумента.ПоГоризонтали);
КонецПроцедуры

Решение 3: Механизм «Формат строк» (CreateRowFormat)

Это наиболее профессиональный и надежный метод. В 1С существует возможность назначить определенным строкам свой собственный набор колонок, который не будет зависеть от ширины колонок в строках выше или ниже. Это делается с помощью метода СоздатьФорматСтрок().

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

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


// Пример логики переноса ширины (универсальный подход)
Для НомерКолонки = 1 По МакетИсточник.ШиринаТаблицы Цикл
    ТекущаяКолонкаМакета = МакетИсточник.Область(1, НомерКолонки);
    ТекущаяКолонкаРезультата = Результат.Область(НачалоСтрок, НомерКолонкиРезультата);
    ТекущаяКолонкаРезультата.ШиринаКолонки = ТекущаяКолонкаМакета.ШиринаКолонки;
КонецЦикла;

Решение 4: Принудительная установка ширины колонок после вывода

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


// Ручная корректировка после формирования
Результат.Область(НачалоПодвала + 4, 2).ШиринаКолонки = 20;
Результат.Область(НачалоПодвала + 4, 3).ШиринаКолонки = 15;
Результат.Область(НачалоПодвала + 4, 6).ШиринаКолонки = 20;

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

Подведем итоги

Универсального «волшебного» метода, который бы одной кнопкой идеально склеивал любые макеты СКД справа, не существует из-за особенностей архитектуры ТабличныйДокумент. Однако, комбинируя следующие приемы, мы можем добиться идеального результата:

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

← На главную