К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как в 1С сохранить обработку как внешнюю программно

Как программно сохранить обработку 1С как внешний файл .epf: методы, код для обычных и управляемых форм, проверка результата и типичные ошибки.

Задача программно сохранить обработку как внешний файл возникает в двух типовых ситуациях: когда нужно выгрузить встроенную в конфигурацию обработку в файл .epf для передачи коллеге или публикации, и когда обработка формируется динамически и её нужно зафиксировать на диске. В обоих случаях используется объектная модель внешних обработок платформы 1С, и способ зависит от того, откуда берётся обработка — из конфигурации, из справочника дополнительных отчётов или из уже открытого файла.

Ключевой момент: платформа не имеет команды «сохранить как внешнюю» в виде одного метода для любого случая. Разработчик выбирает путь — загрузить обработку из макета конфигурации, прочитать двоичные данные из хранилища дополнительных отчётов или пересохранить уже открытый файл. Ниже разобраны рабочие способы с кодом, условиями применения и проверкой результата.

Что такое внешняя обработка и когда нужно программное сохранение

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

Программное сохранение требуется в таких сценариях: автоматическая выгрузка обработок из справочника дополнительных отчётов для резервной копии, формирование файла обработки «на лету» из шаблона с подстановкой параметров, экспорт встроенной обработки для тестирования в другой базе. Ручной способ — «Файл → Сохранить как» в конфигураторе — не подходит, когда операцию нужно выполнять регулярно или из пользовательского режима.

Способ 1: запись двоичных данных из хранилища в файл

Самый частый практический случай — обработка уже хранится в базе как двоичные данные. Так устроен справочник «Дополнительные отчеты и обработки» в типовых конфигурациях на БСП: файл обработки лежит в реквизите типа ХранилищеЗначения. Чтобы сохранить его как внешний файл, достаточно извлечь данные и записать на диск.

Запрос = Новый Запрос(

"ВЫБРАТЬ ХранилищеОбработки

|ИЗ Справочник.ДополнительныеОтчетыИОбработки

|ГДЕ Ссылка = &Ссылка");

Запрос.УстановитьПараметр("Ссылка", НужнаяОбработка);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

ДвоичныеДанные = Выборка.ХранилищеОбработки.Получить();

ДвоичныеДанные.Записать("C:\Обработки\МояОбработка.epf");

КонецЕсли;

Метод Записать() объекта ДвоичныеДанные создаёт файл, байт в байт повторяющий исходный .epf. Проверка результата проста: откройте полученный файл в режиме предприятия через «Файл → Открыть». Если обработка запускается и работает — выгрузка корректна. Имя справочника и реквизита в вашей конфигурации может отличаться, уточните их в конфигураторе перед написанием запроса.

Способ 2: выгрузка обработки, встроенной в конфигурацию

Если обработка встроена в конфигурацию (ветка «Обработки» в дереве конфигуратора), прямого программного метода «выгрузить в .epf» из режима предприятия нет. Платформа разделяет контексты: объекты конфигурации доступны для выполнения, но не для произвольной выгрузки в файл из пользовательского режима. Это осознанное ограничение безопасности.

Рабочие варианты такие. Первый — открыть обработку в конфигураторе и вручную сохранить через «Файл → Сохранить как», указав имя .epf. Второй — автоматизировать выгрузку через пакетный режим конфигуратора с ключом командной строки, если выгрузку нужно выполнять регулярно, например в скрипте сборки. Третий — если обработка зашита как макет с двоичными данными .epf, извлечь макет и записать его так же, как в первом способе.

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

ДвоичныеДанные = ПолучитьОбщийМакет("МояВнешняяОбработка");

ДвоичныеДанные.Записать(КаталогВременныхФайлов() + "Обработка.epf");

Выгрузка обработки из макета
  1. 1
    Добавьте в конфигурацию общий макет типа «Двоичные данные» и загрузите в него файл .epf
  2. 2
    В пользовательском режиме получите макет функцией ПолучитьОбщийМакет
  3. 3
    Запишите двоичные данные методом Записать() в файл с расширением .epf
  4. 4
    Откройте полученный файл в режиме предприятия и убедитесь, что обработка запускается

Способ 3: пересохранение уже открытой внешней обработки

Если обработка уже лежит на диске и открыта программно, её можно скопировать как файл обычными средствами работы с файловой системой — методами КопироватьФайл или чтением и записью двоичных данных. Специальных методов «пересохранить» не требуется: .epf — это обычный файл с точки зрения операционной системы.

КопироватьФайл("C:\Исходная\Обработка.epf", "D:\Архив\Обработка.epf");

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

Сохранение файла на клиенте и на сервере: в чём разница

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

&НаСервере

Функция ПодготовитьФайлНаСервере()

ДвоичныеДанные = ПолучитьОбщийМакет("МояОбработка");

Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);

