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

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

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

Общая логика процесса

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

  1. Хранение: Вложенная обработка (файл .epf) сохраняется в макете основной обработки как тип Двоичные данные.
  2. Извлечение: Программно считываем эти двоичные данные из макета на сервере.
  3. Регистрация: Помещаем данные во временное хранилище и используем менеджер ВнешниеОбработки для регистрации обработки в сеансе.
  4. Вызов: Создаем объект обработки для выполнения серверного кода или открываем её форму для взаимодействия с пользователем.

Шаг 1. Подготовка макета

Прежде всего, откроем основную обработку в конфигураторе. Перейдем на вкладку Макеты и добавим новый макет. Выберем тип макета — Двоичные данные. В открывшемся окне выбора файла укажем нашу вложенную обработку (файл .epf). Присвоим макету понятное имя, например, ВложеннаяОбработка.

Шаг 2. Получение данных и подключение на сервере

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


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

В этом коде мы использовали метод ВнешниеОбработки.Подключить. Рассмотрим его параметры подробнее:

Шаг 3. Вызов серверного метода вложенной обработки

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


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

Шаг 4. Открытие формы вложенной обработки

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


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

Особенности отладки и важные нюансы

Проанализируем технические тонкости, которые часто вызывают вопросы у разработчиков при использовании данной схемы.

1. Проблема отладки. Если вы просто подключаете обработку из временного хранилища, точки останова внутри неё работать не будут. Платформа 1С не знает, к какому исходному коду привязать исполняемый контекст. Рассмотрим решение: для отладки временно сохраняйте двоичные данные в файл на диске с помощью ДвоичныеДанные.Записать(ПутьКФайлу) и подключайте обработку по этому пути. Если этот файл открыт в конфигураторе, отладчик сработает.

2. Кэширование и производительность. Метод Подключить() при каждом вызове создает новую запись в памяти сеанса. Если вы вызываете это действие сотни раз, память может переполниться. Проанализируем ситуацию: хорошим тоном будет хранить ИмяОбработки в переменной или реквизите формы и подключать её повторно только в том случае, если переменная пуста.

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

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

5. Параметры формы. При открытии формы вложенной обработки через ОткрытьФорму, убедитесь, что в её модуле формы в процедуре ПриСозданииНаСервере прописана логика обработки входящих параметров. Иначе переданные данные просто не будут использованы.

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

← На главную