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