Как программно создать и сохранить внешний отчет или обработку (EPF/ERF) в 1С:Предприятие 8.3 на управляемых формах?

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

При работе с платформой 1С:Предприятие 8.3 перед разработчиками нередко встает задача по автоматизации различных процессов. Одной из таких нетривиальных задач является программное создание и сохранение внешнего отчета или обработки в файл формата .epf или .erf. На первый взгляд может показаться, что для этого существуют простые встроенные функции, однако на практике мы сталкиваемся с определенными ограничениями платформы. Давайте вместе разберемся, почему эта задача не так проста, как кажется, и какие подходы можно использовать для ее решения.

Выясняем суть проблемы: почему программное создание EPF/ERF — это не просто

Для начала, давайте проанализируем, что представляют собой файлы внешних отчетов и обработок. Файлы с расширением .epf (External Processing File) и .erf (External Report File) – это не просто текстовые файлы с кодом 1С. Фактически, это контейнеры, по своей структуре напоминающие ZIP-архивы. Чтобы понять, из каких XML-сегментов они состоят, полезно изучить, как устроена внутренняя структура файлов внешних обработок и отчетов 1С 8.3, применяя современные распаковщики конфигураций и внешних файлов. Внутри такого архива хранятся несколько XML-файлов, которые описывают метаданные объекта, а также текстовые файлы с исходным кодом. Платформа 1С не предоставляет прямого метода, такого как СоздатьНовыйВнешнийОтчет(), который позволил бы программно собрать этот сложный контейнер из отдельных компонентов. Это обусловлено тем, что такие файлы фактически являются частью конфигурации, и их создание с нуля обычно предполагает работу в режиме конфигуратора.

Таким образом, основная сложность заключается в том, что нам необходимо не просто сохранить некий текст или объект, а собрать сложную структуру метаданных, упаковать ее в определенный формат, который распознает платформа 1С. Тем не менее, существуют несколько обходных путей и методов, которые мы можем рассмотреть для достижения нашей цели.

Подход 1: Использование пустого шаблона (эталонного EPF/ERF файла)

Один из самых простых и наименее трудозатратных способов программно "создать" внешний отчет или обработку — это использовать заранее подготовленный пустой или минимальный шаблон. Этот метод не является созданием "с нуля" в прямом смысле, но позволяет получить нужный файл программными средствами. Подобная методика часто находит использование шаблонов для динамического создания внешних печатных форм, а также механизмы выгрузки и сохранения дополнительных отчетов и обработок в выбранную папку, когда файл-заготовка копируется и модифицируется «на лету».

Принцип работы:

  1. Мы предварительно создаем в конфигураторе максимально простой (например, с одним пустым модулем) внешний отчет или обработку.
  2. Сохраняем этот файл на диск (например, как ПустойШаблон.epf).
  3. В нашей информационной базе 1С мы программно копируем этот шаблон в нужное место с новым именем.

Преимущества данного подхода:

Недостатки:

Пошаговая реализация:

  1. Подготовка шаблона:

    Откройте конфигуратор 1С. Создайте новый внешний отчет или обработку. Не добавляйте туда ничего лишнего, сохраните его как ПустойШаблон.epf (или .erf) в доступном месте на диске.

  2. Программное копирование шаблона:

    В коде 1С вы можете скопировать этот файл-шаблон в нужное место. Рассмотрим пример:

    
    &НаКлиенте
    Процедура КопироватьШаблонОбработки(Команда)
        ИмяИсходногоШаблона = "C:\ПутиКШаблонам\ПустойШаблон.epf"; // Укажите полный путь к вашему шаблону
        ИмяНовогоФайлаОбработки = "C:\МоиОбработки\НоваяОбработка_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".epf"; // Путь, куда сохранить новый файл
    
        Попытка
            // Создаем объект файл для исходного шаблона
            ФайлИсходник = Новый Файл(ИмяИсходногоШаблона);
            Если ФайлИсходник.Существует() Тогда
                // Копируем файл в новое место
                ФайлИсходник.Копировать(ИмяНовогоФайлаОбработки);
                Сообщить("Новая обработка успешно создана на основе шаблона: " + ИмяНовогоФайлаОбработки);
            Иначе
                Сообщить("Ошибка: Файл шаблона не найден по пути " + ИмяИсходногоШаблона);
            КонецЕсли;
        Исключение
            Сообщить("Ошибка при копировании файла обработки: " + ОписаниеОшибки());
        КонецПопытки;
    КонецПроцедуры
    

Этот метод позволяет быстро получить файл, который может быть использован как внешний отчет или обработка.

Подход 2: Создание и модификация через COM-соединение к конфигуратору

