При работе с платформой 1С:Предприятие 8.3 перед разработчиками нередко встает задача по автоматизации различных процессов. Одной из таких нетривиальных задач является программное создание и сохранение внешнего отчета или обработки в файл формата .epf или .erf. На первый взгляд может показаться, что для этого существуют простые встроенные функции, однако на практике мы сталкиваемся с определенными ограничениями платформы. Давайте вместе разберемся, почему эта задача не так проста, как кажется, и какие подходы можно использовать для ее решения.
Для начала, давайте проанализируем, что представляют собой файлы внешних отчетов и обработок. Файлы с расширением .epf (External Processing File) и .erf (External Report File) – это не просто текстовые файлы с кодом 1С. Фактически, это контейнеры, по своей структуре напоминающие ZIP-архивы. Чтобы понять, из каких XML-сегментов они состоят, полезно изучить, как устроена внутренняя структура файлов внешних обработок и отчетов 1С 8.3, применяя современные распаковщики конфигураций и внешних файлов. Внутри такого архива хранятся несколько XML-файлов, которые описывают метаданные объекта, а также текстовые файлы с исходным кодом. Платформа 1С не предоставляет прямого метода, такого как СоздатьНовыйВнешнийОтчет(), который позволил бы программно собрать этот сложный контейнер из отдельных компонентов. Это обусловлено тем, что такие файлы фактически являются частью конфигурации, и их создание с нуля обычно предполагает работу в режиме конфигуратора.
Таким образом, основная сложность заключается в том, что нам необходимо не просто сохранить некий текст или объект, а собрать сложную структуру метаданных, упаковать ее в определенный формат, который распознает платформа 1С. Тем не менее, существуют несколько обходных путей и методов, которые мы можем рассмотреть для достижения нашей цели.
Один из самых простых и наименее трудозатратных способов программно "создать" внешний отчет или обработку — это использовать заранее подготовленный пустой или минимальный шаблон. Этот метод не является созданием "с нуля" в прямом смысле, но позволяет получить нужный файл программными средствами. Подобная методика часто находит использование шаблонов для динамического создания внешних печатных форм, а также механизмы выгрузки и сохранения дополнительных отчетов и обработок в выбранную папку, когда файл-заготовка копируется и модифицируется «на лету».
Принцип работы:
ПустойШаблон.epf).Преимущества данного подхода:
КопироватьФайл()).Недостатки:
Пошаговая реализация:
Подготовка шаблона:
Откройте конфигуратор 1С. Создайте новый внешний отчет или обработку. Не добавляйте туда ничего лишнего, сохраните его как ПустойШаблон.epf (или .erf) в доступном месте на диске.
Программное копирование шаблона:
В коде 1С вы можете скопировать этот файл-шаблон в нужное место. Рассмотрим пример:
&НаКлиенте
Процедура КопироватьШаблонОбработки(Команда)
ИмяИсходногоШаблона = "C:\ПутиКШаблонам\ПустойШаблон.epf"; // Укажите полный путь к вашему шаблону
ИмяНовогоФайлаОбработки = "C:\МоиОбработки\НоваяОбработка_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".epf"; // Путь, куда сохранить новый файл
Попытка
// Создаем объект файл для исходного шаблона
ФайлИсходник = Новый Файл(ИмяИсходногоШаблона);
Если ФайлИсходник.Существует() Тогда
// Копируем файл в новое место
ФайлИсходник.Копировать(ИмяНовогоФайлаОбработки);
Сообщить("Новая обработка успешно создана на основе шаблона: " + ИмяНовогоФайлаОбработки);
Иначе
Сообщить("Ошибка: Файл шаблона не найден по пути " + ИмяИсходногоШаблона);
КонецЕсли;
Исключение
Сообщить("Ошибка при копировании файла обработки: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Этот метод позволяет быстро получить файл, который может быть использован как внешний отчет или обработка.
Если задача требует более глубокой автоматизации, например, программного добавления кода или макетов во внешний отчет/обработку, нам может помочь использование COM-соединения к конфигуратору 1С:Предприятия. Это позволяет реализовать полноценное программное создание и модификацию внешних обработок (EPF) непосредственно из программного кода (предварительно проверив их через статический анализатор кода проектов), используя объектную модель конфигуратора для манипуляции метаданными.
Принцип работы:
Важные аспекты и сложности:
Давайте разберем пример создания и сохранения обработки через 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-соединение для добавления реквизитов, форм и модулей.
В некоторых случаях, когда требуется полная автоматизация без ручного вмешательства в конфигуратор, разработчики прибегают к использованию внешних утилит.
Принцип работы:
Существуют сторонние инструменты, которые умеют работать с внутренним форматом файлов EPF/ERF. Эти инструменты позволяют программно генерировать файлы модулей и упаковывать все компоненты в корректный EPF/ERF файл.
Примеры таких инструментов:
oscript.io (OneScript): Это открытая платформа, вдохновленная языком 1С. С её помощью возможна полная автоматизация сборки внешних отчетов и обработок из исходных XML-файлов (используя, например, конвертер обработок XML в EPF), что позволяет исключить Конфигуратор из процесса сборки.Vanessa-ADD: Инструмент, предоставляющий возможности для манипуляции файлами конфигурации и внешними обработками.Важно понимать, что хотя механизм сериализации позволяет сохранить данные объекта в XML, он не создает файл внешнего отчета или обработки. Сериализация сохраняет именно данные (например, реквизиты документа), а не структуру метаданных или программный код, из которых состоит EPF.
Пример сериализации произвольного объекта в XML:
&НаСервере
Процедура СериализоватьОбъектВXML(ОбъектДляСериализации, ИмяФайла)
Попытка
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьИмяФайла(ИмяФайла);
ЗаписьXML.ЗаписатьОбъявлениеXML();
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
Сериализатор.ЗаписатьXML(ЗаписьXML, ОбъектДляСериализации);
ЗаписьXML.Закрыть();
Сообщить("Объект успешно сериализован в файл: " + ИмяФайла);
Исключение
Сообщить("Ошибка при сериализации объекта: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Мы рассмотрели несколько подходов к решению задачи программного создания и сохранения внешних отчетов или обработок в 1С:Предприятие 8.3:
Выбор оптимального метода будет зависеть от ваших требований. Для большинства типовых ситуаций, где достаточно создать "заготовку" внешнего файла, копирование шаблона будет самым рациональным решением.