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