Как программно открыть внешнюю обработку из справочника "Дополнительные отчеты и обработки" и передать данные в ее табличную часть?

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

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

В этой статье мы подробно разберем, как правильно подключить и открыть форму обработки, хранящуюся в справочнике ДополнительныеОтчетыИОбработки, а также решим ключевую задачу — как безопасно передать таблицу значений или табличную часть вызывающей формы внутрь открываемой внешней обработки.

Метод 1. Программное подключение и открытие формы внешней обработки через БСП

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

Рассмотрим пошагово процесс, разделенный на серверную и клиентскую части:

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

Давайте посмотрим на пример реализации этого механизма в модуле нашей управляемой формы:


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

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

Метод 2. Передача табличной части во внешнюю обработку через временное хранилище

Теперь решим более сложную задачу: как передать таблицу данных (например, табличную часть документа) во вновь открываемую форму обработки? Напрямую передать объект типа ТаблицаЗначений или ДанныеФормыКоллекция через параметры формы на клиент нельзя из-за ограничений архитектуры "клиент-сервер" платформы 1С.

Выясним наиболее надежный и быстрый способ обхода этого ограничения. Мы применим механизм Временного хранилища. Схема работы выглядит следующим образом:

  1. На сервере вызывающей формы мы выгружаем табличную часть в ТаблицаЗначений.
  2. Помещаем эту таблицу во временное хранилище и получаем уникальный адрес (навигационную ссылку).
  3. Передаем этот адрес как параметр при открытии формы внешней обработки.
  4. В модуле формы внешней обработки (в обработчике ПриСозданииНаСервере) извлекаем таблицу из хранилища и загружаем ее в реквизит формы обработки.

Рассмотрим программный код вызывающей формы:


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

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

Теперь настроим принимающую сторону. Внутри самой внешней обработки нам нужно открыть модуль основной управляемой формы и прописать логику заполнения в обработчике ПриСозданииНаСервере:


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

Метод 3. Устаревший классический способ (для обычных форм и старых конфигураций типа УПП 1.3)

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

Посмотрим, как выглядит программный код для такой реализации:


// Пример получения и открытия обработки для обычного приложения
КодОбработки = "ВашКодОбработки";
спрВнешниеОбработки_Обработка = Справочники.ВнешниеОбработки.НайтиПоКоду(КодОбработки);

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

Важное примечание: Использование записи временных файлов на диск в управляемом приложении крайне нежелательно, так как это вызывает дополнительные задержки на клиенте, может блокироваться политиками безопасности операционной системы и требует ручной очистки временных файлов после закрытия обработки.

Решение проблемы с отладкой внешних обработок в БСП

Многие разработчики сталкиваются с трудностью: при динамическом подключении обработки через механизмы БСП точки останова в исходном файле обработки .epf перестают работать. Это происходит из-за того, что платформа запускает обработку из временной копии под уникальным сгенерированным именем сеанса.

Проанализируем три основных способа решения этой проблемы:

  1. Использование временной папки Temp: При запуске обработки в БСП платформа создает её копию во временном каталоге сеанса пользователя. Имя файла обычно выглядит как v8_XXXX_XX.epf. Вы можете открыть именно этот временный файл через Конфигуратор и установить точки останова непосредственно в нем.
  2. Настройка режима отладки в БСП: В некоторых версиях БСП предусмотрена специальная константа или настройка в карточке дополнительной обработки, позволяющая указать путь к локальному файлу на диске разработчика. В этом случае система подключает локальный файл напрямую, что восстанавливает полноценную работу точек останова.
  3. Использование расширений для разработчиков: Существуют специализированные вспомогательные расширения (доступные на профессиональных сообществах разработчиков 1С), которые перехватывают метод ПодключитьВнешнююОбработку и автоматически подменяют вызов временного хранилища на загрузку с диска вашего компьютера.
← На главную