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