Как программно создать и заполнить внешний табличный документ в 1С:Предприятие 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с системой 1С:Предприятие 8.3 часто возникает необходимость программного формирования различных отчетов, печатных форм или просто табличных данных, которые не являются частью стандартных отчетов конфигурации. В таких случаях мы используем объект ТабличныйДокумент, который позволяет нам создавать и манипулировать табличными данными, а затем выводить их на печать или сохранять в файл. Понимание того, как развивалась объектная модель печатной формы, поможет лучше ориентироваться в современных инструментах платформы. Рассмотрим подробнее, как мы можем программно создать внешний табличный документ и заполнить его необходимыми данными.

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

Основы работы с объектом ТабличныйДокумент

Прежде всего, нам нужно создать экземпляр объекта ТабличныйДокумент. Это будет наш холст, на котором мы будем 'рисовать' нашу таблицу. После создания нам необходимо настроить его основные свойства и затем приступить к заполнению.

Рассмотрим базовый пример создания и вывода пустого табличного документа:


// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;

// Устанавливаем необходимые параметры для печати
// Например, ориентация страницы
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

// Если хотим, можем задать имя файла по умолчанию для сохранения
// ТабДок.ИмяПараметровПечати = "МойОтчет";

// Выводим табличный документ на экран для просмотра
ТабДок.Показать();

Этот простой код уже позволяет нам создать и увидеть пустой табличный документ. Однако наша цель – заполнить его данными.

Программное заполнение ТабличногоДокумента: работа с областями и ячейками

Заполнение табличного документа происходит путем обращения к его ячейкам или областям. Наиболее эффективный способ работы с большими объемами данных – это использование областей. Мы можем определить область, заполнить ее, а затем вывести в табличный документ. Это позволяет нам формировать сложную структуру отчета, используя предопределенные макеты или создавая области 'на лету'.

Рассмотрим пример создания и заполнении табличного документа без использования макета, напрямую формируя области.

Шаг 1: Создание ТабличногоДокумента и определение областей

Начнем с создания экземпляра ТабличныйДокумент и определим, какие области нам потребуются. Для примера, создадим шапку и несколько строк данных.


// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;

// Устанавливаем режим вывода табличного документа, чтобы данные не наслаивались
ТабДок.ВывестиЗаголовок = Ложь; // Отключаем автоматический заголовок

// Задаем ширину колонок, если это необходимо
ТабДок.НастроитьПараметрыСтраницы(1, , , , , , , , , , , , );
// Или можно установить ширину отдельных колонок позднее через Область.ШиринаКолонки

// Создаем области для шапки и для строки данных
ОбластьЗаголовок = ТабДок.Области.Добавить("Заголовок");
ОбластьДанные    = ТабДок.Области.Добавить("Данные");

Мы создали две именованные области: "Заголовок" и "Данные". Теперь нам нужно задать их размеры и свойства.

Шаг 2: Установка размеров и параметров областей

Для каждой области нам необходимо определить ее границы – количество строк и колонок, которые она будет занимать. А также установить параметры ячеек, такие как текст, шрифт, цвет и выравнивание.


// Устанавливаем размеры для области 'Заголовок' (1 строка, 2 колонки)
ОбластьЗаголовок.ОбластьПоГоризонтали.КонецКолонки = 2;
ОбластьЗаголовок.ОбластьПоГоризонтали.КонецСтроки  = 1;

// Задаем текст в ячейках заголовка
// Первая ячейка заголовка
ОбластьЗаголовок.Ячейки.Найти(1, 1).Текст = "Наименование";
ОбластьЗаголовок.Ячейки.Найти(1, 1).Шрифт = Новый Шрифт("Arial", 10, Истина); // Жирный
ОбластьЗаголовок.Ячейки.Найти(1, 1).ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;

// Вторая ячейка заголовка
ОбластьЗаголовок.Ячейки.Найти(1, 2).Текст = "Количество";
ОбластьЗаголовок.Ячейки.Найти(1, 2).Шрифт = Новый Шрифт("Arial", 10, Истина);
ОбластьЗаголовок.Ячейки.Найти(1, 2).ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;

