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

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

Что значит Экспорт у процедуры в 1С

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

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

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

Что именно делает ключевое слово Экспорт

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

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

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

Где Экспорт работает, а где бессмысленен

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

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

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

Как правильно объявить и вызвать экспортную процедуру

Объявление делается в два шага: пишется заголовок процедуры с параметрами, затем ставится слово Экспорт. Вызов извне выполняется через точку от имени общего модуля или через объект: ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Номер"). Если процедура не экспортная, на этапе проверки модуля или при выполнении вы получите ошибку о неопределённом имени.

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

Типичный пример кода:

// Общий модуль РаботаСЦенами

Функция ПолучитьЦену(Номенклатура, Дата) Экспорт

// логика получения цены

Возврат Цена;

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

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

Цена = РаботаСЦенами.ПолучитьЦену(Товар, ТекущаяДатаСеанса());

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

Экспорт для переменных и контекста модуля

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

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

Типичные ошибки при работе с Экспорт

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

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

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

Когда Экспорт нужен, а когда лучше обойтись без него

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

Маршрут решения

Как выбрать действие

Процедуру нужно вызвать из формы, другого общего модуля или внешнего кодаДобавьте Экспорт и разместите метод в подходящем общем модуле
Процедура — вспомогательная и вызывается только внутри своего модуляОставьте её без Экспорт, это внутренняя реализация
Одинаковый код нужен в нескольких объектахВынесите его в общий модуль как экспортную процедуру вместо копирования
Нужно передать данные на сервер из клиентской формыИспользуйте серверный общий модуль с флагом Вызов сервера и экспортными методами

Хорошая практика — группировать экспортные процедуры в начале модуля и снабжать их комментариями-описаниями параметров и возвращаемых значений. В типовых конфигурациях принято выделять области вида #Область ПрограммныйИнтерфейс для экспортных методов и #Область СлужебныеПроцедурыИФункции для внутренних. Такой порядок упрощает чтение и сопровождение.

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

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

Чтобы найти все места вызова экспортного метода, используйте глобальный поиск по конфигурации (Ctrl+Shift+F) с поиском по имени процедуры. Для переименования безопаснее использовать рефакторинг «Переименование» в EDT или аккуратную замену с последующей полной проверкой, потому что вызовы могут встречаться в шаблонах, внешних обработках и подключённых расширениях.

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

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

Проверка конфигурации после изменений
Норма

Ошибок компиляции модулей нет

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

Сообщения о неопределённых процедурах или неверном контексте

Вызов экспортного метода в режиме предприятия
Норма

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

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

Ошибка «Метод объекта не обнаружен» или ошибка контекста

Состав экспортных методов модуля
Норма

Экспортными являются только методы публичного интерфейса

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

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

Итог

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

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

Частые вопросы

Чем Экспорт отличается от директив &НаСервере и &НаКлиенте?

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

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

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

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

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

Влияет ли Экспорт на производительность?

Нет, это атрибут времени компиляции, а не выполнения. Скорость работы экспортной и локальной процедуры одинакова. На производительность влияет контекст вызова — клиентские обращения к серверу, а не наличие слова Экспорт.

Нужно ли ставить Экспорт в модуле формы?

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

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

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