Есть у клиента конфа на управляемых формах, которая начинала свой жизненный путь с одной типовой Украинской конфы на обычных формах. Как известно (или не известно
) во всех типовых конфигурациях ещё с давних времен есть справочник ВнешниеОбработки, в которые добавляют отчеты, обработки, печатные формы и обработки для заполнения табличных частей. В моём случае возникла потребность во внешних отчетах и обработках в тонком клиенте.
Ну как бы не проблема. Давай гуглить, что-то пробовать. Проблема. В управляемых формах с этим, как оказывается, гемороя больше, чем в обычных формах. Ниже приведу решение и прокоментирую его.
Сделал управляемую форму списка, модуль которой содержит такой код:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ВидОбработки = ПолучитьВидОбработки(ВыбраннаяСтрока);
Если НЕ (ВидОбработки = "Отчет" ИЛИ ВидОбработки = "Обработка") Тогда
Возврат;
КонецЕсли;
ИмяОбработки = ПодключитьВнешнююОбработку(ВыбраннаяСтрока, Ложь);
Если НЕ ЗначениеЗаполнено(ИмяОбработки) Тогда
Возврат;
КонецЕсли;
Если ВидОбработки = "Обработка" Тогда
ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма");
Иначе
ОткрытьФорму("ВнешнийОтчет."+ ИмяОбработки +".Форма");
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПодключитьВнешнююОбработку(ВнешняяОбработка, БезопасныйРежим) Экспорт
УстановитьПривилегированныйРежим(Истина);
ДвоичныеДанныеОбработки = ВнешняяОбработка.ПолучитьОбъект().ХранилищеВнешнейОбработки.Получить();
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки);
Если ВнешняяОбработка.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Отчет Тогда
Возврат ВнешниеОтчеты.Подключить(АдресВоВременномХранилище,, БезопасныйРежим);
ИначеЕсли ВнешняяОбработка.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Обработка Тогда
Возврат ВнешниеОбработки.Подключить(АдресВоВременномХранилище,, БезопасныйРежим);
Иначе
Сообщить(НСтр("ru = 'Открыть можно только отчет или обработку'; uk = 'Відкрити можна лише звіт або обробку'"));
Возврат "";
КонецЕсли;
КонецФункции
&НаСервере
Функция ПолучитьВидОбработки(ВнешняяОбработка)
Если ВнешняяОбработка.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Отчет Тогда
Возврат "Отчет";
ИначеЕсли ВнешняяОбработка.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Обработка Тогда
Возврат "Обработка"
Иначе
Возврат "";
КонецЕсли;
КонецФункции
Тут должно быть почти все более менее понятно. Выделю самое важное. Для того, чтобы запустить внешнюю обработку её надо сначала поместить во временное хранилище в виде двоичных данных, после чего эти двоичные данные подключить как внешний отчет или обработку:
ВнешниеОбработки.Подключить(АдресВоВременномХранилище,, БезопасныйРежим);
В результате подключения мы получим имя обработки, которое можно использовать в методе ОткрытьФорму.
Процедура СписокВыбор - это обработчик события Выбор таблицы на форме.