Когда возникает задача вывести табличную часть документа в табличный документ без привязки к заранее созданному макету, нам требуется максимальная гибкость в управлении структурой и внешним видом отчета. Это особенно актуально, когда количество и состав столбцов может динамически меняться, или когда стандартные средства вывода, как показывает сравнение с СКД (или использование специальных оберток над объектной моделью компоновки), не позволяют достичь требуемого форматирования. В таких случаях мы обращаемся к программному формированию табличного документа, используя его возможности по работе с областями и ячейками.
Давайте подробно разберем, как мы можем программно сформировать табличный документ, вывести в него данные из табличной части документа, а также настроить его форматирование, включая границы, шрифты и выравнивание — для этой задачи подойдёт пошаговая отладка программного кода 1С.
Объект ТабличныйДокумент в 1С предоставляет мощный инструментарий для создания и управления отчетами и печатными формами, что является одной из основ создания печатных форм в 1С через работу с объектной моделью — в этом поможет редактор печатных форм без использования конфигуратора. Мы можем работать с ним как с сеткой ячеек, каждой из которых можно присвоить текст, значение, а также настроить ее внешний вид. Основной принцип при работе без макета заключается в следующем:
ТабличныйДокумент. Это первый шаг при создании классической внешней печатной формы на БСП.Существуют два основных подхода при программном формировании: поэлементное заполнение ячеек и использование метода Вывести() с программно созданными областями. Для ускорения разработки на этом этапе часто применяется универсальная форма отладки для внешних печатных форм — это консоль разработчика для отладки печатных форм.
Этот подход является наиболее гибким, поскольку мы вручную контролируем каждую ячейку и ее свойства. Мы будем создавать новые области для каждой строки табличного документа, а затем заполнять ячейки внутри этих областей.
Прежде всего, нам нужно создать новый объект ТабличныйДокумент. Мы можем также очистить его на случай, если он был ранее использован.
// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;
ТабДок.Очистить(); // Очищаем документ на случай, если он уже содержит данные
Начнем с вывода общего заголовка для нашей таблицы. Мы создадим область, присвоим ей текст, настроим шрифт и выравнивание, а затем выведем эту область в табличный документ.
// Заголовок таблицы
// Мы создаем область с названием "Заголовок" на первой строке, с первой по третью колонку.
ОбластьЗаголовка = ТабДок.Области.Добавить("Заголовок", 1, 1, 1, 3);
ОбластьЗаголовка.Текст = "Список Товаров"; // Устанавливаем текст заголовка
ОбластьЗаголовка.Шрифт.Размер = 12; // Задаем размер шрифта
ОбластьЗаголовка.Шрифт.Жирный = Истина; // Делаем шрифт жирным
ОбластьЗаголовка.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр; // Выравниваем текст по центру
ТабДок.Вывести(ОбластьЗаголовка); // Выводим созданную область в табличный документ
Здесь мы используем метод ТабДок.Области.Добавить(), указывая имя области и ее координаты (строкаНачало, колонкаНачало, строкаКонец, колонкаКонец). Это позволяет нам определить точный диапазон ячеек, который будет занимать наш заголовок. Затем мы обращаемся к свойствам этой области, таким как Текст, Шрифт и ГоризонтальноеПоложение, для настройки внешнего вида.
После общего заголовка мы разместим заголовки для каждой колонки нашей табличной части. Для этого мы создадим новую область, которая будет располагаться непосредственно под предыдущей областью. Важно правильно определить номер строки для новой области, чтобы она не перекрывала предыдущие данные. Для этого мы используем свойство ТабДок.ВывысотаТаблицы, которое возвращает текущую высоту табличного документа, позволяя нам размещать новые элементы ниже.
// Заголовки колонок
// Определяем номер строки, следующей за последней заполненной строкой
НомерСтроки = ТабДок.ВысотаТаблицы + 1;
// Создаем область для заголовков колонок
ОбластьКолонок = ТабДок.Области.Добавить("Колонки", НомерСтроки, 1, НомерСтроки, 3);
// Заполняем текст для каждой ячейки заголовка
ОбластьКолонок.Ячейки[1].Текст = "№";
ОбластьКолонок.Ячейки[2].Текст = "Номенклатура";
ОбластьКолонок.Ячейки[3].Текст = "Количество";
// Настраиваем форматирование заголовков колонок
ОбластьКолонок.Шрифт.Жирный = Истина; // Делаем шрифт жирным
ОбластьКолонок.ЦветФона = Новый Цвет(220, 220, 220); // Устанавливаем светло-серый фон
ОбластьКолонок.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр; // Выравниваем текст по центру
// Устанавливаем границы для каждой ячейки заголовков
Для Счетчик = 1 По 3 Цикл // Проходим по всем колонкам
// Устанавливаем тонкие границы со всех сторон для каждой ячейки
ОбластьКолонок.Ячейки[Счетчик].ГраницаСлева = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьКолонок.Ячейки[Счетчик].ГраницаСверху = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьКолонок.Ячейки[Счетчик].ГраницаСправа = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьКолонок.Ячейки[Счетчик].ГраницаСнизу = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
КонецЦикла;
ТабДок.Вывести(ОбластьКолонок); // Выводим область с заголовками колонок
Здесь мы видим использование массива Ячейки у объекта Область для доступа к отдельным ячейкам. Это позволяет нам присваивать текст и настраивать свойства каждой ячейки индивидуально. Особое внимание уделите установке границ. Мы создаем новый объект Линия, указывая ее тип (ТипЛинииТабличногоДокумента.Тонкая), и присваиваем его свойствам ГраницаСлева, ГраницаСверху, ГраницаСправа, ГраницаСнизу каждой ячейки.
Теперь мы переходим к самому главному — выводу данных из табличной части документа. Мы будем перебирать каждую строку табличной части и для каждой из них создавать новую область в табличном документе, заполняя ее соответствующими значениями.
// Выводим данные табличной части
НомерПозиции = 1; // Счетчик для порядкового номера строк
// Предполагаем, что у нас есть объект ДокументОбъект, содержащий табличную часть "Товары"
Для Каждого СтрТЧ Из ДокументОбъект.Товары Цикл
// Определяем номер строки, следующей за последней заполненной строкой
НомерСтроки = ТабДок.ВысотаТаблицы + 1;
// Создаем область для текущей строки данных
ОбластьДанных = ТабДок.Области.Добавить("Данные" + НомерПозиции, НомерСтроки, 1, НомерСтроки, 3);
// Заполняем ячейки данными из табличной части
ОбластьДанных.Ячейки[1].Текст = НомерПозиции; // Порядковый номер
ОбластьДанных.Ячейки[2].Текст = СтрТЧ.Номенклатура; // Номенклатура из текущей строки ТЧ
ОбластьДанных.Ячейки[3].Текст = СтрТЧ.Количество; // Количество из текущей строки ТЧ
// Устанавливаем границы для ячеек данных, аналогично заголовкам
Для Счетчик = 1 По 3 Цикл
ОбластьДанных.Ячейки[Счетчик].ГраницаСлева = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьДанных.Ячейки[Счетчик].ГраницаСверху = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьДанных.Ячейки[Счетчик].ГраницаСправа = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьДанных.Ячейки[Счетчик].ГраницаСнизу = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
КонецЦикла;
ТабДок.Вывести(ОбластьДанных); // Выводим область с данными текущей строки
НомерПозиции = НомерПозиции + 1; // Увеличиваем счетчик
КонецЦикла;
Здесь мы используем цикл Для Каждого для обхода строк табличной части. Для каждой строки мы повторяем процесс создания области и заполнения ячеек. При необходимости в ячейки можно встроить и сложные элементы, такие как QR и штрихкоды без использования внешних компонент.
После того как все данные выведены и отформатированы, нам нужно показать сформированный табличный документ пользователю.
ТабДок.Показать(); // Открываем табличный документ для просмотра
Метод Показать() открывает табличный документ в отдельном окне, где пользователь может его просмотреть, распечатать или сохранить.
Хотя предыдущий метод позволяет добиться полной гибкости, иногда требуется более компактный код для повторяющихся строк. Метод Области.Получить() позволяет нам получить объект ОбластьЯчеекТабличногоДокумента, который можно использовать для дальнейшей настройки. Это не отменяет необходимости вручную задавать координаты, но может быть полезно для некоторых сценариев.
Пример, который был изначально предложен в обсуждении, использовал ТабДок.ВывестиСекцию(), что подразумевает наличие макета. Однако, мы можем использовать похожий принцип, создавая "виртуальные" области для вывода. Хотя код из предыдущего варианта является более явным и рекомендованным для "совсем без макета", рассмотрим, как мы могли бы использовать более общие подходы к форматированию после получения области.
// ... (начало кода, как в Варианте 1: инициализация ТабДок) ...
// Пример использования Области.Получить для настройки существующей области (или новой)
// Допустим, мы уже вывели заголовок
ОбластьЗаголовка = ТабДок.Области.Получить(1, 1, 1, 3); // Получаем ранее выведенную область
Если ОбластьЗаголовка <> Неопределено Тогда
ОбластьЗаголовка.ЦветТекста = Новый Цвет(255, 0, 0); // Изменим цвет текста на красный
ОбластьЗаголовка.Текст = "СПИСОК ТОВАРОВ (изменено)";
КонецЕсли;
// Этот подход более актуален для настройки уже существующих областей или
// динамического изменения внешнего вида после первоначального вывода.
// ... (остальной код, как в Варианте 1: вывод заголовков колонок и данных) ...
ТабДок.Показать();
В данном контексте, для создания областей "с нуля" без макета, мы продолжаем использовать ТабДок.Области.Добавить(), так как именно этот метод позволяет нам явно указать координаты и создать новую область в документе. Метод Получить() более полезен, если мы хотим работать с уже существующими областями (например, теми, что были программно созданы ранее, но которым нужно дополнительное форматирование).
Мы уже рассмотрели базовые аспекты форматирования, такие как установка шрифта, его размера, жирности, а также выравнивание и границы ячеек. Давайте углубимся в дополнительные возможности, которые мы можем применять для создания более выразительных и читаемых отчетов, что является частью продвинутой работы с объектом ТабличныйДокумент.
Мы можем изменить цвет текста с помощью свойства ЦветТекста и цвет фона ячейки с помощью ЦветФона. Оба свойства принимают объект Новый Цвет(), которому мы передаем значения RGB.
ОбластьЯчейки.ЦветТекста = Новый Цвет(0, 0, 255); // Синий текст
ОбластьЯчейки.ЦветФона = Новый Цвет(240, 248, 255); // Легкий голубой фон
Если нам нужно объединить несколько ячеек в одну, мы используем метод Объединить() объекта ТабличныйДокумент или задаем координаты при создании области.
// Объединение ячеек в уже созданном табличном документе
ТабДок.Объединить(СтрокаНачало, КолонкаНачало, СтрокаКонец, КолонкаКонец);
// Например, для объединения ячеек A1, B1, C1:
ТабДок.Объединить(1, 1, 1, 3); // Объединит ячейки с 1-й строки 1-й колонки до 1-й строки 3-й колонки
Для изменения ориентации текста в ячейке мы можем использовать свойство ОриентацияТекста.
ОбластьЯчейки.ОриентацияТекста = ОриентацияТекста.Вертикально; // Текст будет располагаться вертикально
// Другие варианты: ОриентацияТекста.ПоГоризонтали, ОриентацияТекста.СнизуВверх
Помимо жирности и размера, мы можем настроить курсив, подчеркивание и другие параметры шрифта.
ОбластьЯчейки.Шрифт.ИмяШрифта = "Arial";
ОбластьЯчейки.Шрифт.Курсив = Истина;
ОбластьЯчейки.Шрифт.Подчеркивание = ТипПодчеркиванияШрифта.Одинарное;
Иногда полезно настроить автоматическую подгонку ширины колонок или высоты строк.
// Устанавливаем автоширину для всех колонок
ТабДок.АвтоМасштаб = Истина;
ТабДок.АвтоШиринаКолонок = Истина;
// Можно также установить конкретную ширину для колонки
ТабДок.УстановитьШиринуКолонки(2, 20); // Установить ширину 2-й колонки в 20 символов
Применяя эти свойства к создаваемым областям и их ячейкам, мы можем достичь практически любого желаемого внешнего вида табличного документа. Главное — помнить, что все эти настройки применяются к объекту ОбластьЯчеекТабличногоДокумента или непосредственно к Ячейке, а затем эта область выводится с помощью ТабДок.Вывести().
Мы рассмотрели подробный подход к программному формированию табличного документа в 1С без использования макетов. Этот метод дает нам полный контроль над каждым аспектом вывода, от расположения данных до их форматирования. Используя объекты ТабличныйДокумент, ОбластьЯчеекТабличногоДокумента и их многочисленные свойства, мы можем создавать динамические и сложные печатные формы, идеально соответствующие нашим требованиям.
Ключевыми моментами, которые нам следует запомнить, являются:
ТабличныйДокумент для формирования новой формы.ТабДок.ВысотаТаблицы + 1 для определения следующей свободной строки для вывода новых данных.ТабДок.Области.Добавить(Имя, СтрокаНачало, КолонкаНачало, СтрокаКонец, КолонкаКонец) является основным для создания новых областей.Область.Ячейки[НомерКолонки] или напрямую к свойствам самой области.ТабДок.Вывести(Область) после настройки каждой области и ТабДок.Показать() в конце для отображения результата.С практикой вы обнаружите, что программное управление табличным документом является мощным инструментом в арсенале разработчика 1С, позволяющим решать самые нестандартные задачи по формированию печатных форм.