Как вывести параметр несколько раз в одной области табличного документа?

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

При формировании печатных форм и отчетов в 1С разработчики часто сталкиваются с ситуацией, когда в макете определена область со статическими данными и параметром, но этот параметр требуется заполнить несколькими значениями. Если просто перезаписывать параметр в цикле вида Область.Параметры.Параметр1 = Значение, в табличный документ попадет только последнее присвоенное значение. Выясним причину такого поведения и подробно разберем все способы решения этой задачи в зависимости от требуемого визуального результата.

Решение 1. Сбор нескольких значений в одну ячейку через перенос строки или разделитель

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

Для эффективного формирования такой строки в платформе 1С:Предприятие 8 рекомендуется использовать массив и функцию СтрСоединить вместо циклического сложения строк через знак плюс:


// Создаем массив для накопления значений
МассивЗначений = Новый Массив;

Для Каждого ТекЭлемент Из СписокЗначенийДляВывода Цикл
    МассивЗначений.Добавить(ТекЭлемент.Представление);
КонецЦикла;

// Получаем область из макета
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// Заполняем статичные параметры
ОбластьШапка.Параметры.Организация = Объект.Организация;

// Объединяем значения с переносом на новую строку
ОбластьШапка.Параметры.ПовторяющийсяПараметр = СтрСоединить(МассивЗначений, Символы.ПС);

// Выводим готовую область в результирующий документ
ТабличныйДокумент.Вывести(ОбластьШапка);

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

Решение 2. Разделение макета на области и использование методов «Вывести» и «Присоединить»

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

  1. В макете создаем именованные строки, например СтрокаДанных.
  2. Создаем именованные колонки: ФиксированнаяЧасть для статичных параметров и КолонкаПараметра для размножаемого блока.
  3. На пересечении строк и колонок получаем отдельные именованные области: СтрокаДанных|ФиксированнаяЧасть и СтрокаДанных|КолонкаПараметра.

Посмотрим на пример программной реализации с использованием методов Вывести и Присоединить:


// Получаем фиксированную область строки
ОбластьФикс = Макет.ПолучитьОбласть("СтрокаДанных|ФиксированнаяЧасть");
ОбластьФикс.Параметры.Номенклатура = ТекущаяНоменклатура;

// Выводим базовую часть строки
ТабличныйДокумент.Вывести(ОбластьФикс);

// Получаем динамическую область для присоединения справа
ОбластьКолонка = Макет.ПолучитьОбласть("СтрокаДанных|КолонкаПараметра");

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

Решение 3. Циклический вывод области целиком (формирование строк таблицы)

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


ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТаблицы");

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

Решение 4. Прямая адресация ячеек в сформированном документе

Рассмотрим ситуацию, когда шаблон выводится один раз, а затем внутри выведенного диапазона программно заполняются дополнительные значения по координатам. Для этого используется обращение к ячейкам результирующего документа через метод Область(НомерСтроки, НомерКолонки).


// Выводим область-контейнер
ОбластьКонтейнер = Макет.ПолучитьОбласть("БлокДанных");
ТабличныйДокумент.Вывести(ОбластьКонтейнер);

// Определяем базовые координаты на основе высоты и ширины таблицы
БазоваяСтрока = ТабличныйДокумент.ВысотаТаблицы;
БазоваяКолонка = 2;

Смещение = 0;
Для Каждого ТекЗначение Из МассивДополнительныхДанных Цикл
    // Заполняем ячейки со смещением по колонкам
    Ячейка = ТабличныйДокумент.Область(БазоваяСтрока, БазоваяКолонка + Смещение);
    Ячейка.Текст = Формат(ТекЗначение, "ЧДЦ=2");
    Смещение = Смещение + 1;
КонецЦикла;

Решение 5. Динамическое расширение через метод «ВставитьОбласть»

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


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

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

Таким образом, выбор подхода зависит от структуры макета: для простого перечисления в одной графе оптимально использовать соединение строк с параметром переноса, а для динамического размножения ячеек по горизонтали или вертикали — комбинацию секций с методами Вывести и Присоединить.

← На главную