При формировании сложных печатных форм и отчетов часто возникает необходимость объединить в одном результирующем табличном документе области из разных макетов. Например, шапка выводится из одного макета с одной структурой колонок, а табличная часть или подвал — из другого. Однако при обычном последовательном выводе методом Вывести() разработчики часто сталкиваются с проблемой: колонки второй области сжимаются или растягиваются, подстраиваясь под ширину колонок первого выведенного блока.
Рассмотрим подробно причины такого поведения платформы 1С:Предприятие и разберем проверенные способы решения этой задачи.
По умолчанию все строки результирующего табличного документа используют единый общий формат колонок. Когда вы последовательно выводите области из разных макетов, платформа 1С пытается уместить выводимые ячейки в уже существующую сетку колонок, заданную первой выведенной областью. Если для строк второго макета не задан собственный индивидуальный формат строк, их индивидуальные размеры колонок игнорируются.
Чтобы каждая область табличного документа сохраняла свою собственную ширину колонок, необходимо явно объявить для этих строк отдельный формат строк.
Самый простой и эффективный способ — настроить независимый формат строк непосредственно в макете через Конфигуратор. В этом случае не потребуется писать дополнительный код для ручной установки ширины колонок.
Проанализируем по шагам, как это сделать:
Макет2) в редакторе макетов.После сохранения макета вызов стандартного кода вывода автоматически сохранит заданную ширину колонок:
ТабДок = Новый ТабличныйДокумент;
Макет1 = ПолучитьМакет("Макет1");
Область1 = Макет1.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Область1);
Макет2 = ПолучитьМакет("Макет2");
Область2 = Макет2.ПолучитьОбласть("СтрокаТаблицы");
ТабДок.Вывести(Область2);
Если макет формируется динамически или нет возможности изменить его структуру в Конфигураторе, можно воспользоваться программным методом СоздатьФорматСтрок() у объекта ОбластьЯчеекТабличногоДокумента.
Разберем алгоритм решения по шагам:
СоздатьФорматСтрок().Посмотрим на пример программной реализации:
ТабДок = Новый ТабличныйДокумент;
// Выводим первую область
Макет1 = ПолучитьМакет("Макет1");
Область1 = Макет1.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Область1);
// Выводим вторую область с другим форматом колонок
Макет2 = ПолучитьМакет("Макет2");
Область2 = Макет2.ПолучитьОбласть("Таблица");
// Запоминаем начальную строку для нового блока
СтартСтрока = ТабДок.ВысотаТаблицы + 1;
// Выводим область
ТабДок.Вывести(Область2);
// Определяем диапазон добавленных строк и создаем для них новый формат
НоваяОбласть = ТабДок.Область(СтартСтрока, , ТабДок.ВысотаТаблицы, );
НоваяОбласть.СоздатьФорматСтрок();
// Настраиваем ширину колонок для нового формата строк
ТабДок.Область(СтартСтрока, 1).ШиринаКолонки = 15;
ТабДок.Область(СтартСтрока, 2).ШиринаКолонки = 40;
ТабДок.Область(СтартСтрока, 3).ШиринаКолонки = 10;
Существует еще один подход — создание в макете большого количества очень узких колонок одинаковой ширины (например, ШиринаКолонки = 1) и последующее объединение ячеек под нужную ширину текстовых блоков. Однако данный метод имеет существенные недостатки: он усложняет верстку макета и значительно замедляет скорость генерации результирующего документа при выводе больших объемов данных.
При использовании различных форматов строк в одном табличном документе следует учитывать важные платформенные особенности:
Экспорт в Microsoft Excel: Если результирующий табличный документ содержит строки с разной шириной колонок, при сохранении в форматы .xls или .xlsx платформе приходится приводить все строки к единой сетке. Из-за этого визуальное оформление документа в Excel может исказиться.
Альтернативные форматы для сохранения: Для точного сохранения внешнего вида и верстки печатной формы при выгрузке рекомендуется использовать форматы PDF, HTML или XPS, которые сохраняют произвольный формат строк без искажений.
Выделение и копирование: В документе с несколькими форматами строк пользователь не сможет выделить произвольную прямоугольную область мышью, если она пересекает границу между двумя разными форматами строк. Выделение в таких зонах возможно только строками целиком.