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