Как программно сформировать печатную форму и сохранить ее в Excel?

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

В процессе разработки в среде 1С:Предприятие 8.3 (особенно в конфигурациях на базе БСП, таких как УТ 11, ERP или КА) часто возникает задача автоматизации выгрузки документов. Например, когда необходимо не просто вывести печатную форму на экран, а программно сохранить её в файл формата Excel в определенную папку на сервере или локальном компьютере. Рассмотрим подробно, как реализовать этот механизм, используя типовые возможности подсистемы «Печать».

Анализ задачи и выбор инструментов

Для решения задачи нам необходимо пройти три основных этапа:

  1. Инициализация данных: Подготовка массива ссылок на объекты, которые мы хотим распечатать.
  2. Формирование табличного документа: Обращение к менеджеру печати (обработке или менеджеру документа) для генерации макета, заполненного данными.
  3. Экспорт в файл: Сохранение полученного табличного документа на диск в нужном формате (XLS или XLSX).

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

Шаг 1: Подготовка параметров и вызов печати

Разберем ситуацию на примере документа «Заказ клиента». Печатные формы для этого документа обычно сосредоточены в обработке ПечатьЗаказовНаТоварыУслуги. Чтобы получить табличный документ программно, нам нужно знать имя менеджера печати и идентификатор команды печати.

Проанализируем следующий программный код, который выполняет основную работу на стороне сервера:


&НаСервере
Функция ПолучитьТабличныйДокументЗаказа(СсылкаНаЗаказ)
    
    // 1. Помещаем ссылку в массив, так как механизм печати всегда работает со списком
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(СсылкаНаЗаказ);
    
    // 2. Подготавливаем структуру для параметров печати
    ПараметрыПечати = Новый Структура;
    
    // 3. Вызываем метод БСП для формирования печатных форм.
    // "Обработка.ПечатьЗаказовНаТоварыУслуги" - это менеджер печати
    // "ПФ_MXL_ЗаказКлиента" - это имя макета (идентификатор печатной формы)
    РезультатПечати = УправлениеПечатью.СформироватьПечатныеФормы(
        "Обработка.ПечатьЗаказовНаТоварыУслуги", 
        "ПФ_MXL_ЗаказКлиента", 
        МассивОбъектов, 
        ПараметрыПечати, 
        Неопределено
    );
    
    // Результат возвращается в виде структуры, где КоллекцияПечатныхФорм - это таблица значений
    Если РезультатПечати.КоллекцияПечатныхФорм.Количество() > 0 Тогда
        Возврат РезультатПечати.КоллекцияПечатныхФорм[0].ТабличныйДокумент;
    КонецЕсли;
    
    Возврат Неопределено;
    
КонецФункции

Важный момент: идентификатор формы ПФ_MXL_ЗаказКлиента можно подсмотреть в модуле менеджера соответствующего объекта в процедуре ДобавитьКомандыПечати. Именно там регистрируются все доступные формы.

Шаг 2: Настройка табличного документа перед сохранением

Просто получить ТабличныйДокумент недостаточно. Чтобы файл Excel выглядел презентабельно, мы должны настроить параметры отображения. Выясним, какие свойства наиболее критичны:

Рассмотрим пример настройки:


ТабДок = ПолучитьТабличныйДокументЗаказа(ВыбранныйЗаказ);
Если ТабДок <> Неопределено Тогда
    ТабДок.АвтоМасштаб = Истина;
    ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    // Дополнительно можно очистить области печати, если они мешают выгрузке
КонецЕсли;

Шаг 3: Сохранение в формат Excel

Для записи документа используется метод Записать(). Здесь важно правильно выбрать ТипФайлаТабличногоДокумента. Рассмотрим два варианта:

  1. XLS: Старый формат (Excel 97-2003). Имеет ограничение в 65 536 строк.
  2. XLSX: Современный формат. Поддерживает большие объемы данных и лучше сохраняет сложное форматирование 1С.

Проанализируем код сохранения:


ПутьКФайлу = "C:\Export\ЗаказКлиента.xlsx";
Попытка
    ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
    Сообщить("Файл успешно сохранен: " + ПутьКФайлу);
Исключение
    Сообщить("Ошибка при сохранении файла: " + ОписаниеОшибки());
КонецПопытки;

Нюансы работы на сервере и права доступа

Выясним причину частой ошибки: «Ошибка доступа к файлу». Если код выполняется в контексте &НаСервере, то путь C:\Users\ИмяПользователя\Desktop будет недоступен, так как сервер 1С работает под своей системной учетной записью (обычно USR1CV8).

Рекомендации для серверного сохранения:

Динамическое формирование имени файла

Чтобы файлы не перезаписывали друг друга, проанализируем ситуацию с именованием. Хорошей практикой считается включение в имя файла номера и даты документа:


ИмяФайла = СтрШаблон("Заказ_%1_от_%2.xlsx", 
    Объект.Номер, 
    Формат(Объект.Дата, "ДФ=yyyyMMdd_HHmm")
);
ПолныйПуть = "D:\Archive\" + ИмяФайла;

Использование Диалога выбора файла (на клиенте)

Если задача стоит так, чтобы пользователь сам выбрал, куда сохранить Excel-файл, нам потребуется работа на клиенте с использованием ДиалогВыбораФайла. Посмотрим на пример реализации:


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

Заключение

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

← На главную