Разработка и Конфигурация · 10 мин
Что значит Экспорт у процедуры в 1С
Что означает ключевое слово Экспорт у процедуры в 1С, чем отличается от обычной процедуры, где применяется и какие ошибки вызывает у разработчиков.
Ключевое слово Экспорт после объявления процедуры или функции во встроенном языке 1С делает её доступной для вызова из других модулей конфигурации. Без этого слова процедура считается локальной: её можно вызвать только внутри того же модуля, где она описана. Это базовый механизм управления видимостью кода, сравнимый с модификаторами public и private в других языках программирования.
Понимание того, что значит «Экспорт» у процедуры 1С, критично для любого разработчика: от этого зависит, какие методы можно вызывать из форм, общих модулей, обработок и внешнего кода. Неправильное использование приводит либо к ошибке «Процедура или функция с указанным именем не определена», либо к избыточному открытию внутренней логики модуля, что усложняет сопровождение конфигурации.
Что именно делает ключевое слово Экспорт
Каждый модуль в 1С — будь то общий модуль, модуль объекта, модуль формы или модуль менеджера — имеет свой контекст. Процедуры и функции, объявленные без Экспорт, образуют внутренний программный интерфейс модуля: они решают служебные задачи и недоступны снаружи. Добавление слова Экспорт после списка параметров публикует метод наружу.
Синтаксис выглядит так: после закрывающей скобки параметров ставится слово Экспорт, и только потом идёт тело процедуры. Например: Процедура РассчитатьСкидку(Документ) Экспорт. Такую процедуру можно вызвать из любого места, где доступен сам модуль, — например, из формы документа или из другого общего модуля.
Важно понимать: Экспорт не влияет на логику работы самой процедуры. Он меняет только область видимости. Внутри модуля обе процедуры — и с Экспорт, и без — вызываются одинаково, просто по имени.
Где Экспорт работает, а где бессмысленен
Действие ключевого слова зависит от типа модуля. В общих модулях Экспорт — основной способ организации кода: именно экспортные процедуры образуют программный интерфейс общего модуля, доступный всей конфигурации. В модулях объектов (документов, справочников) экспортные методы вызываются через объект, например ДокументОбъект.ПроверитьЗаполнение().
В модулях форм Экспорт используется реже, но тоже осмысленно: экспортные процедуры и функции формы можно вызвать извне при работе с формой программно. В модуле приложения и модуле внешнего соединения экспортные методы формируют интерфейс, доступный при внешних подключениях.
Есть ситуации, где Экспорт не имеет смысла. Например, в общем модуле с установленным свойством «Клиент» и «Сервер» контекст и так определяется флагами, а Экспорт лишь управляет видимостью. А вот в модуле команды или в обработчиках, подключаемых через директивы компиляции, лишний Экспорт только засоряет интерфейс.
Как правильно объявить и вызвать экспортную процедуру
Объявление делается в два шага: пишется заголовок процедуры с параметрами, затем ставится слово Экспорт. Вызов извне выполняется через точку от имени общего модуля или через объект: ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Номер"). Если процедура не экспортная, на этапе проверки модуля или при выполнении вы получите ошибку о неопределённом имени.
- 1Откройте общий модуль или модуль объекта и напишите заголовок: Процедура МояПроцедура(Параметр1) Экспорт
- 2Реализуйте тело процедуры и завершите его словом КонецПроцедуры
- 3В вызывающем модуле обратитесь к процедуре через имя модуля: ИмяОбщегоМодуля.МояПроцедура(Значение)
- 4Запустите проверку конфигурации (Конфигурация — Проверка конфигурации) и убедитесь в отсутствии ошибок
Типичный пример кода:
// Общий модуль РаботаСЦенами
Функция ПолучитьЦену(Номенклатура, Дата) Экспорт
// логика получения цены
Возврат Цена;
КонецФункции
// Вызов из другого модуля
Цена = РаботаСЦенами.ПолучитьЦену(Товар, ТекущаяДатаСеанса());
Если забыть слово Экспорт в первом фрагменте, вызов во втором приведёт к ошибке компиляции. Это самая частая причина сообщения «Процедура или функция с указанным именем не определена» у начинающих разработчиков.
Экспорт для переменных и контекста модуля
Ключевое слово применяется не только к процедурам и функциям. Переменные модуля, объявленные с Экспорт, становятся доступными извне как свойства: Перем ТекущаяНастройка Экспорт;. После этого другой модуль может прочитать или изменить её через ИмяМодуля.ТекущаяНастройка.
Экспортные переменные — спорный приём. Они нарушают инкапсуляцию: любой код может изменить состояние модуля, и отследить, кто это сделал, сложно. Предпочтительнее экспортные функции-геттеры и процедуры-установщики, которые контролируют корректность значений. Экспортные переменные оправданы разве что для простых флагов в прикладных обработках.
Типичные ошибки при работе с Экспорт
Ошибки с Экспорт делятся на две группы: технические (код не работает) и архитектурные (код работает, но плохо устроен). Технические проявляются сразу — при проверке конфигурации или в момент вызова. Архитектурные всплывают позже, когда модуль обрастает десятками публичных методов и любая доработка становится рискованной.
Отдельная проблема — конфликт контекстов. Если экспортная процедура в модуле формы помечена &НаСервере, вызвать её с клиента напрямую нельзя. Нужно либо перенести метод в серверный общий модуль с флагом «Вызов сервера», либо создать клиентскую обёртку, которая обращается к серверу штатными средствами платформы.
Когда Экспорт нужен, а когда лучше обойтись без него
Решение о добавлении Экспорт принимайте по простому критерию: есть ли хотя бы один реальный вызов этой процедуры извне модуля — сейчас или в ближайшей доработке. Если вызов только внутренний, слово Экспорт не добавляйте. Это не экономия символов, а защита кода от случайных зависимостей.
Как выбрать действие
Хорошая практика — группировать экспортные процедуры в начале модуля и снабжать их комментариями-описаниями параметров и возвращаемых значений. В типовых конфигурациях принято выделять области вида #Область ПрограммныйИнтерфейс для экспортных методов и #Область СлужебныеПроцедурыИФункции для внутренних. Такой порядок упрощает чтение и сопровождение.
Как проверить результат и найти все вызовы
После добавления или изменения экспортной процедуры обязательно запустите проверку конфигурации с включённой проверкой модулей в нужных режимах (тонкий клиент, веб-клиент, сервер). Это выявит синтаксические ошибки и несоответствие контекстов до запуска прикладного решения.
Чтобы найти все места вызова экспортного метода, используйте глобальный поиск по конфигурации (Ctrl+Shift+F) с поиском по имени процедуры. Для переименования безопаснее использовать рефакторинг «Переименование» в EDT или аккуратную замену с последующей полной проверкой, потому что вызовы могут встречаться в шаблонах, внешних обработках и подключённых расширениях.
Как проверить результат
Ошибок компиляции модулей нет
Сообщения о неопределённых процедурах или неверном контексте
Процедура выполняется и возвращает ожидаемый результат
Ошибка «Метод объекта не обнаружен» или ошибка контекста
Экспортными являются только методы публичного интерфейса
Экспорт стоит у большинства процедур без явной необходимости
Что важно запомнить
Экспорт делает процедуру, функцию или переменную модуля доступной извне. Без Экспорт метод виден только внутри своего модуля. Добавляйте Экспорт осознанно — только тем методам, которые реально вызываются снаружи, и проверяйте конфигурацию после любых изменений публичного интерфейса.
Частые вопросы
Чем Экспорт отличается от директив &НаСервере и &НаКлиенте?
Это ортогональные механизмы. Директивы определяют, на какой стороне компилируется и выполняется код, а Экспорт — виден ли он из других модулей. Процедура может быть одновременно серверной и экспортной, клиентской и локальной, и в любых других сочетаниях.
Почему возникает ошибка «Процедура или функция с указанным именем не определена»?
Чаще всего вызываемая процедура объявлена без Экспорт, либо вы обращаетесь не к тому модулю, либо в имени есть опечатка. Проверьте заголовок процедуры, имя общего модуля и результат проверки конфигурации.
Можно ли вызвать экспортную процедуру общего модуля из внешней обработки?
Да, если общий модуль доступен в том же контексте (клиент или сервер), где выполняется обработка. Обращение стандартное: ИмяОбщегоМодуля.ИмяПроцедуры(параметры). Для серверного вызова из клиентской обработки нужен серверный общий модуль с включённым флагом «Вызов сервера».
Влияет ли Экспорт на производительность?
Нет, это атрибут времени компиляции, а не выполнения. Скорость работы экспортной и локальной процедуры одинакова. На производительность влияет контекст вызова — клиентские обращения к серверу, а не наличие слова Экспорт.
Нужно ли ставить Экспорт в модуле формы?
Только если процедуру формы планируется вызывать программно извне — например, из другой формы или при оповещениях. Для обработчиков событий и внутренних методов формы Экспорт не требуется и считается избыточным.
Как безопасно переименовать экспортную процедуру?
Сначала выполните глобальный поиск по имени во всей конфигурации и подключённых расширениях, чтобы найти все вызовы. Затем переименуйте метод и все обращения, после чего запустите полную проверку конфигурации. Не забудьте про внешние обработки и отчёты, которые могут вызывать этот метод.