// Устанавливаем размеры для области 'Данные' (1 строка, 2 колонки)
ОбластьДанные.ОбластьПоГоризонтали.КонецКолонки = 2;
ОбластьДанные.ОбластьПоГоризонтали.КонецСтроки  = 1;

// Задаем шрифты для ячеек данных (пока пустые, но с форматированием)
ОбластьДанные.Ячейки.Найти(1, 1).Шрифт = Новый Шрифт("Arial", 10);
ОбластьДанные.Ячейки.Найти(1, 2).Шрифт = Новый Шрифт("Arial", 10);
ОбластьДанные.Ячейки.Найти(1, 2).ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право; // Числа обычно справа

В этом примере мы вручную задали размеры областей и настроили свойства каждой ячейки внутри них. Обратите внимание, что мы используем ОбластьПоГоризонтали.КонецКолонки и КонецСтроки для задания размеров. Для доступа к конкретной ячейке используется метод Ячейки.Найти(Строка, Колонка).

Шаг 3: Вывод областей в ТабличныйДокумент

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


// Выводим заголовок
ТабДок.Вывести(ОбластьЗаголовок);

// Пример данных для заполнения
ДанныеСтрок = Новый Массив;
ДанныеСтрок.Добавить(Новый Структура("Наименование, Количество", "Товар А", 10));
ДанныеСтрок.Добавить(Новый Структура("Наименование, Количество", "Товар Б", 25));
ДанныеСтрок.Добавить(Новый Структура("Наименование, Количество", "Товар В", 5));

// Заполняем и выводим строки данных
Для Каждого СтрокаДанных Из ДанныеСтрок Цикл
    ОбластьДанные.Ячейки.Найти(1, 1).Текст = СтрокаДанных.Наименование;
    ОбластьДанные.Ячейки.Найти(1, 2).Текст = СтрокаДанных.Количество;
    ТабДок.Вывести(ОбластьДанные);
КонецЦикла;

// В конце выводим документ на экран
ТабДок.Показать();

Таким образом, мы сначала выводим заголовок, а затем в цикле заполняем область данных значениями из подготовленного массива и выводим ее для каждой строки.

Альтернативный подход: использование ПараметровОбласти и Шаблонов

Вместо того чтобы вручную задавать текст каждой ячейки, мы можем использовать параметры областей. Этот подход особенно удобен, если у нас есть шаблонная область, которую мы хотим заполнять различными данными. Для этого мы должны задать в тексте ячеек имена параметров в квадратных скобках (например, [Параметр1]).

Шаг 1: Создание областей с параметрами

Допустим, наша область данных будет выглядеть так, как если бы мы ее создавали через макет:


// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;

// Создаем области. Здесь мы не задаем их размеры, а заполняем текст напрямую,
// предполагая, что они будут иметь 1 строку и 2 колонки
// В реальной жизни эти области могут быть прочитаны из макета
ОбластьЗаголовок = ТабДок.ПолучитьОбласть("1:1", "C1"); // Заголовок на 1 строку, 3 колонки (если это 'C')
ОбластьДанные = ТабДок.ПолучитьОбласть("2:2", "C2"); // Строка данных

// Если мы формируем области 'на лету', как ранее:
// ОбластьЗаголовок = ТабДок.Области.Добавить("Заголовок");
// ОбластьЗаголовок.Ячейки.Найти(1, 1).Текст = "Название";
// ОбластьЗаголовок.Ячейки.Найти(1, 2).Текст = "Значение";

// Если мы используем параметры, то текст ячеек области данных будет таким:
// ОбластьДанные = ТабДок.Области.Добавить("Данные");
// ОбластьДанные.Ячейки.Найти(1, 1).Текст = "[Наименование]";
// ОбластьДанные.Ячейки.Найти(1, 2).Текст = "[Количество]";

// Для примера выше, где области не задаются через GetArea(), а создаются динамически:
ОбластьЗаголовок = ТабДок.Области.Добавить("Шапка");
ОбластьШапкаЯчейка1 = ОбластьЗаголовок.Ячейки.Добавить(1, 1);
ОбластьШапкаЯчейка1.Текст = "Наименование";
ОбластьШапкаЯчейка1.Шрифт = Новый Шрифт("Arial", 10, Истина);

