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

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

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

Как в 1С запустить внешнюю обработку программно: ВнешниеОбработки.Создать, ОткрытьФорму, фоновое выполнение. Примеры кода, ошибки и проверка результата.

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

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

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

Создание объекта обработки без открытия формы

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

Обработка = ВнешниеОбработки.Создать("C:\Обработки\ЗагрузкаДанных.epf", Ложь);

Обработка.ВыполнитьЗагрузку(ПараметрыЗагрузки);

Второй параметр метода Создать() — признак безопасного режима. Значение Истина включает безопасный режим: обработка не сможет обращаться к файловой системе, COM-объектам и внешним компонентам. Если обработка получена из недоверенного источника, безопасный режим обязателен.

Обратите внимание: вызывать можно только экспортные процедуры и функции модуля объекта обработки (с ключевым словом Экспорт). Обращение к реквизитам обработки возможно, если они объявлены, но элементы формы из этого контекста недоступны — форма просто не создана.

Открытие формы внешней обработки в управляемом приложении

В управляемом приложении метод ВнешниеОбработки.Создать() доступен только на сервере, а открытие формы выполняется на клиенте. Чтобы открыть форму внешней обработки, её сначала подключают к сеансу, получая имя в дереве метаданных, а затем вызывают ОткрытьФорму().

&НаСервере

Функция ПодключитьОбработку(ПутьКФайлу)

Возврат ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь);

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

&НаКлиенте

Процедура ОткрытьОбработку(Команда)

ИмяОбработки = ПодключитьОбработку("C:\Обработки\Анализ.epf");

ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");

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

Метод Подключить() возвращает автоматически сгенерированное имя, под которым обработка зарегистрирована в сеансе. Именно это имя подставляется в путь формы. Если у обработки несколько форм, указывается имя конкретной формы; если основная форма одна, достаточно «.Форма».

Через параметры ОткрытьФорму() можно передать структуру с настройками — обработка получит их в обработчике ПриСозданииНаСервере через Параметры. Это удобный способ открыть обработку сразу в нужном контексте, например с отбором по документу.

Запуск в обычном приложении и через файл

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

Обработка = ВнешниеОбработки.Создать("C:\Обработки\Анализ.epf");

ФормаОбработки = Обработка.ПолучитьФорму();

ФормаОбработки.Открыть();

Этот подход до сих пор встречается в старых конфигурациях на поддержке. Ограничение очевидно: код не будет работать в тонком и веб-клиенте, поэтому для новых разработок его применять не стоит.

Передача файла с клиента на сервер

Если файл обработки выбирает пользователь на своём компьютере, а выполнение должно идти на сервере, файл сначала помещают во временное хранилище через НачатьПомещениеФайла(), затем на сервере записывают во временный файл и уже его передают в Создать(). Прямой путь «C:\...» с клиентской машины серверу недоступен — это одна из самых частых причин ошибки «файл не найден».

Порядок действий при передаче файла с клиента
  1. 1
    На клиенте вызовите НачатьПомещениеФайла и получите адрес во временном хранилище
  2. 2
    На сервере извлеките данные через ПолучитьИзВременногоХранилища
  3. 3
    Запишите двоичные данные во временный файл: ПолучитьИмяВременногоФайла("epf")
  4. 4
    Передайте путь к временному файлу в ВнешниеОбработки.Создать()
  5. 5
    После выполнения удалите временный файл и освободите хранилище

Фоновое и регламентное выполнение обработки

Длительные операции — загрузку прайсов, пересчёт данных, массовую обработку документов — следует выполнять в фоне, чтобы не блокировать сеанс пользователя. Внешняя обработка при этом запускается внутри фонового задания через ФоновыеЗадания.Выполнить().

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

Процедура ВыполнитьВнешнююОбработку(ПутьКФайлу, ПараметрыЗапуска) Экспорт

Обработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);

Обработка.ВыполнитьОсновнуюОперацию(ПараметрыЗапуска);

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

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

Безопасный режим и права доступа

Запуск внешнего кода — потенциально опасная операция, и платформа предоставляет несколько уровней защиты. Во-первых, у пользователя должно быть право «Интерактивное открытие внешних обработок» (и отдельное право на программное открытие). Во-вторых, параметр безопасного режима ограничивает возможности исполняемого кода.

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

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

Сравнение способов запуска

ВнешниеОбработки.Создать()

