В процессе разработки в среде 1С:Предприятие 8.3 (особенно в конфигурациях на базе БСП, таких как УТ 11, ERP или КА) часто возникает задача автоматизации выгрузки документов. Например, когда необходимо не просто вывести печатную форму на экран, а программно сохранить её в файл формата Excel в определенную папку на сервере или локальном компьютере. Рассмотрим подробно, как реализовать этот механизм, используя типовые возможности подсистемы «Печать».
Для решения задачи нам необходимо пройти три основных этапа:
В современных конфигурациях Управление торговлей 11 крайне не рекомендуется вызывать процедуры печати «напрямую» из модулей менеджера, так как это нарушает логику работы подсистемы «Печать» Библиотеки Стандартных Подсистем (БСП). Правильнее использовать программный интерфейс УправлениеПечатью.
Разберем ситуацию на примере документа «Заказ клиента». Печатные формы для этого документа обычно сосредоточены в обработке ПечатьЗаказовНаТоварыУслуги. Чтобы получить табличный документ программно, нам нужно знать имя менеджера печати и идентификатор команды печати.
Проанализируем следующий программный код, который выполняет основную работу на стороне сервера:
&НаСервере
Функция ПолучитьТабличныйДокументЗаказа(СсылкаНаЗаказ)
// 1. Помещаем ссылку в массив, так как механизм печати всегда работает со списком
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаЗаказ);
// 2. Подготавливаем структуру для параметров печати
ПараметрыПечати = Новый Структура;
// 3. Вызываем метод БСП для формирования печатных форм.
// "Обработка.ПечатьЗаказовНаТоварыУслуги" - это менеджер печати
// "ПФ_MXL_ЗаказКлиента" - это имя макета (идентификатор печатной формы)
РезультатПечати = УправлениеПечатью.СформироватьПечатныеФормы(
"Обработка.ПечатьЗаказовНаТоварыУслуги",
"ПФ_MXL_ЗаказКлиента",
МассивОбъектов,
ПараметрыПечати,
Неопределено
);
// Результат возвращается в виде структуры, где КоллекцияПечатныхФорм - это таблица значений
Если РезультатПечати.КоллекцияПечатныхФорм.Количество() > 0 Тогда
Возврат РезультатПечати.КоллекцияПечатныхФорм[0].ТабличныйДокумент;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Важный момент: идентификатор формы ПФ_MXL_ЗаказКлиента можно подсмотреть в модуле менеджера соответствующего объекта в процедуре ДобавитьКомандыПечати. Именно там регистрируются все доступные формы.
Просто получить ТабличныйДокумент недостаточно. Чтобы файл Excel выглядел презентабельно, мы должны настроить параметры отображения. Выясним, какие свойства наиболее критичны:
АвтоМасштаб: Если установить в Истина, 1С попытается уместить печатную форму в ширину листа Excel.ОриентацияСтраницы: Позволяет избежать разрывов колонок, если форма широкая (например, для ТОРГ-12).ИмяПринтера: Необязательно, но полезно для корректного расчета границ страниц.Рассмотрим пример настройки:
ТабДок = ПолучитьТабличныйДокументЗаказа(ВыбранныйЗаказ);
Если ТабДок <> Неопределено Тогда
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
// Дополнительно можно очистить области печати, если они мешают выгрузке
КонецЕсли;
Для записи документа используется метод Записать(). Здесь важно правильно выбрать ТипФайлаТабличногоДокумента. Рассмотрим два варианта:
Проанализируем код сохранения:
ПутьКФайлу = "C:\Export\ЗаказКлиента.xlsx";
Попытка
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Сообщить("Файл успешно сохранен: " + ПутьКФайлу);
Исключение
Сообщить("Ошибка при сохранении файла: " + ОписаниеОшибки());
КонецПопытки;
Выясним причину частой ошибки: «Ошибка доступа к файлу». Если код выполняется в контексте &НаСервере, то путь C:\Users\ИмяПользователя\Desktop будет недоступен, так как сервер 1С работает под своей системной учетной записью (обычно USR1CV8).
Рекомендации для серверного сохранения:
\\ServerName\Share\).ПолучитьИмяВременногоФайла("xlsx").Чтобы файлы не перезаписывали друг друга, проанализируем ситуацию с именованием. Хорошей практикой считается включение в имя файла номера и даты документа:
ИмяФайла = СтрШаблон("Заказ_%1_от_%2.xlsx",
Объект.Номер,
Формат(Объект.Дата, "ДФ=yyyyMMdd_HHmm")
);
ПолныйПуть = "D:\Archive\" + ИмяФайла;
Если задача стоит так, чтобы пользователь сам выбрал, куда сохранить Excel-файл, нам потребуется работа на клиенте с использованием ДиалогВыбораФайла. Посмотрим на пример реализации:
&НаКлиенте
Процедура СохранитьСВыборомПути(Команда)
ПараметрыВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ПараметрыВыбора.Заголовок = "Выберите путь для сохранения заказа";
ПараметрыВыбора.Фильтр = "Excel файлы (*.xlsx)|*.xlsx";
ПараметрыВыбора.ПолноеИмяФайла = "Заказ_Клиента.xlsx";
Если ПараметрыВыбора.Выбрать() Тогда
Путь = ПараметрыВыбора.ПолноеИмяФайла;
// Вызываем серверную функцию получения ТабДока
ТабДок = ПолучитьТабличныйДокументЗаказа(Объект.Ссылка);
ТабДок.Записать(Путь, ТипФайлаТабличногоДокумента.XLSX);
КонецЕсли;
КонецПроцедуры
Мы разобрали полный цикл работы с печатными формами в 1С:УТ 11. Использование стандартных методов БСП (УправлениеПечатью) гарантирует, что ваша разработка будет стабильно работать даже после обновлений конфигурации, а правильная настройка ТабличногоДокумента обеспечит корректное отображение данных в Excel. Помните о разнице контекстов выполнения (Клиент/Сервер) и всегда обрабатывайте исключения при работе с файловой системой.