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

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

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

Как вызвать экспортную функцию в 1С: синтаксис Экспорт, вызов из общих модулей, модулей объектов и внешних обработок. Примеры кода, ошибки и проверка результата.

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

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

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

Как объявить экспортную функцию

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

Функция ПолучитьКурсВалюты(КодВалюты, НаДату) Экспорт

// тело функции

Возврат Курс;

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

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

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

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

Самый частый сценарий — вызов функции, размещённой в общем модуле. Обращение выполняется по имени модуля без создания экземпляров: РаботаСКурсамиВалют.ПолучитьКурсВалюты("USD", ТекущаяДатаСеанса()). Имя модуля становится пространством имён, а точка отделяет его от имени метода.

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

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

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

Вызов экспортных методов модулей объектов и менеджеров

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

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

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

Вызов функции из внешней обработки или отчёта

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

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

Результат = Обработка.ЗагрузитьДанные(НачалоМесяца(ТекущаяДатаСеанса()));

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

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

bsl
Функция СведенияОВнешнейОбработке() Экспорт
    Сведения = Новый Структура;
    Сведения.Вставить("Вид", "ЗаполнениеОбъекта");
    Сведения.Вставить("Версия", "1.0");
    Возврат Сведения;
КонецФункции

Вызов между формами и через Выполнить/ОценитьВыражение

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

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

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

Сравнение вариантов

Статический вызов ИмяМодуля.Функция()

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

ОценитьВыражение()

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

Оповещения между формами

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

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

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

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

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

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

Как проверить, что вызов работает

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

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

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

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

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

Проверка конфигурации после добавления вызова
Норма

Ошибок «не определена» нет, модуль компилируется

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

Сообщения о неопределённой процедуре или недоступном контексте

Отладка вызова
Норма

Точка останова внутри функции срабатывает, параметры заполнены ожидаемо

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

Управление в функцию не попадает или параметры пустые

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

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

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

На части сценариев возвращается Неопределено без пояснения

Поведение при ошибке
Норма

Ошибка перехвачена, пользователь или журнал регистрации получил внятное сообщение

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

Исключение пробрасывается наружу с техническим текстом платформы

FAQ

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

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

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

Только областью видимости. Без ключевого слова Экспорт функция доступна лишь внутри своего модуля; с ним — из любого другого модуля в совместимом контексте исполнения. На производительность и логику выполнения само слово не влияет.

Почему вызов работает в толстом клиенте, но падает в тонком?

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

Как вызвать экспортную функцию из расширения конфигурации?

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

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

Да, через опубликованные интерфейсы: HTTP-сервисы, веб-сервисы, COM-соединение или внешние компоненты. Сама по себе функция модуля недоступна извне — нужен прикладной интерфейс, который примет внешний запрос и вызовет функцию внутри сеанса 1С с учётом прав доступа.

Что делать, если после обновления конфигурации вызов экспортной функции сломался?

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

Итог

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

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