Разработка и Конфигурация · 9 мин
Как в 1С сохранить обработку как внешнюю программно
Как программно сохранить обработку 1С как внешний файл .epf: методы, код для обычных и управляемых форм, проверка результата и типичные ошибки.
Задача программно сохранить обработку как внешний файл возникает в двух типовых ситуациях: когда нужно выгрузить встроенную в конфигурацию обработку в файл .epf для передачи коллеге или публикации, и когда обработка формируется динамически и её нужно зафиксировать на диске. В обоих случаях используется объектная модель внешних обработок платформы 1С, и способ зависит от того, откуда берётся обработка — из конфигурации, из справочника дополнительных отчётов или из уже открытого файла.
Ключевой момент: платформа не имеет команды «сохранить как внешнюю» в виде одного метода для любого случая. Разработчик выбирает путь — загрузить обработку из макета конфигурации, прочитать двоичные данные из хранилища дополнительных отчётов или пересохранить уже открытый файл. Ниже разобраны рабочие способы с кодом, условиями применения и проверкой результата.
Что такое внешняя обработка и когда нужно программное сохранение
Внешняя обработка — это файл с расширением .epf, который платформа 1С открывает без внедрения в конфигурацию. Внутри файла лежат модуль объекта, формы, макеты и метаданные обработки в упакованном виде. В отличие от встроенной обработки конфигурации, внешнюю можно передавать между базами, подключать через механизм дополнительных отчётов и обработок и запускать в базах без доработки.
Программное сохранение требуется в таких сценариях: автоматическая выгрузка обработок из справочника дополнительных отчётов для резервной копии, формирование файла обработки «на лету» из шаблона с подстановкой параметров, экспорт встроенной обработки для тестирования в другой базе. Ручной способ — «Файл → Сохранить как» в конфигураторе — не подходит, когда операцию нужно выполнять регулярно или из пользовательского режима.
Способ 1: запись двоичных данных из хранилища в файл
Самый частый практический случай — обработка уже хранится в базе как двоичные данные. Так устроен справочник «Дополнительные отчеты и обработки» в типовых конфигурациях на БСП: файл обработки лежит в реквизите типа ХранилищеЗначения. Чтобы сохранить его как внешний файл, достаточно извлечь данные и записать на диск.
Запрос = Новый Запрос(
"ВЫБРАТЬ ХранилищеОбработки
|ИЗ Справочник.ДополнительныеОтчетыИОбработки
|ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", НужнаяОбработка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ДвоичныеДанные = Выборка.ХранилищеОбработки.Получить();
ДвоичныеДанные.Записать("C:\Обработки\МояОбработка.epf");
КонецЕсли;
Метод Записать() объекта ДвоичныеДанные создаёт файл, байт в байт повторяющий исходный .epf. Проверка результата проста: откройте полученный файл в режиме предприятия через «Файл → Открыть». Если обработка запускается и работает — выгрузка корректна. Имя справочника и реквизита в вашей конфигурации может отличаться, уточните их в конфигураторе перед написанием запроса.
Способ 2: выгрузка обработки, встроенной в конфигурацию
Если обработка встроена в конфигурацию (ветка «Обработки» в дереве конфигуратора), прямого программного метода «выгрузить в .epf» из режима предприятия нет. Платформа разделяет контексты: объекты конфигурации доступны для выполнения, но не для произвольной выгрузки в файл из пользовательского режима. Это осознанное ограничение безопасности.
Рабочие варианты такие. Первый — открыть обработку в конфигураторе и вручную сохранить через «Файл → Сохранить как», указав имя .epf. Второй — автоматизировать выгрузку через пакетный режим конфигуратора с ключом командной строки, если выгрузку нужно выполнять регулярно, например в скрипте сборки. Третий — если обработка зашита как макет с двоичными данными .epf, извлечь макет и записать его так же, как в первом способе.
Вариант с макетом часто используют разработчики: внешняя обработка помещается в макет типа «Двоичные данные», а в пользовательском режиме извлекается кодом:
ДвоичныеДанные = ПолучитьОбщийМакет("МояВнешняяОбработка");
ДвоичныеДанные.Записать(КаталогВременныхФайлов() + "Обработка.epf");
- 1Добавьте в конфигурацию общий макет типа «Двоичные данные» и загрузите в него файл .epf
- 2В пользовательском режиме получите макет функцией ПолучитьОбщийМакет
- 3Запишите двоичные данные методом Записать() в файл с расширением .epf
- 4Откройте полученный файл в режиме предприятия и убедитесь, что обработка запускается
Способ 3: пересохранение уже открытой внешней обработки
Если обработка уже лежит на диске и открыта программно, её можно скопировать как файл обычными средствами работы с файловой системой — методами КопироватьФайл или чтением и записью двоичных данных. Специальных методов «пересохранить» не требуется: .epf — это обычный файл с точки зрения операционной системы.
КопироватьФайл("C:\Исходная\Обработка.epf", "D:\Архив\Обработка.epf");
Такой подход применяют при организации архива версий обработок: перед обновлением файла в рабочем каталоге старая версия копируется в архив с датой в имени. Учтите, что в файловой базе путь указывается относительно компьютера пользователя, а в клиент-серверной — относительно сервера, если код выполняется на сервере. Это частая причина «файл не найден» при переносе кода из файловой базы в серверную.
Сохранение файла на клиенте и на сервере: в чём разница
В клиент-серверном режиме код, выполняющийся на сервере, пишет файлы в файловую систему сервера, а не компьютера пользователя. Если цель — передать файл пользователю, схема двухшаговая: на сервере данные помещаются во временное хранилище, на клиенте извлекаются и сохраняются через диалог выбора файла.
&НаСервере
Функция ПодготовитьФайлНаСервере()
ДвоичныеДанные = ПолучитьОбщийМакет("МояОбработка");
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура СохранитьФайл(Команда)
Адрес = ПодготовитьФайлНаСервере();
ПолучитьФайл(Адрес, "МояОбработка.epf", Истина);
КонецПроцедуры
Метод ПолучитьФайл с третьим параметром Истина показывает пользователю стандартный диалог сохранения. Это корректный путь для управляемых форм: пользователь сам выбирает, куда сохранить обработку, и права на его локальные каталоги не требуются от сервера.
Проверка результата и типичные ошибки
После программного сохранения файл нужно проверить, прежде чем передавать дальше. Признак корректной выгрузки — файл открывается платформой без сообщения «Ошибка формата потока». Эта ошибка означает, что записаны не те данные: например, в файл записали строковое представление вместо двоичных данных или извлекли значение не из того реквизита.
Вторая частая ошибка — запись в несуществующий каталог. Метод Записать не создаёт промежуточные папки, поэтому перед записью проверяйте каталог через объект Файл или создавайте его методом СоздатьКаталог. Третья типичная проблема — попытка записать файл, который в этот момент открыт платформой: операционная система заблокирует запись, и вы получите ошибку доступа.
Как проверить результат
Обработка запускается и выполняет свои функции
Ошибка формата потока или пустое окно
Сопоставим с размером исходного .epf
Файл в разы меньше или нулевого размера
Файл лежит в ожидаемом каталоге клиента или сервера
Файл создан на сервере, а искали на клиенте
Частые вопросы
Можно ли сохранить внешнюю обработку из режима предприятия без прав администратора?
Запись файла на клиентский компьютер через диалог сохранения доступна обычному пользователю. А вот чтение справочника дополнительных отчётов и запись на диск сервера зависят от ролей: если у пользователя нет прав на объект, запрос вернёт пустой результат или ошибку нарушения прав доступа.
Чем отличается .epf от .erf?
.epf — файл внешней обработки, .erf — файл внешнего отчёта. Технически формат схож, различается назначение: отчёт строится на СКД и выводит данные, обработка выполняет произвольные действия. Программно оба сохраняются одинаково — записью двоичных данных в файл с нужным расширением.
Почему сохранённый файл не открывается с ошибкой формата потока?
Почти всегда причина в том, что в файл записаны не двоичные данные: строка, сериализованное значение или данные из неверного реквизита. Проверьте, что из хранилища значения извлекается именно объект ДвоичныеДанные, и что исходный .epf сам по себе открывается.
Можно ли программно создать .epf «с нуля», без исходного файла?
Нет, платформа не предоставляет API для сборки файла .epf из кода в пользовательском режиме. Файл создаётся конфигуратором. На практике используют заготовку-шаблон: готовый .epf хранят в макете, а параметризуемые части подставляют в код уже после выгрузки или передают через параметры при открытии.
Как сохранить обработку на компьютер пользователя в веб-клиенте?
Через временное хранилище и метод ПолучитьФайл — браузер инициирует скачивание файла. Прямая запись в произвольный локальный путь из веб-клиента невозможна по ограничениям браузерной безопасности, пользователь сам выбирает место сохранения.
Что важно запомнить
Внешняя обработка сохраняется программно записью двоичных данных в файл .epf — из справочника дополнительных отчётов, из макета или копированием существующего файла. В клиент-серверном режиме учитывайте, где выполняется код, а результат всегда проверяйте открытием файла в режиме предприятия.