Как вызвать функцию одной внешней обработки из другой внешней обработки в 1С

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

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

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

Причины возникновения типичных ошибок

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

  1. Отсутствие расширения файла: Метод ПолучитьИмяВременногоФайла() по умолчанию создает путь без расширения. Платформа 1С критично относится к наличию расширения .epf при создании объекта обработки из файла.
  2. Безопасный режим: Если вызываемая обработка работает с внешними ресурсами (например, HTTP-запросы к Telegram), а она запущена в безопасном режиме, платформа заблокирует выполнение кода.
  3. Область видимости: Экспортная функция должна находиться именно в Модуле объекта внешней обработки, а не в модуле формы. К методам модуля формы нельзя обратиться через созданный объект обработки напрямую.

Способ 1: Прямое создание объекта обработки через временный файл

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

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


Функция ВызватьМетодВнешнейОбработки(СсылкаНаДопОбработку) Экспорт
    
    // Обязательно указываем расширение "epf"
    ИмяФайла = ПолучитьИмяВременногоФайла("epf");
    
    // Получаем двоичные данные из справочника БСП
    ДвоичныеДанные = СсылкаНаДопОбработку.ХранилищеОбработки.Получить();
    Если ДвоичныеДанные = Неопределено Тогда
        Возврат "Данные обработки не найдены";
    КонецЕсли;
    
    ДвоичныеДанные.Записать(ИмяФайла);
    
    Попытка
        // Создаем объект. Второй параметр Ложь отключает безопасный режим
        ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла, Ложь);
        
        // Вызываем экспортную функцию из модуля объекта
        Результат = ОбработкаОбъект.ПроверкаСообщений();
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка вызова: " + ОписаниеОшибки());
        Результат = Неопределено;
    КонецПопытки;
    
    // Не забываем удалять временные файлы
    УдалитьФайлы(ИмяФайла);
    
    Возврат Результат;
    
КонецФункции

Важный нюанс: Обратите внимание на использование второго параметра в методе ВнешниеОбработки.Создать(Путь, БезопасныйРежим). Если ваша обработка должна выполнять "опасные" операции (запись файлов, COM-соединения), обязательно передавайте туда Ложь.

Способ 2: Использование стандартных механизмов БСП (ВыполнитьКоманду)

Если ваша конфигурация построена на базе БСП, правильнее использовать механизм команд. Этот способ позволяет избежать ручного манипулирования файлами. Однако он требует, чтобы вызываемая функция была зарегистрирована в таблице команд внешней обработки.

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

Для реализации этого способа выполним следующие действия:

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

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    Если ИдентификаторКоманды = "ПроверкаСообщений" Тогда
        ПроверкаСообщений(); // Вызов нашей основной логики
    КонецЕсли;
КонецПроцедуры
  1. Теперь из основной обработки мы можем вызвать ее следующим кодом:

ПараметрыКоманды = Новый Структура;
ПараметрыКоманды.Вставить("ДополнительнаяОбработкаСсылка", СсылкаНаНужнуюОбработку);
ПараметрыКоманды.Вставить("ИдентификаторКоманды", "ПроверкаСообщений");

// Выполняем через программный интерфейс БСП
ДополнительныеОтчетыИОбработки.ВыполнитьКоманду(ПараметрыКоманды);

Преимущество этого метода в том, что БСП сама позаботится о правах доступа, логировании и корректном подключении обработки в сеансе.

Способ 3: Получение объекта через программный интерфейс БСП

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

Рассмотрим пример реализации:


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

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

// Теперь мы можем вызвать ЛЮБУЮ экспортную функцию модуля объекта
Результат = ОбъектВнешней.ПроверкаСообщений();

Внимание: Данный метод работает исключительно на стороне сервера. Проверьте, что в вызываемой обработке функция ПроверкаСообщений помечена ключевым словом Экспорт и находится в модуле объекта.

Рекомендации по безопасности и отладке

Если вы все же получаете ошибку "Команда не обнаружена", проверьте следующие моменты:

Таким образом, мы рассмотрели различные подходы к интеграции внешних обработок. Использование встроенных методов БСП (Способ 3) является наиболее современным и предпочтительным, так как оно минимизирует количество "ручного" кода и снижает риск ошибок при работе с временными файлами. Для удобства модификации и отладки таких объектов в рабочей базе пригодится инструмент для быстрой выгрузки внешних отчетов и обработок на диск.

← На главную