Как открыть файл .epf из кода: Подключить, Создать и форма обработки
Содержание
Чтобы запустить внешнюю обработку
в 1С программно, в управляемом приложении нужно три действия: поместить файл .epf во временное хранилище, на сервере вызвать ВнешниеОбработки.Подключить(Адрес, , Ложь) и на клиенте открыть форму по имени "ВнешняяОбработка." + Имя + ".Форма". В толстом клиенте обычного приложения хватает одной строки ВнешниеОбработки.Создать(ПутьКФайлу).
Схема одинакова для 1С:Бухгалтерии, ЗУП, УТ и любой другой конфигурации на платформе 8.3: это механизм платформы, а не прикладного решения. Ниже рабочий код для каждого варианта, передача параметров, внешние отчёты, отладка и ограничения безопасного режима.
Как устроена внешняя обработка и где выполняется её код
Внешняя обработка — это файл .epf, внешний отчёт — файл .erf. Внутри модуль объекта, формы, макеты. В конфигурацию файл не встраивается, поэтому его можно менять без обновления базы.
Код такого файла живёт по тем же правилам «клиент — сервер», что и код конфигурации:
- 🖥️ модуль объекта выполняется на сервере, там работают запросы и запись данных;
- 🪟 модуль формы делится на
&НаКлиентеи&НаСервере; - 📁 файл на диске пользователя серверу не виден, если база клиент-серверная или опубликована на веб-сервере.
Отсюда главное правило программного запуска. Сервер не может прочитать C:\Users\buh\Desktop\Сверка.epf. Сначала двоичные данные файла передают на сервер через временное хранилище, а уже потом подключают.
| Режим работы | Где взять файл | Чем подключать |
|---|---|---|
| Толстый клиент, обычное приложение | путь на диске клиента | ВнешниеОбработки.Создать(Путь) |
| Тонкий клиент, клиент-серверная база | временное хранилище | ВнешниеОбработки.Подключить(Адрес) на сервере |
| Веб-клиент | только временное хранилище | ВнешниеОбработки.Подключить(Адрес) на сервере |
| Файл уже лежит на сервере 1С | путь, доступный серверу | Новый ДвоичныеДанные(Путь) → хранилище → Подключить |
В файловой базе с тонким клиентом сервер и клиент работают в одном процессе, и путь к файлу иногда «срабатывает» напрямую. На это не рассчитывайте: после переноса базы на сервер такой код перестанет работать.
Порядок программного запуска обработки в управляемом приложении
Последовательность из пяти шагов подходит для тонкого, веб- и толстого клиента в режиме управляемого приложения.
- Получить файл на клиенте. Пользователь выбирает его в диалоге или путь известен заранее.
- Передать двоичные данные на сервер. Вызов
НачатьПомещениеФайлакладёт файл во временное хранилище и возвращает адрес видаe1cib/tempstorage/.... - Подключить обработку на сервере.
ВнешниеОбработки.Подключить(Адрес, , БезопасныйРежим)возвращает строку — имя, под которым обработка зарегистрирована в текущем сеансе. - Вернуть имя на клиент. Серверная функция отдаёт строку, объект обработки на клиент не передаётся.
- Открыть форму через
ОткрытьФорму("ВнешняяОбработка." + Имя + ".Форма")или выполнить экспортный метод модуля объекта на сервере.
Подключение действует до конца сеанса. Повторно передавать файл при каждом вызове не нужно: в другом серверном вызове того же сеанса объект создаётся по имени через ВнешниеОбработки.Создать(Имя).
Код запуска внешней обработки: синтаксис и примеры
Выбор файла пользователем (тонкий и веб-клиент)
Пример для формы, например обработки-«запускалки» или общей формы конфигурации. Код без модальных вызовов, работает в веб-клиенте.
&НаКлиенте
Процедура ЗапуститьОбработку(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
// Пустое имя файла и Интерактивно = Истина: откроется диалог выбора
НачатьПомещениеФайла(Оповещение, , "", Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат; // пользователь отменил выбор
КонецЕсли;
ИмяОбработки = ПодключитьНаСервере(Адрес);
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");
КонецПроцедуры
&НаСервере
Функция ПодключитьНаСервере(Адрес)
// Третий параметр — безопасный режим. Ложь снимает ограничения
Возврат ВнешниеОбработки.Подключить(Адрес, , Ложь);
КонецФункции
Синтаксис метода: Подключить(АдресДвоичныхДанных, ИмяВнешнейОбработки, БезопасныйРежим, ОписаниеЗащитыОтОпасныхДействий). Обязателен только адрес. Второй параметр задаёт своё имя, если нужно держать в сеансе две версии одной обработки.
Если у обработки несколько форм, обращайтесь к нужной по имени: "ВнешняяОбработка." + Имя + ".Форма.ФормаНастроек". Суффикс .Форма без имени открывает основную форму.
Файл лежит на сервере или в справочнике
Когда обработка хранится в каталоге на сервере 1С, клиент вообще не участвует в передаче файла:
&НаСервере
Функция ПодключитьИзКаталога()
ПутьКФайлу = "D:\1C\Обработки\ЗагрузкаПрайса.epf"; // путь виден процессу сервера 1С
ДД = Новый ДвоичныеДанные(ПутьКФайлу);
Адрес = ПоместитьВоВременноеХранилище(ДД, УникальныйИдентификатор);
Возврат ВнешниеОбработки.Подключить(Адрес, , Ложь);
КонецФункции
Учётная запись, под которой работает служба сервера 1С, должна иметь право чтения этого каталога. Если файл хранится в реквизите типа ХранилищеЗначения, двоичные данные берут методом Получить() у значения реквизита, дальше всё то же самое.
Вызов экспортного метода без открытия формы
Обработку не обязательно показывать пользователю. В модуле объекта объявите процедуру или функцию со словом Экспорт:
// Модуль объекта внешней обработки
Функция ПересчитатьОстатки(ДатаРасчета) Экспорт
Запрос = Новый Запрос("ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Всего ИЗ Справочник.Номенклатура");
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Всего;
КонецФункции
Вызов из конфигурации или другой обработки, на сервере:
&НаСервере
Функция ВыполнитьРасчет(ИмяОбработки)
Обработка = ВнешниеОбработки.Создать(ИмяОбработки); // имя из Подключить
Возврат Обработка.ПересчитатьОстатки(ТекущаяДатаСеанса());
КонецФункции
Так запускают регламентные операции, пакетную загрузку, служебные исправления данных.
Обычное приложение, толстый клиент
В обычных формах код выполняется на клиенте с доступом к данным, поэтому файл открывают прямо по пути:
Обработка = ВнешниеОбработки.Создать("C:\Обработки\Сверка.epf", Ложь);
Обработка.ПолучитьФорму().Открыть();
Второй параметр — безопасный режим. Этот вариант не работает
в тонком и веб-клиенте: там метода Создать с путём на клиенте нет.
Как передать параметры во внешнюю обработку
Есть три способа, выбор зависит от того, что запускается: форма или серверный код.
| Способ | Когда подходит | Ограничение |
|---|---|---|
| Параметры формы | нужно открыть форму с заполненными полями | параметры объявляют в форме обработки |
| Реквизиты объекта | серверный расчёт без формы | работает только в пределах одного серверного вызова |
| Параметры экспортного метода | вызов функции модуля объекта | обработка должна быть написана под этот вызов |
Через параметры формы
Откройте форму обработки в Конфигураторе, на закладке «Параметры» добавьте, например, Организация и Период. Затем:
&НаКлиенте
Процедура ОткрытьСПараметрами(ИмяОбработки)
П = Новый Структура;
П.Вставить("Организация", Объект.Организация);
П.Вставить("Период", Объект.Дата);
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", П, ЭтаФорма);
КонецПроцедуры
В модуле формы обработки значения читают в ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Организация") Тогда
Объект.Организация = Параметры.Организация;
КонецЕсли;
КонецПроцедуры
Необъявленный параметр в форму не попадёт. Структуру из десяти ключей можно передать, но в Параметры окажутся только те, что заведены на закладке «Параметры».
Через реквизиты объекта
Обработка = ВнешниеОбработки.Создать(ИмяОбработки);
Обработка.ДатаНачала = НачалоМесяца(ТекущаяДатаСеанса());
Обработка.ТолькоПроведенные = Истина;
Обработка.ВыполнитьЗагрузку(); // экспортная процедура модуля объекта
Объект живёт только внутри серверного вызова. На клиент его не вернуть, поэтому заполнение реквизитов и вызов метода пишите в одной серверной процедуре.
Программный запуск внешнего отчёта
Внешние отчёты подключаются той же парой методов, но у менеджера ВнешниеОтчеты. Префикс имени формы тоже другой:
&НаСервере
Функция ПодключитьОтчет(Адрес)
Возврат ВнешниеОтчеты.Подключить(Адрес, , Ложь);
КонецФункции
&НаКлиенте
Процедура ОткрытьОтчет(ИмяОтчета)
ОткрытьФорму("ВнешнийОтчет." + ИмяОтчета + ".Форма");
КонецПроцедуры
Чем отчёт отличается от обработки:
- 📊 отчёт на системе компоновки данных открывается в стандартной форме отчёта, даже если своей формы в файле нет: платформа построит её по основной схеме;
- 🧾 результат без формы получают методом
СкомпоноватьРезультатобъекта отчёта — так строят отчёт в табличный документ для рассылки или записи в файл; - ⚙️ настройки меняют через
КомпоновщикНастроекобъекта отчёта до формирования.
Сформировать внешний отчёт в табличный документ на сервере:
&НаСервере
Функция СформироватьОтчет(ИмяОтчета)
Отчет = ВнешниеОтчеты.Создать(ИмяОтчета);
ТабДок = Новый ТабличныйДокумент;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
Отчет.СкомпоноватьРезультат(ТабДок, ДанныеРасшифровки);
Возврат ТабДок;
КонецФункции
Табличный документ можно вернуть на клиент и показать в реквизите формы или сохранить в Excel методом Записать с нужным типом файла.
Отладка и обработка ошибок при запуске
Перехват исключений
Подключение падает, если файл битый, написан под другую конфигурацию или нарушает безопасный режим. Оберните вызов в Попытка и пишите подробности в журнал регистрации:
&НаСервере
Функция ПодключитьБезопасно(Адрес)
Попытка
Возврат ВнешниеОбработки.Подключить(Адрес, , Ложь);
Исключение
Подробно = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("ЗапускВнешнейОбработки",
УровеньЖурналаРегистрации.Ошибка, , , Подробно);
ВызватьИсключение "Не удалось подключить обработку. Подробности в журнале регистрации.";
КонецПопытки;
КонецФункции
Пользователь увидит понятное сообщение, а администратор найдёт стек ошибки в журнале по событию ЗапускВнешнейОбработки.
Отладка в Конфигураторе
- Откройте файл
.epfв Конфигураторе черезФайл → Открыть. - Расставьте точки останова в модуле объекта или формы.
- Запустите клиент из Конфигуратора в режиме отладки или подключитесь к уже запущенному сеансу через меню
Отладка → Подключение. - Для серверного кода в клиент-серверной базе сервер 1С должен работать с включённой отладкой (ключ
-debugу службы агента сервера).
Надёжнее всего точки останова срабатывают, когда обработка подключена с того же пути, с которого открыта в Конфигураторе. При подключении через временное хранилище на время отладки положите файл в каталог, доступный серверу, и подключайте его оттуда.
Безопасный режим, права и ограничения платформы
Безопасный режим
У Подключить и Создать безопасный режим по умолчанию включён. В нём код обработки не может:
- 📂 читать и писать файлы на сервере;
- 🔌 создавать COM-объекты и подключать внешние компоненты;
- 🔓 включать привилегированный режим;
- 🌐 выполнять ряд других действий, опасных для сервера.
Обращение к запрещённому методу вызывает исключение во время выполнения, а не при подключении. Поэтому обработка «подключилась нормально и упала на середине» — типичный симптом безопасного режима.
Отключайте безопасный режим только для файлов из проверенного источника. Внешняя обработка выполняется с правами текущего пользователя и при снятых ограничениях может изменить или удалить любые доступные ему данные.
Защита от опасных действий
В современных версиях 8.3 платформа предупреждает об опасных действиях при открытии внешних файлов. Для программного запуска предупреждение снимают четвёртым параметром:
Защита = Новый ОписаниеЗащитыОтОпасныхДействий;
Защита.ПредупреждатьОбОпасныхДействиях = Ложь;
ИмяОбработки = ВнешниеОбработки.Подключить(Адрес, , Ложь, Защита);
Для конкретного пользователя то же поведение настраивается флагом защиты от опасных действий в его свойствах в списке пользователей информационной базы.
Права пользователя
Для интерактивного открытия через Главное меню → Файл → Открыть нужны права «Интерактивное открытие внешних обработок» и «Интерактивное открытие внешних отчетов». В типовых конфигурациях их обычно дают только администраторам.
Программный запуск из кода конфигурации этими правами не ограничивается: проверка относится к интерактивному открытию. Значит, ответственность переходит к коду, который подключает файл. Не давайте пользователю «запускалку», которая подключает любой выбранный файл без безопасного режима.
Регистрация в «Дополнительных отчётах и обработках»
В типовых решениях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) правильный путь для постоянно используемых обработок — регистрация в справочнике Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Обработка для этого должна содержать экспортную функцию СведенияОВнешнейОбработке() в модуле объекта.
Плюсы такой схемы:
- ✅ файл хранится в базе и не теряется вместе с диском пользователя;
- ✅ доступ раздают по пользователям и группам;
- ✅ безопасный режим и разрешения задаются при регистрации, а не в коде;
- ✅ из кода такую обработку подключают функцией БСП
ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(Ссылка), которая возвращает то же имя дляОткрытьФорму.