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

Программист
← На главную

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

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

Почему метод Присоединить() не всегда подходит?

Метод Присоединить() работает по принципу «дописывания» колонок к уже выведенным строкам. Проанализируем ситуацию: если мы выводим сначала «Шапку», потом «Строки», а затем пытаемся присоединить длинную вертикальную область «Номерки», 1С будет пытаться состыковать их построчно. Если в макете область «Номерки» по высоте больше, чем одна строка основной части, возникают конфликты отрисовки. Текст может накладываться друг на друга или пропадать при переходе на следующую секцию.

Рассмотрим более надежный алгоритм: сначала полностью сформировать основное «тело» документа, а затем в правой колонке создать объединенную ячейку нужной высоты и развернуть в ней текст.

Решение 1: Объединение ячеек и поворот текста

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


// Сначала выводим все основные области (Шапка, Строки, Подвал)
// ... код вывода основного содержимого ...

// Получаем текущую высоту сформированной таблицы
ВысотаТаблицы = ТабличныйДокумент.ВысотаТаблицы;

// Определяем область в колонке (например, 5-я колонка) от первой до последней строки
ОбластьНомерков = ТабличныйДокумент.Область("R1C5:R" + ВысотаТаблицы + "C5");

// Объединяем ячейки в одну вертикальную полосу
ОбластьНомерков.Объединить();

// Настраиваем отображение текста
ОбластьНомерков.ОриентацияТекста = 90; // Поворачиваем текст вертикально
ОбластьНомерков.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
ОбластьНомерков.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;

// Заполняем текст (можно сформировать строку с разделителями)
ОбластьНомерков.Текст = "Заказ №123 | Заказ №123 | Заказ №123";

Решение 2: Динамическое распределение номерков (универсальная процедура)

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


Процедура ВывестиНомерок(ТабличныйДокумент, НачСтрока, НомерСтобца, КонСтрока, ТекстЯчейки)
    // Выделяем конкретный диапазон строк для одного номерка
    Область = ТабличныйДокумент.Область("R" + НачСтрока + "C" + НомерСтобца + ":R" + КонСтрока + "C" + НомерСтобца);
    
    // Объединяем выбранный диапазон
    Область.Объединить();
    
    // Устанавливаем параметры шрифта и ориентации
    Область.ОриентацияТекста = 90;
    Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
    Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
    
    ШрифтОбласти = Новый Шрифт("Verdana", 12, Истина);
    Область.Шрифт = ШрифтОбласти;
    Область.Текст = ТекстЯчейки;
    
    // Оформляем пунктирную границу для имитации линии отрыва
    ЛинияРамки = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.РедкийПунктир, 1);
    Область.ГраницаСверху = ЛинияРамки;
    Область.ГраницаСлева = ЛинияРамки;
    Область.ГраницаСнизу = ЛинияРамки;
    Область.ГраницаСправа = ЛинияРамки;
КонецПроцедуры

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


ВысотаВсего = ТабличныйДокумент.ВысотаТаблицы;
КоличествоНомерков = 5;
СтрокНаОдинНомерок = Цел(ВысотаВсего / КоличествоНомерков);

Для Ном = 1 По КоличествоНомерков Цикл
    Начало = (Ном - 1) * СтрокНаОдинНомерок + 1;
    Конец = ?(Ном = КоличествоНомерков, ВысотаВсего, Начало + СтрокНаОдинНомерок - 1);
    
    ВывестиНомерок(ТабличныйДокумент, Начало, 6, Конец, "Билет №" + НомерДок);
КонецЦикла;

Важные нюансы при работе с вертикальными областями

Рассмотрим несколько профессиональных советов, которые помогут избежать проблем при печати:

  1. Разрыв страниц: Если ваш документ занимает несколько листов, огромная объединенная ячейка может некорректно «разрезаться» принтером. В этом случае расчет номерков нужно делать для каждой страницы отдельно, используя метод ПроверитьВывод().
  2. Фиктивные колонки: Рекомендуется оставлять одну узкую пустую колонку между основным текстом документа и областью номерков. Это создаст необходимый отступ, чтобы при разрезании бумаги не пострадали важные данные.
  3. Точный расчет высоты: Если строки документа имеют разную высоту (из-за свойства АвтоВысотаСтроки), расчет по количеству строк может быть неточным. Для идеального позиционирования можно использовать метод ВысотаСтроки(), который возвращает размер в пунктах, и суммировать эти значения.
  4. Графические объекты: Вместо ячеек можно использовать коллекцию Рисунки табличного документа. Создав РисунокТабличногоДокумента с типом Текст, вы получите полную свободу позиционирования. Такой объект можно повернуть на 90 градусов и разместить поверх сетки ячеек в любом месте.

Выясним причину, по которой текст может не отображаться даже после поворота: проверьте свойство РазмещениеТекста. Для вертикальных областей лучше устанавливать значение Переносить или Авто, чтобы система корректно вписывала длинные строки в узкую колонку.

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

← На главную