Как программно выгрузить печатную форму в Excel без вывода на экран?

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

При разработке внешних обработок в 1С часто возникает задача автоматической выгрузки сформированных документов во внешние файлы. Классический пример — выгрузка Универсального Передаточного Документа (УПД) в формат Excel. При этом требуется сделать это "тихо", то есть за кадром: не показывая пользователю форму предварительного просмотра 1С, не задействуя интерактивный выбор принтера и не изменяя стандартные механизмы печати в самой конфигурации.

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

Почему не стоит писать собственный алгоритм формирования УПД?

Давайте проанализируем ситуацию. Типовой макет УПД и логика его заполнения в современных конфигурациях (будь то УТ, ERP, КА или БП) чрезвычайно сложны. Стандартный механизм учитывает множество постоянно меняющихся нюансов законодательства: правила заполнения кодов маркировки, прослеживаемость товаров, ставки НДС, сведения о подписантах и обособленных подразделениях. Объем кода, отвечающего за печать УПД, может превышать 5000 строк.

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

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

Шаг 1. Получаем заполненный табличный документ через БСП на сервере

Рассмотрим, как реализовать программный перехват печатной формы. В современных конфигурациях 1С за вывод печатных форм отвечает общий модуль УправлениеПечатью. Мы можем использовать его экспортную функцию СформироватьПечатныеФормы(). Этот метод возвращает коллекцию, из которой мы можем извлечь готовый табличный документ.

Давайте разберем пример серверной функции, которая формирует УПД по ссылке на документ:


Функция ПолучитьТабДокУПД(СсылкаНаДокумент) Экспорт
    
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(СсылкаНаДокумент);
    
    // Определяем параметры для формирования печатной формы
    ИмяМенеджераПечати = "Обработка.ПечатьУПД"; // Менеджер печати может отличаться в вашей конфигурации
    ИменаМакетов = "УниверсальныйПередаточныйДокумент"; // Идентификатор макета УПД
    ПараметрыПечати = Новый Структура; 
    
    // Формируем печатную форму программно через БСП
    КоллекцияПечатныхФорм = УправлениеПечатью.СформироватьПечатныеФормы(
        ИмяМенеджераПечати, 
        ИменаМакетов, 
        МассивОбъектов, 
        ПараметрыПечати
    );
    
    // Извлекаем ТабличныйДокумент из возвращенной коллекции
    СтрокаПечатнойФормы = КоллекцияПечатныхФорм.Найти(ВРег(ИменаМакетов), "ИмяВРЕГ");
    Если СтрокаПечатнойФормы <> Неопределено Тогда
        Возврат СтрокаПечатнойФормы.ТабличныйДокумент;
    КонецЕсли;
    
    Возврат Неопределено;
    
КонецФункции

Использование этого кода решает проблему дублирования алгоритмов печати — система сама сформирует актуальный документ по стандартным правилам вашей информационной базы.

Шаг 2. Сохранение табличного документа в Excel на клиенте

Когда мы получили объект ТабличныйДокумент, его необходимо записать на диск. Здесь важно учитывать разделение выполнения кода на клиентскую и серверную части.

Если запустить метод Записать() на стороне сервера 1С, файл будет сохранен в файловой системе сервера. У рядового пользователя, как правило, нет прямого доступа к серверным каталогам, а у службы, под которой запущен сервер «1С:Предприятия», могут отсутствовать права на запись в сетевые папки. Поэтому лучшей практикой является формирование документа на сервере, его передача во временное хранилище и последующее сохранение на локальный компьютер пользователя на стороне клиента.

Посмотрим на пример реализации этого процесса.

Напишем серверную функцию, которая формирует документ и помещает его во временное хранилище:


