При разработке печатных форм в системе 1С:Предприятие часто возникает специфическая задача: необходимо вывести на страницу вертикальную область (например, инженерный штамп, боковую подпись или логотип во всю высоту), а справа от неё разместить таблицу с динамическим количеством строк. Стандартный метод Вывести() добавляет данные строго вниз, а метод Присоединить() — вправо. Трудность заключается в том, что после присоединения первой строки таблицы, вторая строка при использовании Присоединить() уходит вправо, а при использовании Вывести() — падает в самый низ под боковой штамп.
В данной статье мы подробно разберем, как обойти это ограничение платформы, проанализируем различные подходы и выберем наиболее эффективные программные методы реализации такой компоновки.
Первый подход, который мы рассмотрим, заключается в отказе от динамического "склеивания" строк. Вместо этого мы создаем в макете статичную область, которая уже содержит и боковую часть, и необходимое количество пустых строк справа. Этот метод идеально подходит, если количество строк в таблице ограничено и заранее известно (например, не более 30 строк на страницу).
Разберем алгоритм реализации этого метода по шагам:
ВесьДокумент), которая включает в себя боковую часть и сетку таблицы.Обл1, Обл2, Обл3 и так далее.Проанализируем пример кода для этого метода:
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
// Получаем всю область целиком
ОбластьВесь = Макет.ПолучитьОбласть("R1C1:R74C37");
Сч = 0;
Пока РезультатЗапроса.Следующий() Цикл
Сч = Сч + 1;
// Обращаемся к параметрам внутри уже полученной области по индексу
ОбластьВесь.Параметры["НомерП" + Строка(Сч)] = РезультатЗапроса.Номер;
ОбластьВесь.Параметры["Наименование" + Строка(Сч)] = РезультатЗапроса.Наименование;
// Если нужно программно изменить оформление конкретной строки (например, выделить группу)
ТекОбластьСтроки = ОбластьВесь.Области["Обл" + Строка(Сч)];
ТекОбластьСтроки.Шрифт = Новый Шрифт(,,Истина); // Жирный шрифт
КонецЦикла;
ТабДок.Вывести(ОбластьВесь);
Преимущество: Высокая скорость работы и простота визуального контроля макета. Мы точно видим, как будет выглядеть документ. Недостаток: Жесткое ограничение по количеству строк. Если данных окажется больше, чем заложено в "бланке", они не поместятся.
Этот метод является наиболее гибким и профессиональным. Суть его заключается в том, что мы формируем "правую" часть таблицы в отдельном объекте ТабличныйДокумент, а затем целиком присоединяем этот объект к основному документу, где уже выведен боковой блок.
Выясним, как это работает на практике. Метод Присоединить() умеет принимать в качестве параметра не только область макета, но и целый табличный документ. В этом случае 1С воспринимает присоединяемый документ как единый блок.
Рассмотрим пошаговый пример кода:
Результат = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
// 1. Выводим боковой штамп и шапку
ОбластьБоковая = Макет.ПолучитьОбласть("БоковаяЧасть");
ОбластьШапка = Макет.ПолучитьОбласть("ШапкаТаблицы");
Результат.Вывести(ОбластьБоковая);
Результат.Присоединить(ОбластьШапка);
// 2. Создаем временный документ для динамических строк
ВременныйТабДок = Новый ТабличныйДокумент;
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Счетчик = 1 По 20 Цикл
ОбластьСтрока.Параметры.Номер = Счетчик;
ОбластьСтрока.Параметры.Данные = "Текст строки " + Счетчик;
// Выводим строки во ВРЕМЕННЫЙ документ (они идут вертикально вниз)
ВременныйТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
// 3. ПРИСОЕДИНЯЕМ весь временный документ к основному справа от боковой части
Результат.Присоединить(ВременныйТабДок);
Результат.Показать();
В данном сценарии мы сначала подготовили "вертикальный" список строк во временном хранилище, а затем одной командой Присоединить(ВременныйТабДок) "приклеили" его справа к боковому штампу. Это позволяет динамически изменять количество строк, не ломая структуру документа.
Если структура документа крайне сложная, мы можем воспользоваться методом прямой записи в ячейки. Сначала выводится пустой каркас (или боковая часть), а затем мы программно определяем координаты ячеек для заполнения.
Проанализируем ситуацию: мы вывели боковую область, которая заняла 50 строк. Теперь нам нужно заполнить колонки со 2-й по 5-ю. Мы можем делать это в прямом цикле, обращаясь к ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).
// Допустим, ТабДок уже содержит выведенный штамп слева
Для НомерСтроки = 1 По СписокДанных.Количество() Цикл
// Заполняем конкретную ячейку справа от штампа (например, в 5-й колонке)
ТекЯчейка = ТабДок.Область(НомерСтроки, 5);
ТекЯчейка.Текст = СписокДанных[НомерСтроки-1].Значение;
// Можно сразу установить границы
ТекЯчейка.ГраницаСверху = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная);
КонецЦикла;
Этот метод требует аккуратности в расчетах координат, но дает полный контроль над каждой ячейкой после того, как основной макет уже выведен на экран.
При работе с методами Вывести() и Присоединить() необходимо учитывать несколько критических моментов, которые часто становятся причиной ошибок:
АвтоМасштаб = Истина. При динамическом присоединении колонок ширина документа может выйти за пределы печатного листа. 1С пересчитывает масштаб только после завершения формирования документа.Присоединить() для всего документа может быть проблематичным. В таких случаях рекомендуется рассчитывать высоту каждой страницы вручную и выводить боковой штамп заново на каждом новом листе.Рисунок (тип Текст). Рисунки в табличном документе имеют независимое позиционирование и не мешают выводу обычных строк через Вывести().Подводя итог, можно сказать, что наиболее универсальным способом является комбинирование временных табличных документов (Способ 2). Он позволяет сохранить гибкость 1С-разработки, использовать все преимущества макетов и при этом корректно обходить линейную логику вывода областей.