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

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

Как вызвать экспортную процедуру 1С

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

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

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

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

Что такое экспортная процедура и где она объявляется

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

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

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

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

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

// В общем модуле РаботаСЗаказами (флажок «Сервер» включен)

Процедура ПересчитатьСтатусЗаказа(ЗаказСсылка) Экспорт

// логика пересчёта

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

// Вызов из любого другого модуля:

РаботаСЗаказами.ПересчитатьСтатусЗаказа(МойЗаказ);

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

Вызов экспортной процедуры модуля объекта

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

ЗаказОбъект = ЗаказСсылка.ПолучитьОбъект();

ЗаказОбъект.ЗаполнитьПоУмолчанию(); // экспортная процедура модуля объекта

Экспортные процедуры модуля менеджера вызываются через менеджер объекта: Справочники.Номенклатура.ИмяПроцедуры() или Документы.Заказ.ИмяПроцедуры(). Такой приём удобен, когда метод работает с коллекцией объектов в целом, а не с конкретным экземпляром.

Вызов из внешней обработки

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

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

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

Обработка.ВыполнитьЗагрузку(ПараметрыЗагрузки); // экспортная процедура модуля объекта обработки

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

Вызов через оператор «Выполнить» и извне базы

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

ИмяМетода = "РаботаСЗаказами.ПересчитатьСтатусЗаказа(Параметры.Заказ)";

Выполнить(ИмяМетода);

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

Для вызова из другой базы 1С используют COM-соединение (V83.COMConnector): устанавливают соединение, получают объект нужного типа и вызывают экспортные методы модулей, доступных во внешнем соединении. Обратите внимание: по COM доступен только серверный контекст, а общие модули должны иметь флаг «Внешнее соединение».

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

Проверка результата и типичные ошибки

После вызова убедитесь, что процедура реально отработала: проверьте изменённые данные запросом, возвращаемое значение функции или записи в журнале регистрации. Если процедура работает молча и ничего не возвращает, добавьте временное логирование через ЗаписьЖурналаРегистрации — это безопаснее отладки на рабочей базе.

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

Отдельная группа проблем — права доступа. Если у пользователя нет права на общий модуль или на объект, чьи методы вызываются, вызов завершится ошибкой нарушения прав. Проверяйте роли в конфигураторе, а не только текст кода.

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

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

Сообщения об ошибках
Норма

Вызов завершился без исключений, код после вызова выполнился

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

Исключение «Процедура не определена» или «Метод объекта не обнаружен»

Возвращаемое значение функции
Норма

Функция вернула ожидаемое значение ожидаемого типа

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

Возвращено Неопределено или значение другого типа

Изменение данных
Норма

Запрос к базе показывает ожидаемые изменения

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

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

FAQ

Чем экспортная процедура отличается от обычной?

Обычная процедура видна только внутри своего модуля. Ключевое слово «Экспорт» делает метод доступным для вызова из других модулей, внешних обработок и внешних соединений — то есть формирует программный интерфейс модуля.

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

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

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

Чаще всего причины: в объявлении процедуры нет слова «Экспорт», опечатка в имени модуля или метода, либо общий модуль недоступен в текущем контексте (например, серверный модуль вызывается из тонкого клиента).

Как вызвать экспортную процедуру внешней обработки?

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

Работает ли оператор Выполнить в безопасном режиме?

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

Можно ли вызвать экспортную процедуру из другой базы 1С?

Да, через COM-соединение или HTTP-сервис. При COM-вызове общий модуль должен иметь флаг «Внешнее соединение», а вызов выполняется только в серверном контексте. Более управляемый вариант — опубликовать HTTP-сервис с явным набором операций.

Итог

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

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