При работе в конфигурациях на базе 1С:Предприятие 8.3 (например, Бухгалтерия предприятия 3.0) часто возникает задача программной выгрузки данных документа в файл формата .xlsx или .mxl. На управляемых формах эта задача требует понимания разделения контекста между клиентом и сервером. Разберем подробно, как реализовать этот процесс, начиная от формирования таблицы и заканчивая сохранением файла на диск пользователя.
Первым делом нам необходимо создать объект ТабличныйДокумент и заполнить его данными. Поскольку макеты документов хранятся в объектах метаданных, а управляемая форма работает с данными через реквизиты, нам потребуется выполнить переход от реквизита формы к самому объекту. Рассмотрим ситуацию, когда макет находится внутри того же документа, данные которого мы выгружаем.
Для получения макета в модуле формы используется метод РеквизитФормыВЗначение(). Проанализируем пример кода на стороне сервера:
&НаСервере
Функция СформироватьТабличныйДокументНаСервере()
// Получаем объект документа из реквизита формы "Объект"
ДокОбъект = РеквизитФормыВЗначение("Объект");
// Получаем макет по имени
Макет = ДокОбъект.ПолучитьМакет("МакетВыгрузки");
// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;
// Получаем области макета (Шапка, Строка, Подвал)
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Заполняем параметры шапки
ОбластьШапка.Параметры.ДатаВыгрузки = ТекущаяДата();
ОбластьШапка.Параметры.НомерДокумента = ДокОбъект.Номер;
// Выводим шапку в итоговый документ
ТабДок.Вывести(ОбластьШапка);
// Обходим табличную часть документа (или результат запроса)
Для Каждого СтрокаТЧ Из ДокОбъект.Товары Цикл
// Заполняем параметры строки из данных выборки
ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);
// Выводим строку
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Возврат ТабДок;
КонецФункции
В этом примере мы использовали метод Вывести(), который последовательно добавляет области макета в итоговую таблицу. Важно помнить, что ТабличныйДокумент является универсальным контейнером, который в дальнейшем можно сохранить в разные форматы.
Метод Записать() объекта ТабличныйДокумент выполняется на сервере. Если мы просто укажем путь C:\Temp\file.xlsx, файл сохранится на жестком диске сервера (там, где установлена служба 1С). Чтобы файл попал к пользователю на его локальный компьютер, необходимо передать данные с сервера на клиент через Временное хранилище.
Рассмотрим алгоритм передачи файла:
ТабличныйДокумент во временный файл во временном каталоге сервера.Посмотрим на программную реализацию этой логики:
&НаКлиенте
Процедура ВыгрузитьВФайл(Команда)
// 1. Формируем документ на сервере и получаем адрес во временном хранилище
РезультатВыгрузки = СформироватьИПоместитьВоХранилище();
// 2. Настраиваем диалог сохранения файла
ПараметрыПолучения = Новый ПараметрыПолученияФайлаССервера;
ПараметрыПолучения.Заголовок = "Выберите путь для сохранения выгрузки";
// 3. Передаем файл пользователю (современный асинхронный метод)
НачатьПолучениеФайлаССервера(РезультатВыгрузки.Адрес, РезультатВыгрузки.ИмяФайла, ПараметрыПолучения);
КонецПроцедуры
&НаСервере
Функция СформироватьИПоместитьВоХранилище()
ТабДок = СформироватьТабличныйДокументНаСервере();
// Генерируем уникальное имя временного файла на сервере
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
// Записываем табличный документ в формате XLSX
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
// Помещаем данные файла в хранилище
ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
// Удаляем временный файл с сервера после прочтения в память
УдалитьФайлы(ИмяФайла);
Возврат Новый Структура("Адрес, ИмяФайла", АдресХранилища, "Выгрузка_Документа.xlsx");
КонецФункции
Если структура выгрузки сложная, а данных много, ручное заполнение областей макета может быть трудоемким. В этом случае эффективно использовать Систему компоновки данных (СКД). Выясним, как это работает программно без вывода отчета на форму.
Проанализируем шаги:
ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.Этот способ автоматически берет на себя оформление ячеек, установку типов данных и группировки. Для программиста это означает меньше кода для обработки каждой строки выборки. Вывод через СКД также позволяет пользователю в будущем легко менять состав колонок без правки программного кода.
В конфигурации БП 3.0 встроена Библиотека Стандартных Подсистем (БСП), которая предлагает упрощенные методы для работы с печатью и файлами. Вместо ручного управления временным хранилищем, можно использовать общие модули УправлениеПечатью.
Например, метод УправлениеПечатью.ВывестиТабличныйДокументВФайл() позволяет автоматизировать экспорт. Если же требуется предоставить пользователю выбор формата (PDF, Excel, Word), рекомендуется использовать стандартную подсистему «Печать», которая предоставляет готовые диалоговые окна для сохранения печатных форм в любых поддерживаемых форматах.
Проанализируем несколько технических нюансов, которые помогут избежать ошибок при больших объемах данных:
ТабличныйДокумент может потреблять значительный объем оперативной памяти сервера. В таких случаях рассмотрите выгрузку напрямую в формат CSV через объект ЗаписьТекста.XLSX старайтесь не злоупотреблять сложным оформлением (множество цветов, разные шрифты в каждой ячейке), так как это увеличивает размер итогового файла и замедляет процесс открытия в Excel.ТабДок.Защита = Истина; перед записью.Таким образом, мы рассмотрели полный цикл реализации задачи: от получения макета в контексте управляемой формы до безопасной передачи готового файла Excel на компьютер пользователя. Комбинируя методы работы с областями макета и механизмы временного хранилища, вы сможете реализовать гибкую и надежную систему выгрузки данных.