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