Версия для печати темы (https://pro1c.org.ua/index.php?s=751e64c2c2740d26f1d349af4b88e4ce&showtopic=22644)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ 1С Предприятие 8 _ Как открыть внешнюю обработку в тонком клиенте?

Автор: Vofka 26.03.15, 16:37

Есть у клиента конфа на управляемых формах, которая начинала свой жизненный путь с одной типовой Украинской конфы на обычных формах. Как известно (или не известно smile.gif ) во всех типовых конфигурациях ещё с давних времен есть справочник ВнешниеОбработки, в которые добавляют отчеты, обработки, печатные формы и обработки для заполнения табличных частей. В моём случае возникла потребность во внешних отчетах и обработках в тонком клиенте.

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

Сделал управляемую форму списка, модуль которой содержит такой код:

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

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

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


Тут должно быть почти все более менее понятно. Выделю самое важное. Для того, чтобы запустить внешнюю обработку её надо сначала поместить во временное хранилище в виде двоичных данных, после чего эти двоичные данные подключить как внешний отчет или обработку:

ВнешниеОбработки.Подключить(АдресВоВременномХранилище,, БезопасныйРежим);


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

Автор: VikingKosmo 26.03.15, 16:45

По идее в БСП есть примеры как это делать icon_beer17.gif

Автор: Vofka 26.03.15, 16:48

Вполне может быть.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua