Как открыть файл .epf из кода: Подключить, Создать и форма обработки

· 9 мин

Содержание

Чтобы запустить внешнюю обработку в 1С программно, в управляемом приложении нужно три действия: поместить файл .epf во временное хранилище, на сервере вызвать ВнешниеОбработки.Подключить(Адрес, , Ложь) и на клиенте открыть форму по имени "ВнешняяОбработка." + Имя + ".Форма". В толстом клиенте обычного приложения хватает одной строки ВнешниеОбработки.Создать(ПутьКФайлу).

Схема одинакова для 1С:Бухгалтерии, ЗУП, УТ и любой другой конфигурации на платформе 8.3: это механизм платформы, а не прикладного решения. Ниже рабочий код для каждого варианта, передача параметров, внешние отчёты, отладка и ограничения безопасного режима.

Как устроена внешняя обработка и где выполняется её код

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

Код такого файла живёт по тем же правилам «клиент — сервер», что и код конфигурации:

  • 🖥️ модуль объекта выполняется на сервере, там работают запросы и запись данных;
  • 🪟 модуль формы делится на &НаКлиенте и &НаСервере;
  • 📁 файл на диске пользователя серверу не виден, если база клиент-серверная или опубликована на веб-сервере.

Отсюда главное правило программного запуска. Сервер не может прочитать C:\Users\buh\Desktop\Сверка.epf. Сначала двоичные данные файла передают на сервер через временное хранилище, а уже потом подключают.

Режим работыГде взять файлЧем подключать
Толстый клиент, обычное приложениепуть на диске клиентаВнешниеОбработки.Создать(Путь)
Тонкий клиент, клиент-серверная базавременное хранилищеВнешниеОбработки.Подключить(Адрес) на сервере
Веб-клиенттолько временное хранилищеВнешниеОбработки.Подключить(Адрес) на сервере
Файл уже лежит на сервере 1Спуть, доступный серверуНовый ДвоичныеДанные(Путь) → хранилище → Подключить

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

Порядок программного запуска обработки в управляемом приложении

Последовательность из пяти шагов подходит для тонкого, веб- и толстого клиента в режиме управляемого приложения.

  1. Получить файл на клиенте. Пользователь выбирает его в диалоге или путь известен заранее.
  2. Передать двоичные данные на сервер. Вызов НачатьПомещениеФайла кладёт файл во временное хранилище и возвращает адрес вида e1cib/tempstorage/....
  3. Подключить обработку на сервере. ВнешниеОбработки.Подключить(Адрес, , БезопасныйРежим) возвращает строку — имя, под которым обработка зарегистрирована в текущем сеансе.
  4. Вернуть имя на клиент. Серверная функция отдаёт строку, объект обработки на клиент не передаётся.
  5. Открыть форму через ОткрытьФорму("ВнешняяОбработка." + Имя + ".Форма") или выполнить экспортный метод модуля объекта на сервере.

Подключение действует до конца сеанса. Повторно передавать файл при каждом вызове не нужно: в другом серверном вызове того же сеанса объект создаётся по имени через ВнешниеОбработки.Создать(Имя).

Код запуска внешней обработки: синтаксис и примеры

Выбор файла пользователем (тонкий и веб-клиент)

Пример для формы, например обработки-«запускалки» или общей формы конфигурации. Код без модальных вызовов, работает в веб-клиенте.

