В практике разработчика 1С часто возникает задача автоматизировать выгрузку документов во внешние форматы для обмена с контрагентами или анализа. Одной из наиболее востребованных функций является сохранение печатной формы документа в формате Excel. Рассмотрим подробно, как реализовать этот механизм, с какими трудностями можно столкнуться и как их элегантно обойти.
Представим ситуацию: у нас есть форма (например, внешняя обработка), на которой пользователь выбирает один или несколько документов и нажимает кнопку «Получить файлы». Наша цель — не просто открыть форму печати, а программно перехватить ТабличныйДокумент, который генерирует система, и записать его на диск.
Для решения этой задачи нам необходимо выполнить три основных шага:
ТабличныйДокумент.Записать() для полученного объекта, указав путь и формат файла.Рассмотрим пример кода, который часто используется для документов типа «Заказ клиента» в конфигурациях на базе УТ 11 или ERP:
Для каждого Строка Из СписокВыбранныхДокументов Цикл
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Строка.Значение);
// Получаем структуру типов для корректной работы процедур печати
СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);
СписокОбъектов = Новый СписокЗначений;
СписокОбъектов.Добавить(Строка.Значение);
// Вызываем штатную обработку печати
Результат = Обработки.ПечатьЗаказовНаТоварыУслуги.СформироватьПечатнуюФормуЗаказаКлиента(СтруктураТипов, СписокОбъектов, Новый Структура);
// Сохраняем результат в Excel
ПутьКФайлу = "C:\Reports\Заказ_" + Строка.Значение.Номер + ".xls";
Результат.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLS);
КонецЦикла;
Разберем ситуацию, когда стандартный подход не срабатывает. Например, при попытке вызвать аналогичную функцию для документа СверкаВзаиморасчетов, система может выдать ошибку: «Метод объекта не определен». Проанализируем причину. В 1С логика печати обычно располагается в модуле менеджера документа. Чтобы мы могли вызвать функцию извне (из обработки или другого модуля), она должна быть объявлена с ключевым словом Экспорт.
Если мы откроем модуль менеджера документа СверкаВзаиморасчетов и увидим, что процедура СформироватьПечатнуюФормуАктСверкиВзаиморасчетов не является экспортной, мы не сможем обратиться к ней напрямую через Документы.СверкаВзаиморасчетов.ИмяПроцедуры.
Как поступить в этом случае?
Рассмотрим два варианта решения:
&Вместо или просто добавив свою экспортную функцию-обертку, сделайте функционал печати доступным.В современных конфигурациях (УТ 11, ERP, БП 3.0), построенных на базе Библиотеки стандартных подсистем (БСП), реализован универсальный механизм управления печатью. Вместо поиска конкретных функций в модулях менеджера, проанализируем возможность использования программного интерфейса БСП.
Метод УправлениеПечатью.СформироватьПечатныеФормы позволяет получить коллекцию табличных документов для любого объекта, поддерживающего стандартную печать. Рассмотрим пример использования этого механизма:
// Подготавливаем параметры для БСП
ИмяМенеджераПечати = "Документ.СверкаВзаиморасчетов";
ИменаМакетов = "АктСверки"; // Имя команды печати или макета
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);
ПараметрыПечати = Новый Структура;
// Коллекция, куда БСП сложит результаты
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ИменаМакетов);
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = УправлениеПечатью.ПодготовитьПараметрыВыводаДляПечати();
// Формируем документ
УправлениеПечатью.СформироватьПечатныеФормы(ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// Извлекаем ТабличныйДокумент из коллекции
СтрокаПечатнойФормы = КоллекцияПечатныхФорм[0];
ТабДок = СтрокаПечатнойФормы.ТабличныйДокумент;
// Сохраняем
ТабДок.Записать("C:\Temp\Report.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Выясним причины типичных ошибок, которые возникают при программной выгрузке файлов.
1. Серверный вызов и пути к файлам.
Проанализируем ситуацию: если ваш код выполняется на стороне сервера (а модуль менеджера — это всегда сервер), то путь C:\Users\Username\Desktop будет относиться к файловой системе сервера, а не вашего локального компьютера. Если на сервере такого пути нет или у службы 1С нет прав на запись в эту папку, возникнет ошибка. Рекомендуется использовать временные файлы через ПолучитьИмяВременногоФайла("xlsx"), а затем передавать их на клиент с помощью метода ПолучитьФайл().
2. Выбор формата: XLS или XLSX.
Посмотрим на различия форматов. Старый формат ТипФайлаТабличногоДокумента.XLS имеет жесткое ограничение — не более 65 536 строк. Если вы формируете объемный Акт сверки за несколько лет, программа выдаст ошибку при записи. Всегда отдавайте предпочтение ТипФайлаТабличногоДокумента.XLSX — это современный формат, поддерживающий более миллиона строк и лучше сохраняющий форматирование цветов и шрифтов 1С.
3. Подготовка табличного документа.
Перед записью документа в файл, полезно выполнить несколько косметических операций, чтобы пользователю было удобно работать с файлом Excel:
ТабДок.ТолькоПросмотр = Истина; — защитит файл от случайных изменений.ТабДок.АвтоМасштаб = Истина; — автоматически подгонит ширину документа под лист при печати из Excel.ТабДок.ПолеСверху = 0; (и другие поля) — поможет убрать лишние отступы, которые часто некорректно транслируются в Excel.Рассмотрим ситуацию, когда документов сотни. Если выполнять запись в цикле на клиенте, интерфейс программы «замрет» до окончания процесса. Для оптимизации процесса разберем возможность фонового выполнения задачи. Используйте процедуру ДлительныеОперации.ВыполнитьВФоне, чтобы сервер сформировал все файлы, упаковал их в ZIP-архив и передал вам одну ссылку на скачивание. Это значительно повышает комфорт работы пользователей.
Таким образом, мы выяснили, что для успешного сохранения документа в Excel необходимо правильно определить местонахождение функции печати, убедиться в её доступности (экспортности) и корректно обработать ТабличныйДокумент перед записью, учитывая специфику серверного выполнения кода.