В процессе разработки на платформе 1С:Предприятие часто возникают задачи, требующие нестандартного подхода к управлению метаданными. Типичный пример — необходимость запустить встроенную обработку в режиме Толстого клиента из интерфейса Управляемых форм или передать код обработки на удаленный узел. Однако здесь разработчики сталкиваются с архитектурным ограничением: в языке 1С нет прямого метода вроде Обработки.МояОбработка.ЗаписатьВФайл().
В этой статье мы подробно разберем, почему «напрямую» это сделать невозможно, и проанализируем наиболее эффективные способы решения этой задачи, которые используют профессиональные разработчики.
Проанализируем ситуацию с технической точки зрения. Внутренняя структура конфигурации (файл .cf или таблицы в SQL-базе) хранит объекты метаданных в специфическом упакованном формате. Когда мы создаем внешнюю обработку (файл .epf), платформа добавляет к этим данным дополнительные заголовки, структуру контейнера и сигнатуры. Платформа 1С не предоставляет встроенного механизма «упаковки» внутреннего объекта обратно в контейнер .epf в режиме исполнения (Runtime).
Рассмотрим основные способы реализации этой задачи, от стандартных до автоматизированных.
Этот метод является «золотым стандартом». Мы не пытаемся извлечь объект метаданных, а храним его готовую копию внутри самой конфигурации. Это позволяет избежать сложностей с форматами и гарантирует работоспособность файла.
Пошаговый алгоритм реализации:
.epf..epf.Рассмотрим пример кода, который выполняет сохранение и последующий запуск:
// Получаем двоичные данные из макета встроенной обработки
ДвоичныеДанныеМакета = Обработки.ИнтеграцияКартографии.ПолучитьМакет("ВнешнийФайлОбработки");
// Формируем путь во временном каталоге
ИмяФайла = КаталогВременныхФайлов() + "MappingTool.epf";
// Записываем данные на диск
ДвоичныеДанныеМакета.Записать(ИмяФайла);
// Теперь мы можем запустить эту обработку программно
// Например, в толстом клиенте:
ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла);
ВнешняяОбработкаОбъект.ПолучитьФорму("ФормаОбычная").Открыть();
Преимущества метода: Работает быстро, не требует прав администратора и доступа к конфигуратору, стабильно функционирует как в файловом, так и в клиент-серверном варианте.
Если нам всё же критично выгрузить именно актуальное состояние объекта из метаданных без ручного обновления макетов, нам придется обратиться к возможностям конфигуратора. Рассмотрим ситуацию, когда мы можем запустить процесс выгрузки конфигурации в файлы XML.
Начиная с версии платформы 8.3.10, команда выгрузки поддерживает фильтры. Мы можем не выгружать всю базу, а указать конкретный объект. Команда запуска будет выглядеть примерно так:
1cv8.exe DESIGNER /F "ПутьКБазе" /DumpConfigToFiles "КаталогВыгрузки" -filter "ПутьКФайлуФильтра.xml"
В файле фильтра мы указываем конкретную обработку. Однако стоит помнить, что результатом будет набор XML файлов, а не готовый .epf. Чтобы собрать их в .epf, потребуется использование сторонних инструментов автоматизации (например, Vtools или Precommit1c), что крайне сложно реализовать внутри кода 1С в режиме предприятия.
Выясним причину, по которой автору темы потребовалось сохранение обработки. Основная цель — запуск обработки под Толстым клиентом из Управляемого приложения. Если мы используем метод с двоичным макетом (Способ №1), мы можем автоматизировать запуск новой сессии 1С с передачей параметров.
Проанализируем пример кода для запуска отдельного процесса 1С с нашей выгруженной обработкой:
ИмяФайла = "C:\Temp\MyProcessing.epf"; // Путь, куда мы сохранили макет
ПараметрыЗапуска = "ENTERPRISE /F """ + СтрокаСоединенияИнформационнойБазы() + """ /Execute """ + ИмяФайла + """ /RunModeOrdinaryApplication";
// Запускаем новое приложение 1С
ЗапуститьПриложение(ПараметрыЗапуска);
Важно учитывать нюанс: ключ /Execute работает только с внешними файлами. Вы не можете указать путь к объекту внутри метаданных в этом ключе. Это еще раз подтверждает необходимость предварительного сохранения обработки на диск.
При реализации выгрузки важно помнить о различиях между встроенными и внешними объектами:
.epf) — отсутствует. Если ваша логика завязана на события модуля менеджера, при сохранении в файл и запуске как внешней обработки этот код не будет исполнен.НачатьПомещениеФайла().Подведем итог нашему анализу. Напрямую сохранить обработку из дерева метаданных в файл .epf средствами встроенного языка нельзя. Самым надежным и профессиональным решением является дублирование обработки в макет Двоичные данные. Это обеспечивает:
ПолучитьМакет() и Записать().