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

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

Как вызвать процедуру из модуля внешней обработки в 1С

Как вызвать процедуру из модуля внешней обработки 1С: ПолучитьФорму, Создать, экспортные процедуры, работа на сервере и в БСП. Примеры кода и разбор ошибок.

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

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

Ниже разобраны основные сценарии: вызов через создание объекта обработки, вызов через форму, работа на сервере, подключение через механизмы БСП, типичные ошибки и ограничения безопасности.

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

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

Второе правило — экспортность. Только процедуры и функции, объявленные с ключевым словом Экспорт, можно вызвать снаружи. Если слово Экспорт отсутствует, попытка обращения вызовет ошибку «Метод объекта не обнаружен».

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

Вызов процедуры из модуля объекта обработки

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

Процедура ВыполнитьОбмен(Параметр1) Экспорт

// логика обработки

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

Вызов из кода конфигурации (например, из общего модуля или кнопки формы):

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

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

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

Аналогично работают функции: Результат = Обработка.РассчитатьИтог(Данные);. Возвращаемое значение передаётся как обычно. Учитывайте, что между сервером и клиентом передаются только сериализуемые типы — произвольные объекты обработки через границу контекста не передадите.

1c
Обработка = ВнешниеОбработки.Создать("C:\Обработки\МояОбработка.epf");
Результат = Обработка.ВыполнитьОбмен(Параметр);

Вызов процедуры из модуля формы обработки

Если нужная процедура находится в модуле формы, объект обработки не поможет — нужно получить саму форму. В обычном приложении используется метод ПолучитьФорму():

ФормаОбработки = ВнешниеОбработки.ПолучитьФорму("C:\Обработки\МояОбработка.epf");

ФормаОбработки.МояПроцедура(Параметр);

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

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

Вызов на сервере и в тонком клиенте

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

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

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

Порядок действий для вызова на сервере
  1. 1
    Убедитесь, что процедура в модуле объекта обработки объявлена с Экспорт
  2. 2
    Создайте в конфигурации общий модуль с признаком «Сервер»
  3. 3
    В нём напишите функцию, которая вызывает ВнешниеОбработки.Создать() и нужный метод
  4. 4
    Из клиентского кода вызовите эту серверную функцию и передайте параметры
  5. 5
    Проверьте, что возвращаемое значение относится к сериализуемым типам

Работа через механизм дополнительных отчетов и обработок БСП

В конфигурациях на базе библиотеки стандартных подсистем (1С:БСП) внешние обработки обычно подключаются через «Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки». В этом случае обработка хранится в базе, и путь к файлу не нужен.

Для программного вызова используется общий модуль ДополнительныеОтчетыИОбработки. Например, функция создания объекта выглядит как ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаЭлемент), где параметр — ссылка на элемент справочника дополнительных обработок. Дальше вызов экспортных процедур выполняется через точку, как обычно.

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

Типичные ошибки и их устранение

Самая частая ошибка — «Метод объекта не обнаружен». Причины: забыто слово Экспорт, опечатка в имени процедуры, либо процедура находится в модуле формы, а вызов идёт через объект обработки (или наоборот). Проверяйте место объявления метода и точность имени.

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

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

Типичные ошибки
01
Вызов процедуры без Экспорт — ошибка «Метод объекта не обнаружен»
02
Создание объекта по пути файла в клиентском коде тонкого клиента — файл ищется на компьютере пользователя
03
Попытка вызвать процедуру модуля формы через объект обработки — метод не находится
04
Возврат объекта обработки с сервера на клиент — ошибка передачи данных между контекстами
05
Игнорирование безопасного режима — обработка не создаётся в файловой базе с защитой от опасных действий

Проверка результата и отладка

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

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

Если обработка вызывается из регламентного задания, помните, что фоновое задание исполняется на сервере под служебным пользователем: интерактивные вызовы (вопросы, предупреждения, открытие форм) в вызываемых процедурах недопустимы и приведут к ошибке.

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

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

Процедура вызвана
Норма

Сработала точка останова или появилась запись в журнале регистрации

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

Ошибка «Метод объекта не обнаружен» или тишина — вызов не дошёл

Параметры переданы
Норма

В отладчике значения параметров соответствуют ожидаемым

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

Параметры неопределены или другого типа — проверьте сериализацию

Контекст исполнения
Норма

Код выполняется на сервере, файл найден

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

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

Часто задаваемые вопросы

Можно ли вызвать процедуру внешней обработки, не создавая её объект?

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

Почему возникает ошибка «Метод объекта не обнаружен», хотя процедура есть?

Чаще всего в объявлении процедуры отсутствует ключевое слово Экспорт. Реже — процедура находится не в том модуле (форма вместо объекта) или в имени метода опечатка. Проверьте также, что вы работаете с актуальной версией файла обработки.

Как вызвать процедуру обработки из регламентного задания?

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

Можно ли передать в процедуру обработки таблицу значений?

Да, если вызов происходит в одном контексте (например, полностью на сервере) — таблица значений передаётся по ссылке как обычный параметр. При передаче между клиентом и сервером таблицу нужно преобразовать, например, в массив структур или использовать сериализуемые типы.

Чем вызов через БСП лучше вызова по пути к файлу?

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

Работает ли вызов в обычном приложении так же, как в управляемом?

Создание объекта обработки работает одинаково. Различия касаются форм: в обычном приложении ПолучитьФорму() позволяет напрямую вызывать экспортные методы формы, а в управляемом приложении формы изолированы, и для взаимодействия используются оповещения.

Итог

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

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