Разработка и Конфигурация · 10 мин
1С: как обратиться к модулю внешней обработки
Как вызвать функции и процедуры модуля внешней обработки 1С: создание объекта, обращение к модулю объекта, передача параметров и типичные ошибки.
Внешняя обработка в 1С — это файл с расширением.epf (для управляемого приложения) или.ert (для устаревших версий), который содержит программный код, но не входит в состав конфигурации. Чтобы выполнить код из такого файла, недостаточно просто знать его путь: нужно правильно создать объект обработки и только после этого обращаться к экспортным процедурам и функциям её модуля.
Ключевой момент, который часто упускают: обратиться напрямую к модулю внешней обработки по имени файла нельзя. Платформа требует сначала загрузить обработку через менеджер внешних обработок и получить объект, через который и станут доступны экспортные методы модуля объекта.
Ниже разобраны способы создания объекта внешней обработки, обращение к её модулю, передача параметров, типичные ошибки и ограничения безопасного режима.
Как устроен модуль внешней обработки
У внешней обработки есть модуль объекта — аналог модуля объекта встроенных метаданных (справочников, документов, обработок конфигурации). В нём объявляют переменные, процедуры и функции. Чтобы метод был доступен извне, он должен быть объявлен с ключевым словом Экспорт:
Функция ПолучитьСуммуДокумента(ДокументСсылка) Экспорт
// код функции
Возврат Сумма;
КонецФункции
Процедура ЗаписатьЛог(ТекстСообщения) Экспорт
// код процедуры
КонецПроцедуры
Методы без Экспорт остаются приватными: вызвать их снаружи не получится, платформа выдаст ошибку «Процедура или функция с указанным именем не определена». Это первая и самая частая причина проблем при обращении к модулю.
Кроме модуля объекта у обработки могут быть формы со своими модулями, но обращение к ним идёт через объект формы и работает иначе — об этом ниже.
Создание объекта внешней обработки
Основной способ получить доступ к модулю — метод Создать() менеджера внешних обработок. В файловом варианте или при известном пути к файлу код выглядит так:
ПутьКФайлу = "C:\Обработки\МояОбработка.epf";
Обработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
Обработка.ЗаписатьЛог("Тестовый вызов");
Результат = Обработка.ПолучитьСуммуДокумента(МойДокумент);
Второй параметр метода Создать() определяет режим безопасности: Ложь — обработка выполняется в обычном режиме, Истина — в безопасном. В безопасном режиме ограничены операции с файловой системой, COM-объектами и внешними компонентами.
Если обработка подключена через механизм дополнительных отчетов и обработок (БСП), объект создают через программный интерфейс подсистемы, например ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаЭлемент). Это предпочтительный путь для решений на базе типовых конфигураций: файл хранится в информационной базе, а не на диске.
- 1Откройте модуль объекта внешней обработки и убедитесь, что нужные процедуры и функции объявлены с Экспорт
- 2В вызывающем коде создайте объект: Обработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь)
- 3Вызовите метод как свойство объекта: Обработка.ИмяМетода(Параметры)
- 4Проверьте результат вызова и обработайте возможные исключения через Попытка/Исключение
Обращение к экспортным переменным и методам
После создания объекта все экспортные члены модуля доступны через точку: переменные — как свойства, процедуры и функции — как методы. Платформа не различает их синтаксически от методов встроенных объектов:
Обработка = ВнешниеОбработки.Создать("C:\Обработки\Курс.epf");
Обработка.Валюта = "USD"; // экспортная переменная
Курс = Обработка.ПолучитьКурс(ТекущаяДатаСеанса());
Каждый вызов Создать() порождает новый независимый экземпляр обработки со своим состоянием. Если создать два объекта одной и той же обработки, значения их экспортных переменных не будут общими — это нужно учитывать при проектировании логики.
Объект обработки живёт, пока существует переменная, которая на него ссылается. После выхода из процедуры или обнуления переменной объект уничтожается сборщиком мусора, и повторный вызов потребует нового создания.
Вызов с клиента и с сервера
Метод ВнешниеОбработки.Создать() доступен на толстом клиенте и на сервере. В тонком клиенте и веб-клиенте он недоступен напрямую: там нужно вызывать серверную процедуру, которая создаст объект и выполнит нужный метод, а результат вернёт на клиент.
Типовая схема для управляемого приложения: клиентская процедура вызывает серверную, серверная создаёт объект внешней обработки и выполняет код. Файл, лежащий на диске C: клиентской машины, сервер не увидит.
Если обработка должна работать и на клиенте, и на сервере, практичнее хранить её в базе через подсистему дополнительных отчетов и обработок или передавать двоичные данные файла во временное хранилище и создавать объект из временного файла.
Безопасный режим и его ограничения
Безопасный режим включается вторым параметром метода Создать() либо принудительно настройками кластера или профиля безопасности. В нём запрещены: доступ к файловой системе, создание COM-объектов, загрузка внешних компонент, выполнение операторов, работающих с привилегированным режимом в полном объёме.
Если модуль внешней обработки использует, например, Новый COMОбъект("Excel.Application"), в безопасном режиме вызов завершится ошибкой. Признак проблемы — обработка работает у администратора, но падает у обычного пользователя: скорее всего, для пользователя включен безопасный режим или профиль безопасности с ограничениями.
Проверить текущий режим можно функцией БезопасныйРежим() — она возвращает Истина, если код выполняется в безопасном режиме.
Обращение к модулю формы внешней обработки
Методы модуля формы доступны только через объект формы, а не через объект обработки. Сначала форму получают методом ПолучитьФорму() объекта обработки, затем обращаются к её экспортным процедурам:
Обработка = ВнешниеОбработки.Создать(ПутьКФайлу);
Форма = Обработка.ПолучитьФорму("ОсновнаяФорма");
Форма.ИнициализироватьДанные(Параметры);
Форма.Открыть();
Для управляемых форм прямой вызов экспортных методов формы с сервера затруднён: управляемая форма живёт в связке клиент-сервер, и обращаться к ней извне следует через параметры открытия и оповещения, а не через прямые вызовы методов. Это ограничение архитектуры управляемого приложения, а не дефект кода.
Проверка результата и отладка
Отладка внешней обработки выполняется стандартно: файл открывается в конфигураторе, в модуле ставятся точки останова, затем обработка запускается из предприятия. Отладчик остановится на точке, если конфигуратор подключен к той же информационной базе и включен режим отладки.
Для проверки корректности вызова полезно обернуть обращение к модулю в конструкцию Попытка..Исключение и записывать текст ошибки в журнал регистрации или сообщение пользователю:
Попытка
Обработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
Результат = Обработка.ПолучитьСуммуДокумента(Документ);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Признак успешного обращения к модулю — метод вернул ожидаемое значение без исключения. Если ошибка возникает на этапе Создать(), проблема в пути к файлу, правах доступа или безопасном режиме; если на этапе вызова метода — в имени метода, отсутствии Экспорт или несоответствии параметров.
Как проверить результат
Метод Создать() вернул объект без исключения
Ошибка открытия файла или отказ в доступе
Метод выполнился и вернул значение
Ошибка «процедура не определена» — нет Экспорт или неверное имя
Код работает у всех целевых пользователей
Работает только у администратора — проверьте безопасный режим
Частые вопросы
Можно ли обратиться к модулю внешней обработки по её имени, как к общему модулю?
Нет. Внешняя обработка не является объектом метаданных конфигурации, поэтому у неё нет имени в дереве конфигурации. Доступ к её модулю возможен только через объект, созданный методом ВнешниеОбработки.Создать() или полученный из подсистемы дополнительных отчетов и обработок.
Почему возникает ошибка «Процедура или функция не определена», хотя метод есть в модуле?
Чаще всего метод объявлен без ключевого слова Экспорт — такие процедуры видны только внутри модуля. Также проверьте точность имени: язык 1С нечувствителен к регистру, но чувствителен к опечаткам, и убедитесь, что вызываете метод у объекта обработки, а не у формы или другого объекта.
Как передать параметры в метод модуля внешней обработки?
Точно так же, как в обычные функции встроенного языка: перечислите значения в скобках при вызове. Параметры, объявленные с Знач, передаются копией, без Знач — по ссылке, и метод может изменить значение переменной вызывающего кода.
Работает ли ВнешниеОбработки.Создать() на тонком клиенте?
Нет, этот метод доступен на толстом клиенте и на сервере. В тонком и веб-клиенте создайте серверную процедуру, которая сформирует объект обработки, выполнит нужный метод и вернёт результат на клиент.
Как вызвать модуль обработки, подключенной через «Дополнительные отчеты и обработки»?
Получите ссылку на элемент справочника дополнительных отчетов и обработок, затем используйте программный интерфейс БСП: ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(Ссылка). Дальше вызывайте экспортные методы полученного объекта обычным образом.
Можно ли из одной внешней обработки вызвать модуль другой внешней обработки?
Да. В модуле первой обработки создайте объект второй через ВнешниеОбработки.Создать() с указанием пути к её файлу и вызывайте её экспортные методы. Учтите, что путь должен быть доступен в том контексте, где выполняется код — на сервере или на клиенте.
Что важно запомнить
Доступ к модулю внешней обработки даёт только объект, созданный через ВнешниеОбработки.Создать() или подсистему дополнительных обработок. Методы должны быть экспортными, путь к файлу — доступен в контексте выполнения, а ограничения безопасного режима и тонкого клиента — учтены при проектировании.