Как вызвать функцию или процедуру внешней обработки по динамическому имени в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

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

Различие между операторами Выполнить и Вычислить

При динамическом вызове кода по строковому представлению в 1С ключевую роль играют два встроенных оператора языка: Выполнить и Вычислить. Главное различие между ними заключается в типе вызываемого метода и наличии возвращаемого значения:

  1. Оператор Выполнить применяется для вызова процедур или выполнения произвольных блоков кода, которые не возвращают значение.
  2. Оператор Вычислить применяется для вызова функций и вычисления выражений, возвращающих результат.

Посмотрим на базовый пример вызова экспортной процедуры из внешней обработки:


// Подключаем внешнюю обработку и получаем объект
ОбъектОбработки = ВнешниеОбработки.Создать(ПутьКФайлу);

// Вызов процедуры по фиксированному имени
Выполнить("ОбъектОбработки.ОбработатьДанные()");

Если же требуется вызвать экспортную функцию и записать результат её работы в переменную, следует использовать оператор Вычислить:


// Вызов функции и получение возвращаемого значения
Результат = Вычислить("ОбъектОбработки.ПолучитьДанные()");

Вызов экспортного метода, если имя метода передается в переменной

Рассмотрим наиболее частый сценарий, когда имя экспортного метода не прописано жестко в коде, а хранятся в переменной (например, ИмяМетода = "МояЭкспортнаяФункция").

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

Выясним правильный синтаксис для вызова функции с передачей параметров:


// 1. Инициализируем обработку и параметры
ОбъектОбработки = ВнешниеОбработки.Создать(ПутьКФайлу);
ИмяМетода = "РассчитатьПоказатели"; // Получено из параметра или настройки

// 2. Подготавливаем структуры или произвольные параметры
ПараметрыВызова = Новый Структура("Организация, Период", СсылкаОрганизация, ТекущаяДата());

// 3. Динамически формируем выражение и вызываем функцию
Результат = Вычислить("ОбъектОбработки." + ИмяМетода + "(ПараметрыВызова)");

В данном примере выражение внутри Вычислить транслируется платформой в вызов вида ОбъектОбработки.РассчитатьПоказатели(ПараметрыВызова). Обратите внимание, что переменная ОбъектОбработки и переменная ПараметрыВызова должны находиться в том же контексте (в той же области видимости), где вызывается оператор Вычислить.

Аналогичным образом вызов процедуры по динамическому имени выглядит следующим образом:


ИмяПроцедуры = "ВыгрузитьДанные";
Выполнить("ОбъектОбработки." + ИмяПроцедуры + "(ПараметрыВызова)");

Особенности работы в Обычных и Управляемых формах

Проанализируем разницу в поведении платформы в зависимости от используемого режима форм:

  1. Обычное приложение (Обычные формы): Метод ВнешниеОбработки.Создать(Путь) выполняет чтение файла обработки напрямую на клиенте и возвращает объект внешней обработки. Вызов динамического кода через Выполнить или Вычислить также происходит непосредственно в клиентском контексте.
  2. Управляемое приложение (Управляемые формы): В режиме управляемого приложения вызов ВнешниеОбработки.Создать() доступен только на сервере (в директиве &НаСервере). Поэтому передавать файл внешней обработки на сервер необходимо через временное хранилище, либо использовать функционал БСП (Библиотеки Стандартных Подсистем).

Пример динамического вызова метода обработки на сервере в управляемых формах:


&НаСервере
Функция ВыполнитьМетодВнешнейОбработкиНаСервере(ПутьКФайлу, ИмяМетода, Параметры)
    
    ОбъектОбработки = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь); // Ложь - без проверки безопасного режима, если требуется
    
    СтрокаВызова = "ОбъектОбработки." + ИмяМетода + "(Параметры)";
    Возврат Вычислить(СтрокаВызова);
    
КонецФункции

Почему возникает ошибка «Метод объекта не обнаружен» при отладке внешних обработок?

В процессе доработки внешней обработки разработчики часто сталкиваются со следующей ситуацией: в модуль обработки добавляется новая экспортная функция (например, Функция ИзвлечьДанные() Экспорт), файл сохраняется на диск, но при попытке вызова платформой выдается ошибка {(1)}: Метод объекта не обнаружен (ИзвлечьДанные).

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

Если объект обработки уже создавался в текущем сеансе и находился в памяти, платформа может использовать закэшированную старую версию модуля, где нового метода еще не существовало.

Для решения проблемы с кэшированием при отладке следует соблюдать следующие правила:

  1. Перезапуск сеанса «1С:Предприятия»: Перезапускать сам Конфигуратор не требуется, но необходимо перезапустить сеанс клиентского приложения (Предприятия), чтобы очистить внутренний кэш модулей.
  2. Обнуление переменных: Перед повторным вызовом ВнешниеОбработки.Создать() обязательно обнуляйте переменную, содержащую объект обработки (ОбъектОбработки = Неопределено;), перед созданием нового экземпляра.
  3. Использование внешних обработок через БСП: Если внешняя обработка подключается через справочник «Дополнительные отчеты и обработки», при внесении изменений в файл .epf необходимо обновить файл обработки непосредственно в справочнике базы данных.

Вызов методов внешних обработок, подключенных через БСП

Если ваша конфигурация использует Библиотеку Стандартных Подсистем (БСП) и внешняя обработка зарегистрирована в базе данных, создавать объект через прямой путь к файлу не требуется. Рассмотрим, как выполнить экспортный метод такой обработки:


// СсылкаНаОбработку - Ссылка на элемент справочника "ДополнительныеОтчетыИОбработки"
ОбъектОбработки = ДополнительныеОтчетыИОбработки.ПолучитьОбъектВнешнейОбработки(СсылкаНаОбработку);

// Динамический вызов функции из модуля обработки
ИмяФункции = "СформироватьПечатнуюФорму";
Результат = Вычислить("ОбъектОбработки." + ИмяФункции + "(ПараметрыВызова)");

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

← На главную