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