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

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

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

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

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

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

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

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

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

Процедура ЗарегистрироватьОбмен(Узел, Данные) Экспорт

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

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

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

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

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

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

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

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

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

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

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

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

ОбменДаннымиСервер.ЗарегистрироватьОбмен(Узел, Данные);

Курс = ФинансыСервер.ПолучитьКурсВалюты(Валюта, Дата);

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

Порядок создания и вызова
  1. 1
    Создайте общий модуль и установите нужные флаги компиляции (Сервер / Клиент)
  2. 2
    Объявите процедуру с ключевым словом Экспорт в конце строки объявления
  3. 3
    Сохраните конфигурацию и убедитесь в отсутствии ошибок проверки модуля
  4. 4
    В вызывающем модуле напишите ИмяМодуля.ИмяПроцедуры(параметры)
  5. 5
    Выполните синтаксическую проверку модуля (Ctrl+F7) и полную проверку конфигурации

Как обратиться к экспортной процедуре модуля менеджера или объекта

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

// Экспортная процедура в модуле менеджера справочника Номенклатура

Описание = Справочники.Номенклатура.ПолучитьОписаниеДляПечати(Ссылка);

// Экспортная функция в модуле менеджера документа

Номер = Документы.РеализацияТоваровУслуг.СформироватьНомер(Организация);

Модуль объекта, напротив, работает с конкретным экземпляром. Чтобы вызвать его экспортную процедуру, сначала получите объект методом ПолучитьОбъект(), а затем обратитесь к методу:

ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();

ОбъектДокумента.ЗаполнитьПоОснованию(Основание);

ОбъектДокумента.Записать();

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

Вызов экспортных процедур из модуля формы

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

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

&НаКлиенте

Процедура ОбновитьКурс(Команда)

Курс = ПолучитьКурсНаСервере(Валюта);

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

&НаСервереБезКонтекста

Функция ПолучитьКурсНаСервере(Валюта)

Возврат ФинансыСервер.ПолучитьКурсВалюты(Валюта, ТекущаяДатаСеанса());

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

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

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

Куда поместить вызываемый код

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

Ошибки при обращении к экспортным процедурам и их устранение

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

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

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

Типичные ошибки
01
Вызов серверной экспортной процедуры из &НаКлиенте — ошибка компиляции; добавьте промежуточную серверную процедуру
02
Обращение к методу модуля объекта через ссылку без ПолучитьОбъект() — метод недоступен у объекта Ссылка
03
Опечатка в имени общего модуля или процедуры — синтаксическая проверка модуля (Ctrl+F7) выявляет её сразу
04
Экспорт процедуры, которая используется только внутри модуля, — лишнее расширение интерфейса и риск случайных вызовов снаружи
05
Вызов привилегированного модуля без контроля прав — обход ограничений доступа к данным

Проверка результата и контрольные точки

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

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

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

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

Синтаксическая проверка модуля (Ctrl+F7)
Норма

Ошибок нет, имя процедуры разрешается

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

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

Флаги компиляции общего модуля
Норма

Установлен флаг, соответствующий контексту вызова

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

Модуль компилируется только на сервере, а вызов идёт с клиента

Отладка с точкой останова в экспортной процедуре
Норма

Выполнение останавливается внутри процедуры

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

Точка не срабатывает — вызов не доходит или идёт в другую ветку

Параметры вызова
Норма

Количество и типы совпадают с объявлением

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

Ошибка «Недостаточно фактических параметров» при исполнении

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

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

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

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

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

Обычная процедура доступна только внутри своего модуля. Добавление слова Экспорт публикует её в интерфейсе модуля, и другие модули могут вызывать её через имя модуля или через объект. Сам код процедуры при этом не меняется — меняется только видимость.

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

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

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

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

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

Получите объект вызовом Ссылка.ПолучитьОбъект() и обратитесь к методу через полученную переменную. Помните, что это возможно только на сервере — в клиентском контексте управляемого приложения объектная модель недоступна.

Опасно ли ставить Экспорт на все процедуры подряд?

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

Что даёт флаг «Привилегированный режим» у общего модуля?

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