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

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

В современных конфигурациях 1С, таких как «Управление торговлей 11», «ERP» или «Комплексная автоматизация», внешние обработки часто хранятся непосредственно в базе данных (в справочнике ДополнительныеОтчетыИОбработки). Задача программного вызова такой обработки отличается от простого запуска файла с диска. В этой статье мы подробно разберем, как правильно извлечь обработку из системы, подключить ее и открыть форму или выполнить экспортный метод, соблюдая архитектурные требования платформы 8.3.

Метод 1: Ручное извлечение из справочника (универсальный способ)

Этот способ основан на получении двоичных данных обработки из хранилища значений, сохранении их во временный файл и последующем создании объекта. Разберем этот процесс по шагам, учитывая разделение на клиентский и серверный контекст.

Шаг 1. Получение данных на сервере

Сначала нам необходимо найти элемент справочника и извлечь саму обработку. Поскольку менеджеры справочников недоступны на клиенте, этот код должен выполняться в процедуре с директивой &НаСервере.


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

    // Извлекаем двоичные данные из хранилища (имя реквизита может отличаться: ХранилищеОбработки или ХранилищеВнешнейОбработки)
    ДвоичныеДанные = СсылкаНаОбъект.ХранилищеОбработки.Получить();
    
    Если ДвоичныеДанные = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;

    // Создаем временный файл на стороне сервера
    ИмяФайла = ПолучитьИмяВременногоФайла("epf");
    ДвоичныеДанные.Записать(ИмяФайла);
    
    Возврат ИмяФайла;
КонецФункции

Шаг 2. Вызов на стороне клиента

После того как файл создан, нам нужно создать объект обработки и открыть его форму. Важно помнить, что метод ВнешниеОбработки.Создать на тонком клиенте требует пути к файлу, доступному именно клиентскому приложению. Однако в управляемом приложении наиболее надежным методом является использование функции ОткрытьФорму.


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

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

Метод 2: Использование программного интерфейса БСП (рекомендуемый)

Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), крайне рекомендуется использовать встроенные механизмы. Это безопаснее, так как система автоматически учитывает настройки прав доступа и безопасный режим.

Проанализируем ситуацию: в БСП для работы с дополнительными обработками существует общий модуль ДополнительныеОтчетыИОбработки. Рассмотрим, как программно подключить обработку через этот механизм:


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

&НаКлиенте
Процедура ЗапуститьОбработкуБСП(СсылкаНаОбработку)
    ИмяВСеансе = ПодключитьЧерезБСП(СсылкаНаОбработку);
    ОткрытьФорму("ВнешняяОбработка." + ИмяВСеансе + ".Форма");
КонецПроцедуры

Этот метод предпочтительнее, так как он не заставляет вас вручную управлять временными файлами. Система сама позаботится об очистке ресурсов после закрытия сеанса или завершения работы с объектом.

Особенности работы в тонком клиенте и безопасный режим

Выясним причину возможных ошибок при использовании кода из обсуждения на форумах. Часто разработчики сталкиваются с тем, что код работает в толстом клиенте, но выдает ошибку в тонком. Основные причины:

  1. Доступность менеджеров: Объект ВнешниеОбработки недоступен на тонком клиенте. Все действия по поиску в справочнике, извлечению данных и первоначальному вызову метода Подключить должны происходить на сервере.
  2. Безопасный режим: Если при регистрации обработки в справочнике был указан флаг «Безопасный режим», обработка не сможет работать с файловой системой сервера или выполнять привилегированные операции. При программном вызове через БСП (Метод 2) этот режим наследуется автоматически.
  3. Имя формы: При использовании метода ОткрытьФорму для внешней обработки, путь всегда должен начинаться с префикса "ВнешняяОбработка.", за которым следует имя подключения, а не имя файла или имя объекта из конфигуратора.

Передача параметров в открываемую форму

Зачастую недостаточно просто открыть форму, нужно передать в нее данные (например, ссылку на документ или настройки). Рассмотрим, как это сделать правильно:


&НаКлиенте
Процедура ОткрытьСПараметрами(СсылкаНаОбработку, СсылкаНаЗаказ)
    ИмяВСеансе = ПодключитьЧерезБСП(СсылкаНаОбработку);
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ДокументСсылка", СсылкаНаЗаказ);
    ПараметрыФормы.Вставить("АвтоматическийЗапуск", Истина);
    
    ОткрытьФорму("ВнешняяОбработка." + ИмяВСеансе + ".Форма", ПараметрыФормы);
КонецПроцедуры

В самой внешней обработке в модуле формы в процедуре ПриСозданииНаСервере вы сможите обработать эти параметры:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("ДокументСсылка") Тогда
        Объект.ЗаказПокупателя = Параметры.ДокументСсылка;
    КонецЕсли;
КонецПроцедуры

Выполнение команд без открытия формы

Если задача состоит не в открытии интерфейса, а в выполнении серверного метода обработки (например, формирование печатной формы или выгрузка данных), разберем использование механизма команд БСП. Посмотрим на пример вызова команды:


// На клиенте
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("ДополнительнаяОбработкаСсылка", НужнаяСсылка);

// Вызываем универсальный клиентский метод БСП
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВнешнегоОбъекта(
    ПараметрыВыполнения, 
    ЭтаФорма
);

Подведем итог: Для программного вызова зарегистрированной обработки в современных системах 1С 8.3 лучше всего использовать метод ПодключитьВнешнююОбработку из БСП на сервере, а затем открывать форму на клиенте по полученному имени. Это гарантирует стабильную работу как в тонком, так и в веб-клиенте, а также обеспечивает корректную работу механизмов безопасности платформы.

← На главную