&НаСервере
Функция ПодготовитьФайлНаСервере(СсылкаНаДокумент, УникальныйИдентификаторФормы)
    
    ТабДок = ПолучитьТабДокУПД(СсылкаНаДокумент);
    
    Если ТабДок = Неопределено Тогда
        ВызватьИсключение "Не удалось сформировать печатную форму!";
    КонецЕсли;
    
    // Помещаем объект во временное хранилище
    АдресХранилища = ПоместитьВоВременноеХранилище(ТабДок, УникальныйИдентификаторФормы);
    Возврат АдресХранилища;
    
КонецФункции

Теперь создадим клиентскую процедуру, которая запрашивает у пользователя путь сохранения файла и записывает его на диск:


&НаКлиенте
Процедура ВыгрузитьВExcel(Команда)
    
    Если Не ЗначениеЗаполнено(Объект.СсылкаНаДокумент) Тогда
        ПоказатьПредупреждение(, "Пожалуйста, выберите документ!");
        Возврат;
    КонецЕсли;
    
    // Получаем адрес во временном хранилище
    АдресХранилища = ПодготовитьФайлНаСервере(Объект.СсылкаНаДокумент, УникальныйИдентификатор);
    
    // Настраиваем диалог выбора файла для сохранения
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Фильтр = "Файлы Excel (*.xlsx)|*.xlsx";
    Диалог.ПолноеИмяФайла = "УПД_" + СокрЛП(Объект.СсылкаНаДокумент.Номер) + ".xlsx";
    
    Если Диалог.Выбрать() Тогда
        // Получаем объект ТабличныйДокумент из временного хранилища
        ТабДок = ПолучитьИзВременногоХранилища(АдресХранилища);
        
        // Заменяем метод Показать() на Записать() для прямого сохранения
        ТабДок.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
        
        ПоказатьОповещениеПользователя("Успешно", , "Файл сохранен!");
    КонецЕсли;
    
КонецПроцедуры

Шаг 3. Оптимизация разметки для Excel

Часто при автоматической выгрузке таблиц в Excel пользователи жалуются, что документ "разъезжается" по ширине. При попытке отправить файл на печать из Excel он может некорректно разбиваться на множество страниц. Чтобы этого избежать, перед выполнением сохранения на сервере обязательно примените свойства автоматического масштабирования листа:


// Принудительно задаем настройки масштаба страницы перед записью
ТабДок.АвтоМасштаб = Истина; // Позволяет Excel-файлу автоматически укладываться по ширине страницы
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; // Для УПД это стандартный формат
ТабДок.ПолеСлева = 5;
ТабДок.ПолеСправа = 5;
ТабДок.ПолеСверху = 5;
ТабДок.ПолеСнизу = 5;

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

Особенности пакетной выгрузки

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

  1. Выгрузка каждого документа в отдельный файл. Для этого на клиенте запрашивается каталог сохранения (используя режим диалога РежимДиалогаВыбораФайла.ВыборКаталога), а затем в цикле запускается серверная процедура формирования файлов для каждого документа.
  2. Объединение документов на разных листах одного файла Excel. Стандартными средствами платформы 1С напрямую сохранить один табличный документ в файл XLSX с разделением по физическим вкладкам (листам) невозможно. При выводе нескольких табличных документов через метод ВывестиГоризонтальныйРазделительСтраниц() они будут сохранены на одном листе Excel, разделенном разметкой страниц. Если вам критически важно разделение именно по вкладкам, придется использовать внешние COM-объекты (например, COMObject("Excel.Application")), однако учитывайте, что данный метод работает только в среде Windows с предустановленным Microsoft Office.

Рекомендация по формату файлов

Всегда используйте для сохранения формат ТипФайлаТабличногоДокумента.XLSX вместо устаревшего ТипФайлаТабличногоДокумента.XLS. Старый формат Excel 97-2003 накладывает жесткие ограничения на максимальное количество строк (до 65 536) и колонок на одном листе, хуже сжимает файлы, а также может искажать шрифты и границы ячеек, перенесенные из макетов 1С.

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

← На главную