Выполнение серверной логики без интерфейса. Требует доступа сервера к файлу, форма недоступна.

Подключить + ОткрытьФорму

Интерактивная работа пользователя в управляемом приложении. Два вызова: серверный и клиентский.

ПолучитьФорму + Открыть

Только обычное приложение (толстый клиент). Просто, но не работает в тонком и веб-клиенте.

Фоновое задание

Длительные операции без блокировки сеанса. Требует общего модуля-обёртки, нет интерфейса.

Типичные ошибки и их диагностика

Большинство проблем при программном запуске обработок сводится к нескольким повторяющимся причинам. Знание их экономит часы отладки.

  • «Файл не обнаружен» — путь указан относительно клиента, а код выполняется на сервере, либо у агента сервера нет прав на каталог.
  • «Метод объекта не обнаружен» — вызываемая процедура в модуле обработки не экспортная или опечатка в имени.
  • «Нарушение прав доступа» — у пользователя нет права на открытие внешних обработок.
  • Ошибка при ОткрытьФорму — обработка не подключена через Подключить() в текущем сеансе, либо указано неверное имя формы.
  • Обработка «молчит» в фоне — исключение в фоновом задании видно только в журнале регистрации, а не у пользователя.

Для диагностики всегда оборачивайте вызов в попытку/исключение и записывайте ОписаниеОшибки() в журнал регистрации через ЗаписьЖурналаРегистрации(). Без этого фоновые запуски отлаживать практически невозможно.

Типичные ошибки
01
Передача клиентского пути C:\ в серверный вызов Создать() — файл не найден, так как сервер не видит диск клиента
02
Вызов неэкспортной процедуры модуля обработки — ошибка «Метод объекта не обнаружен»
03
Открытие формы без предварительного Подключить() в управляемом приложении — форма не найдена
04
Запуск сторонней обработки без безопасного режима — риск повреждения данных вредоносным кодом
05
Отсутствие логирования ошибок в фоновом задании — сбои остаются незамеченными

Как проверить, что обработка отработала корректно

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

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

Контрольные точки

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

Журнал регистрации
Норма

Есть информационная запись о завершении без ошибок

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

Записи уровня «Ошибка» с текстом исключения

Возвращаемое значение
Норма

Структура с признаком Успех = Истина и ожидаемой статистикой

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

Неопределено или пустой результат без пояснений

Данные в базе
Норма

Созданные/изменённые объекты присутствуют и корректны

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

Данных нет или они частично записаны

Состояние фонового задания
Норма

Статус «Завершено»

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

«Ошибка» или зависшее «Активно»

Если обработка изменяет данные, выполняйте первый запуск в тестовой копии базы и сверяйте результат выборочно, по нескольким объектам. Для массовых операций полезно сначала запускать обработку в режиме «только проверка без записи», если такой режим предусмотрен.

Итог

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

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

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

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

Да, частично. Файл можно поместить во временное хранилище, извлечь на сервере во временный файл через ПолучитьИмяВременногоФайла("epf") и передать этот путь в Создать(). Полностью «из памяти» платформа внешние обработки не создаёт — файл должен существовать в файловой системе сервера хотя бы временно.

Почему ВнешниеОбработки.Создать() выдаёт ошибку в тонком клиенте?

В управляемом приложении этот метод доступен только в серверном контексте. Вынесите вызов в серверную процедуру (директива &НаСервере или серверный общий модуль), а с клиента передавайте только параметры. Для интерактивной работы используйте связку Подключить() на сервере и ОткрытьФорму() на клиенте.

Как передать параметры в запускаемую обработку?

Два способа. При вызове экспортной процедуры объекта параметры передаются как обычные аргументы функции. При открытии формы параметры передаются структурой вторым аргументом ОткрытьФорму() и доступны в обработчике ПриСозданииНаСервере через коллекцию Параметры — при этом в форме обработки должны быть объявлены соответствующие параметры формы.

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

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

Что делать, если обработка требует прав, которых нет у пользователя?

Код обработки выполняется с правами текущего пользователя, и платформа это не обходит. Варианты: выполнение в привилегированном модуле (УстановитьПривилегированныйРежим) для операций с данными, запуск от имени служебного пользователя через регламентное задание или выдача пользователю необходимых ролей. Выбор зависит от того, какие именно операции блокируются.

Как узнать, почему фоновый запуск обработки завершился ошибкой?

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