КонецФункции

&НаКлиенте

Процедура СохранитьФайл(Команда)

Адрес = ПодготовитьФайлНаСервере();

ПолучитьФайл(Адрес, "МояОбработка.epf", Истина);

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

Метод ПолучитьФайл с третьим параметром Истина показывает пользователю стандартный диалог сохранения. Это корректный путь для управляемых форм: пользователь сам выбирает, куда сохранить обработку, и права на его локальные каталоги не требуются от сервера.

Проверка результата и типичные ошибки

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

Вторая частая ошибка — запись в несуществующий каталог. Метод Записать не создаёт промежуточные папки, поэтому перед записью проверяйте каталог через объект Файл или создавайте его методом СоздатьКаталог. Третья типичная проблема — попытка записать файл, который в этот момент открыт платформой: операционная система заблокирует запись, и вы получите ошибку доступа.

Типичные ошибки
01
Запись строки вместо двоичных данных — файл создаётся, но не открывается, ошибка формата потока
02
Запись в несуществующий каталог — исключение без создания файла, каталог нужно создать заранее
03
Серверный код пишет на диск сервера, а пользователь ищет файл у себя — используйте временное хранилище и ПолучитьФайл
04
Перезапись открытого в данный момент .epf — ошибка доступа, сначала закройте обработку
Контрольные точки

Как проверить результат

Открытие файла в режиме предприятия
Норма

Обработка запускается и выполняет свои функции

Тревожный признак

Ошибка формата потока или пустое окно

Размер файла
Норма

Сопоставим с размером исходного .epf

Тревожный признак

Файл в разы меньше или нулевого размера

Расположение файла
Норма

Файл лежит в ожидаемом каталоге клиента или сервера

Тревожный признак

Файл создан на сервере, а искали на клиенте

Частые вопросы

Можно ли сохранить внешнюю обработку из режима предприятия без прав администратора?

Запись файла на клиентский компьютер через диалог сохранения доступна обычному пользователю. А вот чтение справочника дополнительных отчётов и запись на диск сервера зависят от ролей: если у пользователя нет прав на объект, запрос вернёт пустой результат или ошибку нарушения прав доступа.

Чем отличается .epf от .erf?

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

Почему сохранённый файл не открывается с ошибкой формата потока?

Почти всегда причина в том, что в файл записаны не двоичные данные: строка, сериализованное значение или данные из неверного реквизита. Проверьте, что из хранилища значения извлекается именно объект ДвоичныеДанные, и что исходный .epf сам по себе открывается.

Можно ли программно создать .epf «с нуля», без исходного файла?

Нет, платформа не предоставляет API для сборки файла .epf из кода в пользовательском режиме. Файл создаётся конфигуратором. На практике используют заготовку-шаблон: готовый .epf хранят в макете, а параметризуемые части подставляют в код уже после выгрузки или передают через параметры при открытии.

Как сохранить обработку на компьютер пользователя в веб-клиенте?

Через временное хранилище и метод ПолучитьФайл — браузер инициирует скачивание файла. Прямая запись в произвольный локальный путь из веб-клиента невозможна по ограничениям браузерной безопасности, пользователь сам выбирает место сохранения.

Итог

Что важно запомнить

Внешняя обработка сохраняется программно записью двоичных данных в файл .epf — из справочника дополнительных отчётов, из макета или копированием существующего файла. В клиент-серверном режиме учитывайте, где выполняется код, а результат всегда проверяйте открытием файла в режиме предприятия.