При работе с типовыми конфигурациями программисты часто сталкиваются с ситуацией, когда необходимо внести изменения в печатную форму, но при этом крайне нежелательно снимать макет с поддержки. Типичный пример — добавление блока с визами утверждения или дополнительных реквизитов в подвал документа. В таких случаях возникает вопрос: можно ли полностью программно, без визуального редактирования в конфигураторе, создать новую область в табличном документе и определить в ней параметры для заполнения? Разберем эту задачу детально.
Для начала проанализируем, как система 1С:Предприятие воспринимает структуру табличного документа. Любая ячейка или группа ячеек является объектом ОбластьЯчеекТабличногоДокумента. Чтобы программно воздействовать на макет, нам нужно сначала выделить нужный диапазон, а затем настроить его свойства.
Рассмотрим основной способ получения области по ее координатам. Для этого используется метод Область(). Мы можем указать координаты в формате «R1C1» (строка/колонка) или передать номера строк и колонок числами. Посмотрим на пример кода:
// Получаем область из одной ячейки (строка 10, колонка 2)
НоваяЯчейка = ТабДок.Область(10, 2, 10, 2);
// Или указываем прямоугольный диапазон через строку адреса
ОбластьДляВиз = ТабДок.Область("R10C2:R12C5");
Просто выделить область недостаточно — нам нужно указать системе, что текст, который мы туда запишем, должен восприниматься как имя параметра. В сообщениях форума справедливо отмечено свойство Параметр, но для полноценной работы этого мало. Выясним, какие свойства необходимо установить обязательно.
Ключевым моментом является свойство Заполнение. По умолчанию ячейка имеет тип «Текст». Чтобы превратить ее в параметр, нужно присвоить ей значение из перечисления ТипЗаполненияТабличногоДокумента.Параметр. Проанализируем правильный алгоритм действий:
Параметры табличного документа.Посмотрим, как это выглядит в коде:
// Выделяем ячейку, где будет фамилия утверждающего
ЯчейкаУтверждант = ТабДок.Область("R15C3");
// Указываем, что это параметр, а не просто статичный текст
ЯчейкаУтверждант.Заполнение = ТипЗаполненияТабличногоДокумента.Параметр;
// Задаем имя параметра
ЯчейкаУтверждант.Параметр = "ФИОУтверждающего";
// Теперь мы можем заполнить этот параметр обычным способом
ТабДок.Параметры.ФИОУтверждающего = "Иванов Иван Иванович";
Если задача стоит шире — не просто создать параметр в ячейке, а создать полноценную именованную область, которую потом можно будет многократно использовать методом ПолучитьОбласть(), нам потребуется коллекция Области. Это особенно полезно, когда мы динамически формируем макет «на лету» в оперативной памяти.
Разберем, как добавить новую именованную область в коллекцию макета:
// Допустим, у нас есть пустой табличный документ (макет)
Макет = Новый ТабличныйДокумент;
// Создаем структуру области (например, 2 строки внизу)
// и регистрируем ее под именем "ПодвалСВизами"
Макет.Области.Добавить("ПодвалСВизами", Макет.Область("R1:R2"));
// Теперь мы можем обращаться к ней как в обычном макете
ОбластьВизы = Макет.ПолучитьОбласть("ПодвалСВизами");
Поскольку мы создаем область «вслепую», без визуального редактора, нам важно задать ей правильное оформление, чтобы она не выбивалась из общего стиля документа. Рассмотрим основные инструменты оформления:
1. Работа со шрифтами: Для создания объекта Шрифт используется конструктор, где можно указать название шрифта, размер и начертание (жирный, курсив).
2. Границы и линии: Для отрисовки границ используется объект Линия. Мы можем задать стиль линии (сплошная, пунктир) и ее толщину.
3. Выравнивание: Свойства ГоризонтальноеПоложение и ВертикальноеПоложение позволяют центрировать текст в ячейке.
Проанализируем пример комплексного оформления программно созданной области:
Ячейка = ТабДок.Область("R15C3");
Ячейка.Текст = "Утверждаю:";
// Устанавливаем жирный шрифт
Ячейка.Шрифт = Новый Шрифт(Ячейка.Шрифт, , , Истина);
// Устанавливаем границы снизу (эффект подчеркивания для подписи)
Ячейка.ГраницаСнизу = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
// Выравниваем по левому краю
Ячейка.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Лево;
Как было упомянуто в сообщении 4 обсуждения, использование параметров не всегда является обязательным. Если ваша задача — просто вывести конкретное значение в известную ячейку (например, после формирования основного тела документа), можно использовать свойство Текст. Это избавляет от необходимости настройки ТипЗаполненияТабличногоДокумента.Параметр.
Этот подход удобен, когда вы модифицируете уже готовый результат вывода перед показом пользователю:
// Сначала выводим типовой макет
ТабДок = Новый ТабличныйДокумент;
// ... (код заполнения из макета) ...
// Затем программно "дописываем" данные в конец
НомерПоследнейСтроки = ТабДок.ВысотаТаблицы + 2;
ТабДок.Область(НомерПоследнейСтроки, 2).Текст = "Дата подписания: " + Формат(ТекущаяДата(), "ДЛФ=D");
В некоторых случаях добавление параметров в сетку ячеек неудобно, так как это может «раздвинуть» колонки макета. Решением может стать программное создание объекта РисунокТабличногоДокумента с типом Текст. Такие объекты располагаются «поверх» сетки и не влияют на ширину колонок.
Разберем по шагам создание текстового блока поверх таблицы:
// Добавляем новый рисунок (текстовое поле)
ТекстовоеПоле = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
// Задаем координаты (в миллиметрах или через привязку к ячейкам)
ТекстовоеПоле.Расположить(ТабДок.Область("R1C5:R3C7"));
// Настраиваем как параметр
ТекстовоеПоле.Заполнение = ТипЗаполненияТабличногоДокумента.Параметр;
ТекстовоеПоле.Параметр = "ДополнительнаяИнформация";
// Убираем рамку, чтобы текст выглядел естественно
ТекстовоеПоле.Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии);
Подводя итог, можно уверенно сказать, что платформа 1С предоставляет исчерпывающий инструментарий для динамической модификации печатных форм. Комбинируя методы Область(), настройку свойства Заполнение и программное форматирование, вы можете реализовать любые требования к печатным формам, сохраняя при этом типовые макеты на поддержке. В качестве альтернативного готового инструмента для таких задач можно использовать готовое решение для постобработки печатных форм на БСП, которое позволяет изменять сформированные печатные формы с помощью расширения и внешней обработки.