ОбластьШапкаЯчейка2 = ОбластьЗаголовок.Ячейки.Добавить(1, 2);
ОбластьШапкаЯчейка2.Текст = "Количество";
ОбластьШапкаЯчейка2.Шрифт = Новый Шрифт("Arial", 10, Истина);

// Создаем область данных
ОбластьДанные = ТабДок.Области.Добавить("Строка");
ОбластьДанныеЯчейка1 = ОбластьДанные.Ячейки.Добавить(1, 1);
ОбластьДанныеЯчейка1.Текст = "[Наименование]"; // Используем параметр
ОбластьДанныеЯчейка1.Шрифт = Новый Шрифт("Arial", 10);

ОбластьДанныеЯчейка2 = ОбластьДанные.Ячейки.Добавить(1, 2);
ОбластьДанныеЯчейка2.Текст = "[Количество]"; // Используем параметр
ОбластьДанныеЯчейка2.Шрифт = Новый Шрифт("Arial", 10);

Здесь мы создали области и в ячейках области данных указали имена параметров в квадратных скобках. Эти параметры будут автоматически заменены значениями при выводе области.

Шаг 2: Заполнение параметров области и вывод

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


ТабДок.Вывести(ОбластьЗаголовок); // Выводим шапку

ДанныеСтрок = Новый Массив;
ДанныеСтрок.Добавить(Новый Структура("Наименование, Количество", "Элемент 1", 100));
ДанныеСтрок.Добавить(Новый Структура("Наименование, Количество", "Элемент 2", 200));

Для Каждого СтрокаДанных Из ДанныеСтрок Цикл
    // Заполняем параметры области 'Данные'
    ОбластьДанные.Параметры.Наименование = СтрокаДанных.Наименование;
    ОбластьДанные.Параметры.Количество  = СтрокаДанных.Количество;
    ТабДок.Вывести(ОбластьДанные);
КонецЦикла;

ТабДок.Показать();

Использование Область.Параметры.ИмяПараметра = Значение значительно упрощает код, особенно при работе с повторяющимися строками, где меняются только данные, но не структура.

Работа с макетами ТабличногоДокумента

Самый распространенный и гибкий способ формирования табличных документов – это использование макетов. В качестве основы для разработки можно взять корректный пример внешней печатной формы на БСП, который демонстрирует актуальные стандарты работы с областями и подписями — упростить добавление логотипов и факсимиле поможет вывод изображений и факсимиле в печатные формы. Макеты позволяют нам визуально создавать структуру отчета в режиме конфигуратора или во внешней таблице (например, Excel), а затем программно заполнять его данными.

Разберем основные шаги работы с макетом:

  1. Создание макета в конфигураторе.
  2. Разметка областей в макете.
  3. Программное получение макета и областей.
  4. Заполнение параметров областей.
  5. Вывод областей в табличный документ.

Шаг 1: Подготовка макета

Мы должны создать макет в конфигураторе (например, для обработки или отчета) и разметить его. Например, у нас есть макет с областями "Шапка", "СтрокаДеталей", "Итоги".

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

Шаг 2: Программное получение макета и областей


// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;

// Получаем макет из обработки или отчета
Макет = ПолучитьМакет("МойМакетОтчета"); // 'МойМакетОтчета' - это имя макета в конфигураторе

// Получаем области из макета
ОбластьШапка       = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрокаДеталей = Макет.ПолучитьОбласть("СтрокаДеталей");
ОбластьИтоги       = Макет.ПолучитьОбласть("Итоги");

Мы используем метод ПолучитьМакет() для получения объекта макета, а затем Макет.ПолучитьОбласть() для извлечения именованных областей.

Шаг 3: Заполнение параметров областей и вывод

Теперь мы можем заполнять параметры каждой области и выводить их в табличный документ.


// Заполняем параметры шапки
ОбластьШапка.Параметры.ДатаОтчета = Формат(ТекущаяДата(), "ДЛФ=DD"); // Например, текущая дата
ТабДок.Вывести(ОбластьШапка);

