Как программно сохранить встроенную обработку из конфигурации на диск в формате EPF

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

В процессе разработки на платформе 1С:Предприятие часто возникают задачи, требующие нестандартного подхода к управлению метаданными. Типичный пример — необходимость запустить встроенную обработку в режиме Толстого клиента из интерфейса Управляемых форм или передать код обработки на удаленный узел. Однако здесь разработчики сталкиваются с архитектурным ограничением: в языке 1С нет прямого метода вроде Обработки.МояОбработка.ЗаписатьВФайл().

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

Почему нельзя просто «сохранить» обработку из метаданных

Проанализируем ситуацию с технической точки зрения. Внутренняя структура конфигурации (файл .cf или таблицы в SQL-базе) хранит объекты метаданных в специфическом упакованном формате. Когда мы создаем внешнюю обработку (файл .epf), платформа добавляет к этим данным дополнительные заголовки, структуру контейнера и сигнатуры. Платформа 1С не предоставляет встроенного механизма «упаковки» внутреннего объекта обратно в контейнер .epf в режиме исполнения (Runtime).

Рассмотрим основные способы реализации этой задачи, от стандартных до автоматизированных.

Способ №1: Использование макетов двоичных данных (Рекомендуемый)

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

Пошаговый алгоритм реализации:

  1. Разработаем нужную обработку и сохраним её на диск как внешний файл .epf.
  2. В дереве метаданных найдем нашу встроенную обработку (или создадим служебную).
  3. Добавим ей новый Макет с типом Двоичные данные. Загрузим в него наш сохраненный файл .epf.
  4. Напишем программный код для выгрузки этого макета на диск.

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


// Получаем двоичные данные из макета встроенной обработки
ДвоичныеДанныеМакета = Обработки.ИнтеграцияКартографии.ПолучитьМакет("ВнешнийФайлОбработки");

// Формируем путь во временном каталоге
ИмяФайла = КаталогВременныхФайлов() + "MappingTool.epf";

// Записываем данные на диск
ДвоичныеДанныеМакета.Записать(ИмяФайла);

// Теперь мы можем запустить эту обработку программно
// Например, в толстом клиенте:
ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла);
ВнешняяОбработкаОбъект.ПолучитьФорму("ФормаОбычная").Открыть();

Преимущества метода: Работает быстро, не требует прав администратора и доступа к конфигуратору, стабильно функционирует как в файловом, так и в клиент-серверном варианте.

Способ №2: Автоматизация через командную строку конфигуратора

Если нам всё же критично выгрузить именно актуальное состояние объекта из метаданных без ручного обновления макетов, нам придется обратиться к возможностям конфигуратора. Рассмотрим ситуацию, когда мы можем запустить процесс выгрузки конфигурации в файлы XML.

Начиная с версии платформы 8.3.10, команда выгрузки поддерживает фильтры. Мы можем не выгружать всю базу, а указать конкретный объект. Команда запуска будет выглядеть примерно так:

1cv8.exe DESIGNER /F "ПутьКБазе" /DumpConfigToFiles "КаталогВыгрузки" -filter "ПутьКФайлуФильтра.xml"

В файле фильтра мы указываем конкретную обработку. Однако стоит помнить, что результатом будет набор XML файлов, а не готовый .epf. Чтобы собрать их в .epf, потребуется использование сторонних инструментов автоматизации (например, Vtools или Precommit1c), что крайне сложно реализовать внутри кода 1С в режиме предприятия.

Способ №3: Программный запуск через параметры командной строки

Выясним причину, по которой автору темы потребовалось сохранение обработки. Основная цель — запуск обработки под Толстым клиентом из Управляемого приложения. Если мы используем метод с двоичным макетом (Способ №1), мы можем автоматизировать запуск новой сессии 1С с передачей параметров.

Проанализируем пример кода для запуска отдельного процесса 1С с нашей выгруженной обработкой:


ИмяФайла = "C:\Temp\MyProcessing.epf"; // Путь, куда мы сохранили макет
ПараметрыЗапуска = "ENTERPRISE /F """ + СтрокаСоединенияИнформационнойБазы() + """ /Execute """ + ИмяФайла + """ /RunModeOrdinaryApplication";

// Запускаем новое приложение 1С
ЗапуститьПриложение(ПараметрыЗапуска);

Важно учитывать нюанс: ключ /Execute работает только с внешними файлами. Вы не можете указать путь к объекту внутри метаданных в этом ключе. Это еще раз подтверждает необходимость предварительного сохранения обработки на диск.

Тонкости работы с внешними обработками

При реализации выгрузки важно помнить о различиях между встроенными и внешними объектами:

Резюме

Подведем итог нашему анализу. Напрямую сохранить обработку из дерева метаданных в файл .epf средствами встроенного языка нельзя. Самым надежным и профессиональным решением является дублирование обработки в макет Двоичные данные. Это обеспечивает:

  1. Автономность: Обработка всегда «носит» актуальную копию себя внутри.
  2. Простоту кода: Достаточно методов ПолучитьМакет() и Записать().
  3. Гибкость: Возможность запускать старый код (обычные формы) в новых окружениях через выгрузку и запуск в режиме толстого клиента.
← На главную