Разработка и Конфигурация · 9 мин
Как сделать процедуру экспортной в 1С
Как сделать процедуру экспортной в 1С: директива Экспорт, различие модулей, где объявлять процедуры, типичные ошибки и проверка результата.
Экспортная процедура в 1С — это процедура, которую можно вызывать из других модулей конфигурации. По умолчанию процедуры и функции, объявленные в модуле, доступны только внутри него; чтобы открыть доступ извне, после заголовка процедуры добавляется ключевое слово Экспорт. Это базовый механизм построения программного интерфейса (API) модулей в 1С:Предприятии.
Чаще всего экспортные процедуры размещают в общих модулях, модулях менеджеров объектов и модулях объектов. Важно понимать не только синтаксис, но и ограничения: где директива Экспорт работает, а где бессмысленна, как влияет флаг «Сервер» на доступность вызова и почему обращение к несуществующей экспортной процедуре приводит к ошибке компиляции модуля.
Что такое экспортная процедура и зачем она нужна
Модуль в 1С — это контейнер кода с собственной областью видимости. Все процедуры и функции, объявленные внутри модуля без ключевого слова Экспорт, считаются локальными: их может вызывать только код того же модуля. Это позволяет скрывать вспомогательную логику и выставлять наружу только продуманный набор методов.
Экспортная процедура становится частью программного интерфейса модуля. Например, общий модуль «РаботаСФайлами» может содержать десятки внутренних функций разбора форматов, но наружу открывает только две-три экспортные процедуры. Такой подход упрощает сопровождение: внутренний код можно переписывать, не опасаясь сломать вызовы из других мест конфигурации.
Синтаксис: как объявить процедуру экспортной
Ключевое слово Экспорт ставится после закрывающей скобки списка параметров и до тела процедуры. Порядок объявления выглядит так:
Процедура ОтправитьУведомление(Получатель, ТекстСообщения) Экспорт
// Тело процедуры
Сообщить("Отправка: " + Получатель + " — " + ТекстСообщения);
КонецПроцедуры
Для функций синтаксис аналогичен: Функция ПолучитьКурс(Валюта, Дата) Экспорт. Слово Экспорт относится ко всей процедуре целиком — нельзя экспортировать только часть параметров или отдельную ветку логики.
После объявления процедура вызывается из другого модуля через точку от имени общего модуля или менеджера объекта:
// Вызов из другого модуля
ОбщегоНазначения.ОтправитьУведомление("Иванов", "Заказ сформирован");
Процедура РассчитатьСкидку(СуммаДокумента, ПроцентСкидки) Экспорт
ВозвратнаяСумма = СуммаДокумента * ПроцентСкидки / 100;
КонецПроцедурыГде размещать экспортные процедуры
Директива Экспорт имеет смысл не во всех видах модулей. В общих модулях это основной способ организации API: любой экспортный метод общего модуля доступен глобально, по имени модуля. В модулях менеджеров объектов (например, Справочники.Номенклатура) экспортные процедуры дополняют стандартный интерфейс работы с объектом.
В модулях объектов и форм слово Экспорт тоже допустимо, но область применения уже: вызвать такую процедуру можно только через конкретный объект или форму, а не глобально. В модулях команд и в разделах переменных некоторых модулей логика экспорта ограничена контекстом исполнения.
Где объявлять экспортные процедуры
Лучший вариант для переиспользуемой логики. Вызов глобальный по имени модуля. Настраиваются флаги Сервер, Клиент, Вызов сервера.
Подходит для логики, относящейся к виду объекта в целом: создание, печать, заполнение по умолчанию.
Для методов конкретного экземпляра. Вызов возможен только через ссылку на объект, глобально недоступен.
Экспорт оправдан только для программного взаимодействия между формами; для общей логики формы — плохое место.
Настройка общего модуля для экспорта
Если процедура размещается в общем модуле, нужно правильно выставить свойства модуля в конфигураторе. Флаг Сервер означает, что код выполняется на сервере; Клиент (обычное приложение) и Клиент (управляемое приложение) — на клиенте. Если процедура работает с базой данных, она должна находиться в серверном модуле.
Для вызова серверной процедуры из клиентского кода у модуля должен быть установлен флаг Вызов сервера. Без него попытка обратиться к серверному модулю с клиента завершится ошибкой. При этом сами экспортные процедуры серверного модуля не должны принимать и возвращать типы, недоступные на клиенте, — например, объекты типа «СправочникОбъект».
Флаг Привилегированный режим определяет, выполняется ли код без проверки прав доступа. Это удобно для служебных операций, но требует осторожности: через экспортную процедуру привилегированного модуля пользователь с ограниченными правами может косвенно получить доступ к данным, которые ему не положены.
Пошаговый порядок создания экспортной процедуры
Типовая последовательность действий в конфигураторе выглядит следующим образом. Сначала определите, где будет жить процедура: для новой переиспользуемой логики обычно создают новый общий модуль или добавляют метод в существующий тематический модуль. Затем объявляют процедуру с ключевым словом Экспорт, реализуют тело и проверяют вызов.
- 1Откройте конфигуратор и найдите нужный общий модуль (или создайте новый через «Добавить» в ветке «Общие модули»).
- 2Установите свойства модуля: Сервер, Вызов сервера, при необходимости Привилегированный режим.
- 3Объявите процедуру: Процедура ИмяПроцедуры(Параметры) Экспорт ... КонецПроцедуры.
- 4Добавьте комментарий-описание процедуры и её параметров — это упростит сопровождение.
- 5В вызывающем модуле напишите обращение: ИмяОбщегоМодуля.ИмяПроцедуры(Аргументы).
- 6Выполните проверку синтаксиса модулей (Конфигурация → Проверка конфигурации) и протестируйте вызов в режиме предприятия.
После добавления процедуры полезно сразу проверить конфигурацию на синтаксические ошибки. Ошибка «Процедура или функция с указанным именем не определена» при вызове почти всегда означает одно из трёх: забыто слово Экспорт, опечатка в имени модуля или процедуры, либо модуль недоступен в данном контексте (например, серверный модуль вызывается с клиента без флага «Вызов сервера»).
Типичные ошибки и ограничения
Отдельно стоит упомянуть область видимости переменных. Экспортными можно делать не только процедуры и функции, но и переменные модуля (объявляются в разделе переменных с тем же словом Экспорт). Однако экспорт переменных считается плохой практикой: прямой доступ к внутреннему состоянию модуля извне усложняет отладку. Вместо этого принято создавать экспортные функции-геттеры.
Как проверить, что экспорт работает
Простейшая проверка — встроенная проверка конфигурации с включённым режимом «Тонкий клиент» и «Сервер»: она выявит ошибки компиляции во всех контекстах. Затем стоит выполнить фактический вызов в режиме предприятия, например через внешнюю обработку с кнопкой, выполняющей тестовый вызов процедуры с контрольными параметрами.
Как проверить результат
Ошибок компиляции модуля и вызывающего кода нет
Сообщение «Процедура или функция не определена»
Процедура выполняется и возвращает ожидаемый результат
Ошибка времени выполнения при обращении к модулю
Код работает и в тонком клиенте, и на сервере согласно флагам модуля
Вызов доступен только в одном контексте
Пользователь с типовыми правами выполняет процедуру без ошибок
Нарушение прав доступа в привилегированном коде
FAQ
Можно ли сделать экспортной процедуру в модуле формы?
Технически да — слово Экспорт в модуле формы допустимо, и другая форма может вызвать такой метод через объект формы. Однако для общей бизнес-логики это плохое решение: форма должна быть открыта, а её модуль недоступен на сервере вне контекста. Переиспользуемый код правильнее выносить в общий модуль.
Почему при вызове возникает ошибка «Процедура не определена», хотя она есть в модуле?
Наиболее частые причины: отсутствует слово Экспорт в заголовке, опечатка в имени, модуль недоступен в текущем контексте (сервер/клиент) или у общего модуля снят нужный флаг в свойствах. Проверьте эти четыре пункта последовательно.
Чем экспортная процедура отличается от экспортной функции?
Только возвращаемым значением: функция возвращает результат через Возврат, процедура — нет. Механизм экспорта, видимости и вызова у них полностью одинаковый, слово Экспорт ставится в той же позиции заголовка.
Нужно ли перекомпилировать всю конфигурацию после добавления Экспорт?
Достаточно обновить конфигурацию базы данных стандартным образом. Однако имейте в виду: если процедура используется в других модулях, они будут скомпилированы при первом обращении, и ошибки вызова проявятся именно тогда. Поэтому после изменений запускайте проверку конфигурации.
Можно ли экспортировать переменные модуля?
Да, переменные уровня модуля объявляются с ключевым словом Экспорт и доступны извне. Но практика считается нежелательной: внешний код может изменить внутреннее состояние модуля неконтролируемо. Вместо переменных используйте экспортные функции, возвращающие нужные значения.
Что важно запомнить
Экспортная процедура создаётся добавлением слова Экспорт после списка параметров в заголовке. Размещайте переиспользуемую логику в общих модулях с корректными флагами Сервер/Клиент/Вызов сервера, выставляйте наружу только необходимый минимум методов и после изменений проверяйте конфигурацию на ошибки компиляции.