&НаКлиенте
Процедура ЗапуститьОбработку(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
    // Пустое имя файла и Интерактивно = Истина: откроется диалог выбора
    НачатьПомещениеФайла(Оповещение, , "", Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    Если Не Результат Тогда
        Возврат; // пользователь отменил выбор
    КонецЕсли;
    ИмяОбработки = ПодключитьНаСервере(Адрес);
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");
КонецПроцедуры

&НаСервере
Функция ПодключитьНаСервере(Адрес)
    // Третий параметр — безопасный режим. Ложь снимает ограничения
    Возврат ВнешниеОбработки.Подключить(Адрес, , Ложь);
КонецФункции

Синтаксис метода: Подключить(АдресДвоичныхДанных, ИмяВнешнейОбработки, БезопасныйРежим, ОписаниеЗащитыОтОпасныхДействий). Обязателен только адрес. Второй параметр задаёт своё имя, если нужно держать в сеансе две версии одной обработки.

Если у обработки несколько форм, обращайтесь к нужной по имени: "ВнешняяОбработка." + Имя + ".Форма.ФормаНастроек". Суффикс .Форма без имени открывает основную форму.

Файл лежит на сервере или в справочнике

Когда обработка хранится в каталоге на сервере 1С, клиент вообще не участвует в передаче файла:

&НаСервере
Функция ПодключитьИзКаталога()
    ПутьКФайлу = "D:\1C\Обработки\ЗагрузкаПрайса.epf"; // путь виден процессу сервера 1С
    ДД = Новый ДвоичныеДанные(ПутьКФайлу);
    Адрес = ПоместитьВоВременноеХранилище(ДД, УникальныйИдентификатор);
    Возврат ВнешниеОбработки.Подключить(Адрес, , Ложь);
КонецФункции

Учётная запись, под которой работает служба сервера 1С, должна иметь право чтения этого каталога. Если файл хранится в реквизите типа ХранилищеЗначения, двоичные данные берут методом Получить() у значения реквизита, дальше всё то же самое.

Вызов экспортного метода без открытия формы

Обработку не обязательно показывать пользователю. В модуле объекта объявите процедуру или функцию со словом Экспорт:

// Модуль объекта внешней обработки
Функция ПересчитатьОстатки(ДатаРасчета) Экспорт
    Запрос = Новый Запрос("ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Всего ИЗ Справочник.Номенклатура");
    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    Возврат Выборка.Всего;
КонецФункции

Вызов из конфигурации или другой обработки, на сервере:

&НаСервере
Функция ВыполнитьРасчет(ИмяОбработки)
    Обработка = ВнешниеОбработки.Создать(ИмяОбработки); // имя из Подключить
    Возврат Обработка.ПересчитатьОстатки(ТекущаяДатаСеанса());
КонецФункции

Так запускают регламентные операции, пакетную загрузку, служебные исправления данных.

Обычное приложение, толстый клиент

В обычных формах код выполняется на клиенте с доступом к данным, поэтому файл открывают прямо по пути:

Обработка = ВнешниеОбработки.Создать("C:\Обработки\Сверка.epf", Ложь);
Обработка.ПолучитьФорму().Открыть();

Второй параметр — безопасный режим. Этот вариант не работает в тонком и веб-клиенте: там метода Создать с путём на клиенте нет.

Как передать параметры во внешнюю обработку

Есть три способа, выбор зависит от того, что запускается: форма или серверный код.

СпособКогда подходитОграничение
Параметры формынужно открыть форму с заполненными полямипараметры объявляют в форме обработки
Реквизиты объектасерверный расчёт без формыработает только в пределах одного серверного вызова
Параметры экспортного методавызов функции модуля объектаобработка должна быть написана под этот вызов

Через параметры формы

Откройте форму обработки в Конфигураторе, на закладке «Параметры» добавьте, например, Организация и Период. Затем:

&НаКлиенте
Процедура ОткрытьСПараметрами(ИмяОбработки)
    П = Новый Структура;
    П.Вставить("Организация", Объект.Организация);
    П.Вставить("Период", Объект.Дата);
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", П, ЭтаФорма);
КонецПроцедуры

В модуле формы обработки значения читают в ПриСозданииНаСервере:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("Организация") Тогда
        Объект.Организация = Параметры.Организация;
    КонецЕсли;
КонецПроцедуры

Необъявленный параметр в форму не попадёт. Структуру из десяти ключей можно передать, но в Параметры окажутся только те, что заведены на закладке «Параметры».

Через реквизиты объекта

Обработка = ВнешниеОбработки.Создать(ИмяОбработки);
Обработка.ДатаНачала = НачалоМесяца(ТекущаяДатаСеанса());
Обработка.ТолькоПроведенные = Истина;
Обработка.ВыполнитьЗагрузку(); // экспортная процедура модуля объекта

Объект живёт только внутри серверного вызова. На клиент его не вернуть, поэтому заполнение реквизитов и вызов метода пишите в одной серверной процедуре.

Программный запуск внешнего отчёта

Внешние отчёты подключаются той же парой методов, но у менеджера ВнешниеОтчеты. Префикс имени формы тоже другой:

&НаСервере
Функция ПодключитьОтчет(Адрес)
    Возврат ВнешниеОтчеты.Подключить(Адрес, , Ложь);
КонецФункции

&НаКлиенте
Процедура ОткрытьОтчет(ИмяОтчета)
    ОткрытьФорму("ВнешнийОтчет." + ИмяОтчета + ".Форма");
КонецПроцедуры

Чем отчёт отличается от обработки:

  • 📊 отчёт на системе компоновки данных открывается в стандартной форме отчёта, даже если своей формы в файле нет: платформа построит её по основной схеме;
  • 🧾 результат без формы получают методом СкомпоноватьРезультат объекта отчёта — так строят отчёт в табличный документ для рассылки или записи в файл;
  • ⚙️ настройки меняют через КомпоновщикНастроек объекта отчёта до формирования.

Сформировать внешний отчёт в табличный документ на сервере:

&НаСервере
Функция СформироватьОтчет(ИмяОтчета)
    Отчет = ВнешниеОтчеты.Создать(ИмяОтчета);
    ТабДок = Новый ТабличныйДокумент;
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    Отчет.СкомпоноватьРезультат(ТабДок, ДанныеРасшифровки);
    Возврат ТабДок;
КонецФункции

Табличный документ можно вернуть на клиент и показать в реквизите формы или сохранить в Excel методом Записать с нужным типом файла.

Отладка и обработка ошибок при запуске

Перехват исключений

Подключение падает, если файл битый, написан под другую конфигурацию или нарушает безопасный режим. Оберните вызов в Попытка и пишите подробности в журнал регистрации:

&НаСервере
Функция ПодключитьБезопасно(Адрес)
    Попытка
        Возврат ВнешниеОбработки.Подключить(Адрес, , Ложь);
    Исключение
        Подробно = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
        ЗаписьЖурналаРегистрации("ЗапускВнешнейОбработки",
            УровеньЖурналаРегистрации.Ошибка, , , Подробно);
        ВызватьИсключение "Не удалось подключить обработку. Подробности в журнале регистрации.";
    КонецПопытки;
КонецФункции

Пользователь увидит понятное сообщение, а администратор найдёт стек ошибки в журнале по событию ЗапускВнешнейОбработки.

Отладка в Конфигураторе

  1. Откройте файл .epf в Конфигураторе через Файл → Открыть.
  2. Расставьте точки останова в модуле объекта или формы.
  3. Запустите клиент из Конфигуратора в режиме отладки или подключитесь к уже запущенному сеансу через меню Отладка → Подключение.
  4. Для серверного кода в клиент-серверной базе сервер 1С должен работать с включённой отладкой (ключ -debug у службы агента сервера).

Надёжнее всего точки останова срабатывают, когда обработка подключена с того же пути, с которого открыта в Конфигураторе. При подключении через временное хранилище на время отладки положите файл в каталог, доступный серверу, и подключайте его оттуда.

Диагностика: выберите симптом

Безопасный режим, права и ограничения платформы

Безопасный режим

У Подключить и Создать безопасный режим по умолчанию включён. В нём код обработки не может:

  • 📂 читать и писать файлы на сервере;
  • 🔌 создавать COM-объекты и подключать внешние компоненты;
  • 🔓 включать привилегированный режим;
  • 🌐 выполнять ряд других действий, опасных для сервера.

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

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

Защита от опасных действий

В современных версиях 8.3 платформа предупреждает об опасных действиях при открытии внешних файлов. Для программного запуска предупреждение снимают четвёртым параметром:

Защита = Новый ОписаниеЗащитыОтОпасныхДействий;
Защита.ПредупреждатьОбОпасныхДействиях = Ложь;
ИмяОбработки = ВнешниеОбработки.Подключить(Адрес, , Ложь, Защита);

Для конкретного пользователя то же поведение настраивается флагом защиты от опасных действий в его свойствах в списке пользователей информационной базы.

Права пользователя

Для интерактивного открытия через Главное меню → Файл → Открыть нужны права «Интерактивное открытие внешних обработок» и «Интерактивное открытие внешних отчетов». В типовых конфигурациях их обычно дают только администраторам.

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

Регистрация в «Дополнительных отчётах и обработках»

В типовых решениях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) правильный путь для постоянно используемых обработок — регистрация в справочнике Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Обработка для этого должна содержать экспортную функцию СведенияОВнешнейОбработке() в модуле объекта.

Плюсы такой схемы:

  • ✅ файл хранится в базе и не теряется вместе с диском пользователя;
  • ✅ доступ раздают по пользователям и группам;
  • ✅ безопасный режим и разрешения задаются при регистрации, а не в коде;
  • ✅ из кода такую обработку подключают функцией БСП ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(Ссылка), которая возвращает то же имя для ОткрытьФорму.

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

Можно ли подключить внешнюю обработку один раз на весь день?
Нет. Подключение живёт в пределах сеанса. После перезапуска клиента обработку подключают заново.
Что будет, если подключить две разные обработки с одинаковым именем?
Вторая заменит первую в сеансе. Чтобы держать обе, передайте своё имя вторым параметром метода Подключить.
Работает ли программный запуск в базе, опубликованной в облаке или на веб-сервере?
Да, если файл передаётся через временное хранилище. Варианты с путём к файлу на компьютере пользователя там не работают.
Нужно ли пересобирать обработку после обновления конфигурации?
Только если она обращается к объектам или реквизитам, которые при обновлении переименовали или удалили. Остальной код продолжит работать.
Можно ли запустить внешнюю обработку из командной строки при старте 1С?
Да, ключом /Execute с путём к файлу .epf при запуске клиента. Обработка откроется сразу после входа в базу.