// Пример данных (полученных из запроса или других источников)
ДанныеПродаж = Новый Массив;
ДанныеПродаж.Добавить(Новый Структура("Номенклатура, Количество, Цена, Сумма", "Мышь", 5, 250, 1250));
ДанныеПродаж.Добавить(Новый Структура("Номенклатура, Количество, Цена, Сумма", "Клавиатура", 2, 800, 1600));
ДанныеПродаж.Добавить(Новый Структура("Номенклатура, Количество, Цена, Сумма", "Монитор", 1, 5000, 5000));

ОбщаяСумма = 0;

Для Каждого СтрокаПродажи Из ДанныеПродаж Цикл
    // Заполняем параметры строки деталей
    ОбластьСтрокаДеталей.Параметры.Номенклатура = СтрокаПродажи.Номенклатура;
    ОбластьСтрокаДеталей.Параметры.Количество  = СтрокаПродажи.Количество;
    ОбластьСтрокаДеталей.Параметры.Цена        = СтрокаПродажи.Цена;
    ОбластьСтрокаДеталей.Параметры.Сумма       = СтрокаПродажи.Сумма;
    ТабДок.Вывести(ОбластьСтрокаДеталей);
    ОбщаяСумма = ОбщаяСумма + СтрокаПродажи.Сумма;
КонецЦикла;

// Заполняем параметры итогов
ОбластьИтоги.Параметры.ОбщаяСумма = ОбщаяСумма;
ТабДок.Вывести(ОбластьИтоги);

// В конце выводим документ на экран
ТабДок.Показать();

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

Дополнительные возможности и настройки ТабличногоДокумента

Объект ТабличныйДокумент предоставляет множество возможностей для тонкой настройки внешнего вида и поведения:

  1. Объединение ячеек: Используйте метод Объединить() для слияния нескольких ячеек в одну. Например, ТабДок.Объединить(1, 1, 1, 2) объединит ячейки (1,1) и (1,2).
  2. Границы ячеек: Свойства ГраницаСверху, ГраницаСнизу, ГраницаСлева, ГраницаСправа для настройки стилей границ. Например, Ячейка.ГраницаСнизу = Новый Линия(ТипЛинии.Тонкая).
  3. Выравнивание: Свойства ГоризонтальноеПоложение и ВертикальноеПоложение для выравнивания текста в ячейке.
  4. Шрифты и цвета: Используйте объекты Шрифт и Цвет для настройки текста. Например, Ячейка.Шрифт = Новый Шрифт("Arial", 12, Истина) или Ячейка.ЦветТекста = Новый Цвет(255, 0, 0).
  5. Режимы печати: Свойства ОриентацияСтраницы, АвтоМасштаб, ВыводитьЗаголовок и ПовторятьПриПечатиСтроки для настройки поведения при печати. Если вы создаете инструкции или брошюры, вам может пригодиться печать книжкой.
  6. Сохранение и открытие: Методы Записать() для сохранения в файл различных форматов (PDF, Excel, HTML) и Прочитать() для открытия из файла.
  7. Параметры печати: Используйте ТабДок.ПараметрыПечати для более детальной настройки.

Разберем пример кода, который демонстрирует использование некоторых из этих дополнительных возможностей:


// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;

// Создаем области "на лету"
ОбластьЗаголовок = ТабДок.Области.Добавить("Заголовок");
ОбластьЗаголовок.Ячейки.Добавить(1, 1).Текст = "Мой Отчет";
ОбластьЗаголовок.Ячейки.Добавить(1, 2); // Пустая ячейка для объединения
// Объединяем ячейки заголовка
ТабДок.Объединить(ТабДок.ВысотаТаблицы + 1, 1, ТабДок.ВысотаТаблицы + 1, 2); // Объединяем текущую строку, колонки 1 и 2
ОбластьЗаголовок.Ячейки.Найти(1, 1).ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
ОбластьЗаголовок.Ячейки.Найти(1, 1).Шрифт = Новый Шрифт("Arial", 14, Истина); // Жирный шрифт

ТабДок.Вывести(ОбластьЗаголовок);

