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

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

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

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

Способ 1. Использование макета как готового бланка (сетки)

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

Разберем алгоритм реализации этого метода по шагам:

  1. В макете создаем одну большую область (например, с именем ВесьДокумент), которая включает в себя боковую часть и сетку таблицы.
  2. Внутри этой области каждой ячейке или строке присваиваем уникальные имена или параметры, например: Обл1, Обл2, Обл3 и так далее.
  3. Программно получаем эту область целиком, заполняем её параметры в цикле и выводим один раз.

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


ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
// Получаем всю область целиком
ОбластьВесь = Макет.ПолучитьОбласть("R1C1:R74C37"); 

Сч = 0;
Пока РезультатЗапроса.Следующий() Цикл
    Сч = Сч + 1;
    // Обращаемся к параметрам внутри уже полученной области по индексу
    ОбластьВесь.Параметры["НомерП" + Строка(Сч)] = РезультатЗапроса.Номер;
    ОбластьВесь.Параметры["Наименование" + Строка(Сч)] = РезультатЗапроса.Наименование;
    
    // Если нужно программно изменить оформление конкретной строки (например, выделить группу)
    ТекОбластьСтроки = ОбластьВесь.Области["Обл" + Строка(Сч)];
    ТекОбластьСтроки.Шрифт = Новый Шрифт(,,Истина); // Жирный шрифт
КонецЦикла;

ТабДок.Вывести(ОбластьВесь);

Преимущество: Высокая скорость работы и простота визуального контроля макета. Мы точно видим, как будет выглядеть документ. Недостаток: Жесткое ограничение по количеству строк. Если данных окажется больше, чем заложено в "бланке", они не поместятся.

Способ 2. Использование промежуточных (временных) табличных документов

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

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

Рассмотрим пошаговый пример кода:


Результат = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");

// 1. Выводим боковой штамп и шапку
ОбластьБоковая = Макет.ПолучитьОбласть("БоковаяЧасть");
ОбластьШапка = Макет.ПолучитьОбласть("ШапкаТаблицы");

Результат.Вывести(ОбластьБоковая);
Результат.Присоединить(ОбластьШапка);

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

Для Счетчик = 1 По 20 Цикл
    ОбластьСтрока.Параметры.Номер = Счетчик;
    ОбластьСтрока.Параметры.Данные = "Текст строки " + Счетчик;
    
    // Выводим строки во ВРЕМЕННЫЙ документ (они идут вертикально вниз)
    ВременныйТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

// 3. ПРИСОЕДИНЯЕМ весь временный документ к основному справа от боковой части
Результат.Присоединить(ВременныйТабДок);

Результат.Показать();

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

Способ 3. Прямая адресация через метод Область()

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

Проанализируем ситуацию: мы вывели боковую область, которая заняла 50 строк. Теперь нам нужно заполнить колонки со 2-й по 5-ю. Мы можем делать это в прямом цикле, обращаясь к ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).


// Допустим, ТабДок уже содержит выведенный штамп слева
Для НомерСтроки = 1 По СписокДанных.Количество() Цикл
    // Заполняем конкретную ячейку справа от штампа (например, в 5-й колонке)
    ТекЯчейка = ТабДок.Область(НомерСтроки, 5); 
    ТекЯчейка.Текст = СписокДанных[НомерСтроки-1].Значение;
    
    // Можно сразу установить границы
    ТекЯчейка.ГраницаСверху = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная);
КонецЦикла;

Этот метод требует аккуратности в расчетах координат, но дает полный контроль над каждой ячейкой после того, как основной макет уже выведен на экран.

Важные технические нюансы и рекомендации

При работе с методами Вывести() и Присоединить() необходимо учитывать несколько критических моментов, которые часто становятся причиной ошибок:

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

← На главную