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

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

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

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

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

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

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

Как устроен вызов: объект обработки и экспортные процедуры

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

Чтобы процедура была видна снаружи, она должна быть объявлена с ключевым словом Экспорт:

Процедура ЗаполнитьДанные(ПараметрыЗаполнения) Экспорт

// логика процедуры

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

Если слово Экспорт опущено, процедура считается приватной, и попытка вызвать её извне завершится ошибкой «Процедура или функция с указанным именем не определена». Это самая частая причина, почему «вызов не работает», хотя код написан верно.

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

Если обработка добавлена в конфигурацию (ветка «Обработки» в дереве конфигуратора), объект создаётся через менеджер обработок:

ОбъектОбработки = Обработки.МояОбработка.Создать();

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

Метод Создать() выполняется на сервере. Если вызов происходит из клиентской процедуры формы, оберните его в серверную процедуру с директивой &НаСервере — либо в модуле формы, либо в общем серверном модуле.

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

Вызов процедуры из внешней обработки (файл .epf)

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

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

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

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

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

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

Модуль формы — отдельный контекст, и процедуры модуля объекта в нём напрямую недоступны. В управляемой форме получить объект обработки можно через реквизит формы типа «ОбработкаОбъект»:

&НаСервере

Процедура ВыполнитьНаСервере()

ОбъектОбработки = РеквизитФормыВЗначение("Объект");

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

ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");

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

Здесь «Объект» — стандартный основной реквизит формы обработки. Обратный вызов ЗначениеВРеквизитФормы нужен, если процедура изменила данные объекта и эти изменения должны отразиться в форме.

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

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

Клиент или сервер: где выполнять вызов

Модуль объекта обработки исполняется только на сервере. Из клиентской процедуры (&НаКлиенте) прямой вызов Обработки.Имя.Создать() приведёт к ошибке компиляции или выполнения. Правильная схема — клиентская процедура вызывает серверную, а уже та создаёт объект и вызывает нужную процедуру.

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

Маршрут решения

Как выбрать способ вызова

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

Типичные ошибки и их причины

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

«Метод объекта не обнаружен (Создать)» — вызов ВнешниеОбработки.Создать() выполняется на тонком клиенте без серверного контекста или обработка указана с неверным именем. Для встроенных обработок имя должно точно совпадать с именем в конфигураторе.

«Файл не обнаружен» — путь к .epf задан относительно клиентского компьютера, а код выполняется на сервере. Передайте файл во временное хранилище или разместите его в каталоге, доступном серверу.

Данные формы не обновились после вызова — объект обработки изменён, но не выполнен обратный перенос через ЗначениеВРеквизитФормы. Проверьте, что после вызова процедуры реквизит формы обновляется.

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

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

После вызова убедитесь, что процедура реально отработала: поставьте точку останова внутри процедуры модуля обработки и запустите отладку. Если точка не срабатывает — объект создаётся, но вызов не доходит: проверяйте имя процедуры, наличие Экспорт и контекст выполнения.

Для внешних обработок при отладке файл .epf должен быть открыт в конфигураторе, а в настройках отладки включён пункт «Внешние обработки». Иначе точки останова внутри внешней обработки игнорируются.

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

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

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

Точка останова внутри процедуры
Норма

Отладчик останавливается в модуле обработки

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

Точка не срабатывает — проверяйте Экспорт и контекст вызова

Данные после вызова
Норма

Реквизиты объекта и формы содержат обновлённые значения

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

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

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

Нет ошибок выполнения и доступа

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

Ошибки прав или «метод не обнаружен» — проверяйте права и имя процедуры

Итог

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

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

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

Можно ли вызвать процедуру обработки напрямую, как из общего модуля?

Нет. Модуль объекта обработки — это контекст экземпляра, а не статический модуль. Сначала создаётся объект через Создать(), и только через него доступны экспортные процедуры. Если нужен вызов «по имени», перенесите код в общий модуль.

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

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

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

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

Работает ли ВнешниеОбработки.Создать() в безопасном режиме?

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

Как передать параметры в процедуру и получить результат?

Параметры передаются как в обычный вызов: ОбъектОбработки.ИмяПроцедуры(Параметр1, Параметр2). Для возврата результата объявляйте функцию с Экспорт и используйте Возврат, либо передавайте параметр по ссылке (Знач) и читайте изменения после вызова.