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