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