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