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

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

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

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

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

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

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

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

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

Если модуль добавлен расширением как новый, вы полностью управляете его составом: любую процедуру или функцию можно сделать экспортной. Если же модуль заимствован из основной конфигурации (добавлен «на изменение»), то экспортировать можно только новые процедуры, которые вы дописали в расширении. Изменить видимость уже существующей процедуры основной конфигурации — сделать неэкспортную экспортной — расширение не позволяет.

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

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

&НаСервере

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

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

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

&НаСервере

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

Возврат Неопределено;

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

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

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

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

Когда вы добавляете в расширение общий модуль основной конфигурации «на изменение», платформа объединяет методы: сначала применяются методы расширения, они дополняют или переопределяют методы основной конфигурации. Аннотации &ИзменениеИКонтроль, &После, &Перед, &Вместо позволяют встроиться в существующие процедуры, но не меняют их видимость.

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

Вызов экспортных процедур расширения извне

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

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

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

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

Проверка модуля в конфигураторе
Норма

Ошибок синтаксиса нет

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

Сообщение о неверном месте ключевого слова «Экспорт»

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

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

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

«Процедура или функция с указанным именем не определена»

Регламентное задание
Норма

Задание выполняется без ошибок в журнале регистрации

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

Ошибка «Метод не обнаружен» или ошибка по числу параметров

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

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

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

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

Проверка и отладка

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

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

Итог

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

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

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

Можно ли сделать экспортной процедуру основной конфигурации через расширение?

Нет. Расширение не может изменить видимость методов основной конфигурации. Решение — создать в расширении собственную экспортную процедуру-обёртку и вызывать её.

Где именно ставится слово «Экспорт»?

В строке заголовка процедуры или функции, после закрывающей скобки списка параметров: Процедура Имя(Параметр) Экспорт. Директивы компиляции (&НаСервере) указываются перед заголовком.

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

Чаще всего причины: у общего модуля не установлен флаг «Вызов сервера», расширение не подключено или не применено к базе, либо вызов идёт из другого контекста компиляции (клиент — сервер).

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

Да, если регламентное задание добавлено расширением, а метод указан как ИмяМодуля.ИмяПроцедуры. Процедура должна быть экспортной, серверной и не иметь параметров.

Что будет, если удалить расширение, чьи методы вызываются из другого расширения?

Все вызовы начнут завершаться ошибкой «метод не обнаружен». Перед удалением расширения проверьте зависимости и уберите вызовы его экспортных методов из других расширений.