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

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

Как сделать процедуру экспортной в 1С

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

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

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

Что такое экспортная процедура и зачем она нужна

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

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

Синтаксис: как объявить процедуру экспортной

Ключевое слово Экспорт ставится после закрывающей скобки списка параметров и до тела процедуры. Порядок объявления выглядит так:

Процедура ОтправитьУведомление(Получатель, ТекстСообщения) Экспорт

// Тело процедуры

Сообщить("Отправка: " + Получатель + " — " + ТекстСообщения);

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

Для функций синтаксис аналогичен: Функция ПолучитьКурс(Валюта, Дата) Экспорт. Слово Экспорт относится ко всей процедуре целиком — нельзя экспортировать только часть параметров или отдельную ветку логики.

После объявления процедура вызывается из другого модуля через точку от имени общего модуля или менеджера объекта:

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

ОбщегоНазначения.ОтправитьУведомление("Иванов", "Заказ сформирован");

bsl
Процедура РассчитатьСкидку(СуммаДокумента, ПроцентСкидки) Экспорт
	ВозвратнаяСумма = СуммаДокумента * ПроцентСкидки / 100;
КонецПроцедуры

Где размещать экспортные процедуры

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

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

Где объявлять экспортные процедуры

Общий модуль

Лучший вариант для переиспользуемой логики. Вызов глобальный по имени модуля. Настраиваются флаги Сервер, Клиент, Вызов сервера.

Модуль менеджера объекта

Подходит для логики, относящейся к виду объекта в целом: создание, печать, заполнение по умолчанию.

Модуль объекта

Для методов конкретного экземпляра. Вызов возможен только через ссылку на объект, глобально недоступен.

Модуль формы

Экспорт оправдан только для программного взаимодействия между формами; для общей логики формы — плохое место.

Настройка общего модуля для экспорта

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

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

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

Пошаговый порядок создания экспортной процедуры

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

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

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

Типичные ошибки и ограничения

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

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

Как проверить, что экспорт работает

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

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

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

Проверка конфигурации
Норма

Ошибок компиляции модуля и вызывающего кода нет

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

Сообщение «Процедура или функция не определена»

Вызов в режиме предприятия
Норма

Процедура выполняется и возвращает ожидаемый результат

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

Ошибка времени выполнения при обращении к модулю

Контекст клиент/сервер
Норма

Код работает и в тонком клиенте, и на сервере согласно флагам модуля

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

Вызов доступен только в одном контексте

Права доступа
Норма

Пользователь с типовыми правами выполняет процедуру без ошибок

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

Нарушение прав доступа в привилегированном коде

FAQ

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

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

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

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

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

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

Нужно ли перекомпилировать всю конфигурацию после добавления Экспорт?

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

Можно ли экспортировать переменные модуля?

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

Итог

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

Экспортная процедура создаётся добавлением слова Экспорт после списка параметров в заголовке. Размещайте переиспользуемую логику в общих модулях с корректными флагами Сервер/Клиент/Вызов сервера, выставляйте наружу только необходимый минимум методов и после изменений проверяйте конфигурацию на ошибки компиляции.