Если задача требует более глубокой автоматизации, например, программного добавления кода или макетов во внешний отчет/обработку, нам может помочь использование COM-соединения к конфигуратору 1С:Предприятия. Это позволяет реализовать полноценное программное создание и модификацию внешних обработок (EPF) непосредственно из программного кода (предварительно проверив их через статический анализатор кода проектов), используя объектную модель конфигуратора для манипуляции метаданными.

Принцип работы:

  1. Мы устанавливаем COM-соединение с экземпляром 1С:Предприятия в режиме конфигуратора.
  2. Через COM-объект мы получаем доступ к внутренним механизмам конфигуратора, позволяющим создавать новые объекты метаданных.
  3. Мы можем программно устанавливать свойства этих объектов, добавлять модули, формы, макеты и затем сохранять их в файл.

Важные аспекты и сложности:

Давайте разберем пример создания и сохранения обработки через COM-соединение. Этот код является упрощенным и демонстрирует основной принцип:


&НаСервере
Процедура СоздатьОбработкуЧерезCOM(ИмяФайлаДляСохранения)

    Перем ComApp;
    Перем СоединениеУстановлено;

    Попытка
        ComApp = Новый COMОбъект("V83.Application");
        
        СтрокаСоединения = "Srvr='localhost';Ref='МояБаза';Usr='Админ';Pwd='Пароль';"; 
        СоединениеУстановлено = ComApp.Connect(СтрокаСоединения);

        Если СоединениеУстановлено Тогда
            Сообщить("Успешное подключение к базе через COM.");
            
            // Концептуальный пример:
            // Designer = ComApp.Designer;
            // ExternalDataProcessors = Designer.MetaData.ExternalDataProcessors;
            // НоваяОбработка = ExternalDataProcessors.Add("МояПрограммнаяОбработка");
            // НоваяОбработка.МодульОбъекта.Текст = "// Сюда можно вставить код";
            // НоваяОбработка.СохранитьВФайл(ИмяФайлаДляСохранения);
            
            Сообщить("Предположим, что файл успешно создан: " + ИмяФайлаДляСохранения);

        Иначе
            Сообщить("Не удалось установить COM-соединение с базой 1С.");
        КонецЕсли;

    Исключение
        Сообщить("Ошибка COM-соединения: " + ОписаниеОшибки());
    КонецПопытки;
    
    Если ComApp <> Неопределено Тогда
        ComApp = Неопределено;
    КонецЕсли;

КонецПроцедуры

Как мы видим, работа с COM-соединением для создания именно EPF-файлов является достаточно сложной задачей. Ключевым моментом является получение объекта, представляющего метаданные конфигуратора, и использование его методов. Эти операции требуют еще более глубокого погружения в объектную модель, включая программное управление объектами метаданных через COM-соединение для добавления реквизитов, форм и модулей.

Подход 3: Использование внешних инструментов

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

Принцип работы:

Существуют сторонние инструменты, которые умеют работать с внутренним форматом файлов EPF/ERF. Эти инструменты позволяют программно генерировать файлы модулей и упаковывать все компоненты в корректный EPF/ERF файл.

Примеры таких инструментов:

Сериализация объектов (не для EPF, но полезно для понимания)

Важно понимать, что хотя механизм сериализации позволяет сохранить данные объекта в XML, он не создает файл внешнего отчета или обработки. Сериализация сохраняет именно данные (например, реквизиты документа), а не структуру метаданных или программный код, из которых состоит EPF.

Пример сериализации произвольного объекта в XML:


&НаСервере
Процедура СериализоватьОбъектВXML(ОбъектДляСериализации, ИмяФайла)
    Попытка
        ЗаписьXML = Новый ЗаписьXML;
        ЗаписьXML.УстановитьИмяФайла(ИмяФайла);
        ЗаписьXML.ЗаписатьОбъявлениеXML(); 
        
        Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
        Сериализатор.ЗаписатьXML(ЗаписьXML, ОбъектДляСериализации);
        
        ЗаписьXML.Закрыть();
        Сообщить("Объект успешно сериализован в файл: " + ИмяФайла);
    Исключение
        Сообщить("Ошибка при сериализации объекта: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Заключение: Выбор оптимального решения

Мы рассмотрели несколько подходов к решению задачи программного создания и сохранения внешних отчетов или обработок в 1С:Предприятие 8.3:

  1. Копирование пустого шаблона: Самый простой метод, если вам нужен лишь "пустой" файл-контейнер.
  2. COM-соединение к конфигуратору: Мощный подход для глубокой автоматизации, программной модификации объектов и последующего анализа внешних обработок на наличие ошибок.
  3. Внешние инструменты: Наиболее гибкий путь, требующий освоения сторонних платформ типа OneScript.

Выбор оптимального метода будет зависеть от ваших требований. Для большинства типовых ситуаций, где достаточно создать "заготовку" внешнего файла, копирование шаблона будет самым рациональным решением.

← На главную