Когда мы сталкиваемся с необходимостью экспорта данных из табличной части документа 1С в формат Excel, особенно в управляемых формах и без привлечения сторонних внешних компонент, перед нами встает задача программной работы с объектом ТабличныйДокумент. Этот объект предоставляет мощные возможности для формирования печатных форм и их последующего сохранения в различные форматы, включая Excel. Мы подробно разберем, как реализовать такую выгрузку, а также упомянем готовые инструменты для сохранения данных табличных частей форм в Excel. Рассмотрим различные подходы к формированию заголовков, шапки таблицы и данных, уделяя внимание форматированию.
Давайте вместе выясним, как программно создать Excel-файл, содержащий шапку отчета, информацию о документе и данные из табличной части, обеспечив при этом нужный внешний вид.
В основе программной выгрузки в Excel лежит объект ТабличныйДокумент. Мы можем программно заполнить его ячейки текстом, числами, применить необходимое форматирование и затем сохранить в нужный файл. Этот подход позволяет полностью контролировать структуру и внешний вид конечного файла Excel.
ТабличныйДокумент: Первым шагом всегда будет создание нового экземпляра объекта ТабличныйДокумент.
ТабДок = Новый ТабличныйДокумент;
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ДОКУМЕНТА_РЕАЛИЗАЦИЯ"; // Опционально, для сохранения настроек печати
Мы инициализируем новый табличный документ, который будет выступать в качестве контейнера для наших данных перед экспортом. Свойство ИмяПараметровПечати используется, если необходимо сохранять или восстанавливать настройки печати, но для простой выгрузки это не всегда критично.
ТабличногоДокумента, мы используем метод Записать() для сохранения его в файл нужного формата.
ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогСохраненияФайла.Заголовок = "Сохранить отчет";
ДиалогСохраненияФайла.ПолноеИмяФайла = "Реализация_" + СсылкаНаДокумент.Номер + ".xlsx"; // Предлагаемое имя файла
ДиалогСохраненияФайла.Фильтр = "Файлы Excel (*.xlsx)|*.xlsx|Все файлы (*.*)|*.*";
Если ДиалогСохраненияФайла.Выбрать() Тогда
ПолноеИмяФайла = ДиалогСохраненияФайла.ПолноеИмяФайла;
ТабДок.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Сообщить("Отчет успешно сохранен в " + ПолноеИмяФайла);
Иначе
Сообщить("Сохранение отчета отменено.");
КонецЕсли;
Мы используем объект ДиалогВыбораФайла, чтобы дать пользователю возможность выбрать путь и имя файла для сохранения. Затем метод Записать() экспортирует содержимое ТабличногоДокумента в указанный файл, используя тип ТипФайлаТабличногоДокумента.XLSX для современного формата Excel.
Один из самых гибких и удобных способов формирования сложных отчетов в 1С — это использование макетов. Этот метод идеально подходит, если вам нужно создать корректный пример внешней печатной формы на БСП, где важно соблюсти структуру и оформление. Макет представляет собой шаблон, который мы создаем в конфигураторе и который содержит предопределенные области с уже настроенным форматированием.
Например, в области "Заголовок" можно разместить текст "Отчет по реализации товаров и услуг" и параметр [ТекстДокумента]. В области "Шапка" — заголовки колонок "Номенклатура", "Количество", "Цена", "Сумма". А в области "СтрокаДанных" — параметры [НоменклатураНаименование], [Количество], [Цена], [Сумма].
ТабличногоДокумента с использованием макета: Теперь, когда макет готов, мы можем использовать его для вывода данных.
Макет = ПолучитьМакет("МакетДляВыгрузки"); // Предполагаем, что имя макета 'МакетДляВыгрузки'
ТабДок = Новый ТабличныйДокумент;
// Вывод заголовка
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьЗаголовок.Параметры.ТекстДокумента = "Отчет по реализации товаров и услуг"; // Заполняем параметр макета
ОбластьЗаголовок.Параметры.ДокументНомер = СсылкаНаДокумент.Номер;
ОбластьЗаголовок.Параметры.ДокументДата = Формат(СсылкаНаДокумент.Дата, "ДФ=dd.MM.yyyy");
ТабДок.Вывести(ОбластьЗаголовок);
// Вывод шапки таблицы
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапкаТаблицы);
// Вывод данных из табличной части
ОбластьСтроки = Макет.ПолучитьОбласть("СтрокаДанных");
Для Каждого СтрокаТЧ Из СсылкаНаДокумент.Товары Цикл
ОбластьСтроки.Параметры.НоменклатураНаименование = СтрокаТЧ.Номенклатура.Наименование;
ОбластьСтроки.Параметры.Количество = СтрокаТЧ.Количество;
ОбластьСтроки.Параметры.Цена = СтрокаТЧ.Цена;
ОбластьСтроки.Параметры.Сумма = СтрокаТЧ.Сумма;
ТабДок.Вывести(ОбластьСтроки);
КонецЦикла;
// Далее код сохранения ТабДок в файл Excel, как показано выше
// ...
Мы используем метод ПолучитьМакет() для получения ссылки на наш макет. Заполнение параметров и вывод областей обеспечивают чистоту кода и легкость в модификации внешнего вида отчета, поскольку все изменения форматирования вносятся непосредственно в макет.
Иногда структура отчета полностью динамическая, и создание макета может быть неудобным. В таких случаях мы формируем весь ТабличныйДокумент программно. Такой подход часто используется в специализированных задачах, например, когда выполняется выгрузка журнала регистрации в Excel с группировкой по сложным критериям.
Этот способ дает максимальный контроль над каждой деталью вывода. Мы будем использовать методы объекта ТабличныйДокумент для управления областями и форматированием напрямую. Если же вам требуется расширенная математическая логика в самом файле, стоит изучить использование Python при выгрузке в Excel с формулами, но для большинства задач достаточно встроенных средств 1С.
ТабличногоДокумента и заголовков: Мы начинаем с создания экземпляра ТабличногоДокумента и сразу приступаем к формированию заголовка отчета.
ТабДок = Новый ТабличныйДокумент;
// Заголовок отчета
ОбластьЗаголовок = ТабДок.Области.ПолучитьОбласть(1, 1, 1, 4); // Строка 1, колонки с 1 по 4
ОбластьЗаголовок.Текст = "Отчет по реализации товаров и услуг";
ОбластьЗаголовок.Шрифт = Новый Шрифт("Arial", 12, Истина); // Жирный, размер 12pt
ОбластьЗаголовок.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
ОбластьЗаголовок.Объединить(); // Объединяем ячейки
ТабДок.Вывести(ОбластьЗаголовок); // Выводим объединенную область в ТабличныйДокумент
// Информация о документе
ОбластьИнфоДокумента = ТабДок.Области.ПолучитьОбласть(2, 1, 2, 4); // Строка 2, колонки с 1 по 4
ОбластьИнфоДокумента.Текст = "Документ № " + СсылкаНаДокумент.Номер + " от " + Формат(СсылкаНаДокумент.Дата, "ДФ=dd.MM.yyyy");
ОбластьИнфоДокумента.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
ОбластьИнфоДокумента.Объединить();
ТабДок.Вывести(ОбластьИнфоДокумента);
// Мы также можем установить ширину колонок для лучшего отображения
ТабДок.УстановитьШиринуКолонки(1, 30); // Ширина первой колонки 30 символов
ТабДок.УстановитьШиринуКолонки(2, 10); // Ширина второй колонки 10 символов
ТабДок.УстановитьШиринуКолонки(3, 15);
ТабДок.УстановитьШиринуКолонки(4, 15);
Здесь мы используем метод ТабДок.Области.ПолучитьОбласть(), чтобы задать свойства текста, шрифта и выравнивания. Также важно настроить ширину колонок с помощью метода УстановитьШиринуКолонки() для оптимального отображения данных.
СтрокаШапки = 4; // Начинаем выводить шапку с 4-й строки
НомераКолонок = Новый Соответствие; // Для удобства определения колонок по их заголовкам
ЗаголовкиКолонокТЧ = Новый Массив;
ЗаголовкиКолонокТЧ.Добавить("Номенклатура");
ЗаголовкиКолонокТЧ.Добавить("Количество");
ЗаголовкиКолонокТЧ.Добавить("Цена");
ЗаголовкиКолонокТЧ.Добавить("Сумма");
Для ИндексКолонки = 0 По ЗаголовкиКолонокТЧ.ВГраница() Цикл
НомерТекущейКолонки = ИндексКолонки + 1;
ТекстЗаголовка = ЗаголовкиКолонокТЧ[ИндексКолонки];
// Получаем область для текущей ячейки шапки
ОбластьЯчейкиШапки = ТабДок.Области.ПолучитьОбласть(СтрокаШапки, НомерТекущейКолонки, СтрокаШапки, НомерТекущейКолонки);
ОбластьЯчейкиШапки.Текст = ТекстЗаголовка;
ОбластьЯчейкиШапки.Шрифт = Новый Шрифт("Arial", 10, Истина); // Жирный, 10pt
ОбластьЯчейкиШапки.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
ОбластьЯчейкиШапки.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
// Устанавливаем границы для ячейки
ОбластьЯчейкиШапки.ГраницаСлева = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьЯчейкиШапки.ГраницаСверху = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьЯчейкиШапки.ГраницаСправа = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьЯчейкиШапки.ГраницаСнизу = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ТабДок.Вывести(ОбластьЯчейкиШапки); // Выводим ячейку в ТабличныйДокумент
НомераКолонок.Вставить(ТекстЗаголовка, НомерТекущейКолонки); // Сохраняем номера колонок для данных
КонецЦикла;
Для каждой колонки мы устанавливаем границы с помощью объектов Линия. Объект Соответствие помогает нам в дальнейшем точно определять, в какую колонку выводить данные.
ТекущаяСтрокаДанных = СтрокаШапки + 1; // Данные начинаем выводить со следующей строки после шапки
Для Каждого СтрокаТЧ Из СсылкаНаДокумент.Товары Цикл
// Вывод Номенклатуры
ОбластьЯчейкиДанных = ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДанных, НомераКолонок.Получить("Номенклатура"));
ОбластьЯчейкиДанных.Текст = СтрокаТЧ.Номенклатура.Наименование;
// Применяем те же границы, что и для шапки
ОбластьЯчейкиДанных.ГраницаСлева = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьЯчейкиДанных.ГраницаСверху = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьЯчейкиДанных.ГраницаСправа = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьЯчейкиДанных.ГраницаСнизу = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ТабДок.Вывести(ОбластьЯчейкиДанных);
// Вывод Количества
ОбластьЯчейкиДанных = ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДанных, НомераКолонок.Получить("Количество"));
ОбластьЯчейкиДанных.Текст = СтрокаТЧ.Количество;
ОбластьЯчейкиДанных.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право; // Числовые данные обычно выравниваются по правому краю
ОбластьЯчейкиДанных.ГраницаСлева = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьЯчейкиДанных.ГраницаСверху = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьЯчейкиДанных.ГраницаСправа = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ОбластьЯчейкиДанных.ГраницаСнизу = Новый Линия(ТипЛинииТабличногоДокумента.Тонкая);
ТабДок.Вывести(ОбластьЯчейкиДанных);
// Аналогично для Цены и Суммы...
ТекущаяСтрокаДанных = ТекущаяСтрокаДанных + 1;
КонецЦикла;
Мы проходим по каждой строке табличной части, задаем выравнивание для числовых значений и применяем границы. После этого выводим каждую ячейку в ТабличныйДокумент.
ТабДок.НачатьВывод() и ТабДок.ЗакончитьВывод(): Помогают ускорить процесс при больших объемах данных.ТабДок.АвтоМасштаб = Истина: Автоматическая подстройка под размер страницы.Формат (например, "ЧЦ=15; ЧДЦ=2") позволяет корректно отображать числа и даты в Excel.Мы рассмотрели два основных подхода к программной выгрузке данных в Excel: с использованием макета и полностью программный способ. Каждый из них имеет свои преимущества. Выбор зависит от сложности задачи, частоты изменений и требований к отчету. В обоих случаях объект ТабличныйДокумент предоставляет все необходимые инструменты для создания качественного файла без использования внешних компонент.