// Область для шапки таблицы
ОбластьШапкаТаблицы = ТабДок.Области.Добавить("ШапкаТаблицы");
ОбластьШапкаТаблицыЯчейка1 = ОбластьШапкаТаблицы.Ячейки.Добавить(1, 1);
ОбластьШапкаТаблицыЯчейка1.Текст = "Продукт";
ОбластьШапкаТаблицыЯчейка1.Шрифт = Новый Шрифт("Arial", 10, Истина);
ОбластьШапкаТаблицыЯчейка1.ГраницаСверху = Новый Линия(ТипЛинии.Тонкая);
ОбластьШапкаТаблицыЯчейка1.ГраницаСнизу = Новый Линия(ТипЛинии.Тонкая);
ОбластьШапкаТаблицыЯчейка1.ГраницаСлева = Новый Линия(ТипЛинии.Тонкая);

ОбластьШапкаТаблицыЯчейка2 = ОбластьШапкаТаблицы.Ячейки.Добавить(1, 2);
ОбластьШапкаТаблицыЯчейка2.Текст = "Цена";
ОбластьШапкаТаблицыЯчейка2.Шрифт = Новый Шрифт("Arial", 10, Истина);
ОбластьШапкаТаблицыЯчейка2.ГраницаСверху = Новый Линия(ТипЛинии.Тонкая);
ОбластьШапкаТаблицыЯчейка2.ГраницаСнизу = Новый Линия(ТипЛинии.Тонкая);
ОбластьШапкаТаблицыЯчейка2.ГраницаСправа = Новый Линия(ТипЛинии.Тонкая);

ТабДок.Вывести(ОбластьШапкаТаблицы);

// Область для данных таблицы
ОбластьДанныхТаблицы = ТабДок.Области.Добавить("ДанныеТаблицы");
ОбластьДанныхТаблицыЯчейка1 = ОбластьДанныхТаблицы.Ячейки.Добавить(1, 1);
ОбластьДанныхТаблицыЯчейка1.Текст = "[Продукт]";
ОбластьДанныхТаблицыЯчейка1.ГраницаСлева = Новый Линия(ТипЛинии.Тонкая);
ОбластьДанныхТаблицыЯчейка1.ГраницаСнизу = Новый Линия(ТипЛинии.Тонкая);

ОбластьДанныхТаблицыЯчейка2 = ОбластьДанныхТаблицы.Ячейки.Добавить(1, 2);
ОбластьДанныхТаблицыЯчейка2.Текст = "[Цена]";
ОбластьДанныхТаблицыЯчейка2.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право;
ОбластьДанныхТаблицыЯчейка2.ГраницаСправа = Новый Линия(ТипЛинии.Тонкая);
ОбластьДанныхТаблицыЯчейка2.ГраницаСнизу = Новый Линия(ТипЛинии.Тонкая);

ДанныеДляОтчета = Новый Массив;
ДанныеДляОтчета.Добавить(Новый Структура("Продукт, Цена", "Мыло", 50));
ДанныеДляОтчета.Добавить(Новый Структура("Продукт, Цена", "Шампунь", 150));
ДанныеДляОтчета.Добавить(Новый Структура("Продукт, Цена", "Зубная паста", 120));

Для Каждого Строка Из ДанныеДляОтчета Цикл
    ОбластьДанныхТаблицы.Параметры.Продукт = Строка.Продукт;
    ОбластьДанныхТаблицы.Параметры.Цена    = Строка.Цена;
    ТабДок.Вывести(ОбластьДанныхТаблицы);
КонецЦикла;

// Настройка страницы перед показом
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.МасштабПечати = 100; // Процент масштаба
ТабДок.ПолеСлева = 10; // В мм
ТабДок.ПолеСправа = 10;
ТабДок.ПолеСверху = 15;
ТабДок.ПолеСнизу = 15;

// Показ табличного документа
ТабДок.Показать();

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

Важные моменты и рекомендации

Программное создание и заполнение табличных документов является мощным инструментом в арсенале разработчика 1С. Освоив эти методы, мы сможем генерировать разнообразные отчеты и печатные формы, идеально соответствующие нашим бизнес-потребностям.

← На главную