Как открыть программно внешний отчет из справочника программно в web-интерфейсе?
Конфигурация самописная.

Через тонкий клиент запускаю - все Ок.
Через браузер ругается "Асинхронные методы запрещены!"

с УФ работаю впервые, с асинхронными методами разобраться, к сожалению, не могу и не успеваю, что еще больше напрягает.

```1c
    &НаСервере
    Функция ПодключитьВнешнийОтчет(АдресХранилища)
    Возврат ВнешниеОтчеты.Подключить(АдресХранилища);
    КонецФункции

    &НаКлиенте
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

    #Если ВебКлиент Тогда
    Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
    НачатьУстановкуРасширенияРаботыСФайлами();
    ПодключитьРасширениеРаботыСФайлами();
    КонецЕсли;
    #КонецЕсли

    СтандартнаяОбработка = Ложь;
    ВыбСтрока=Элемент.ТекущиеДанные;

    ЭтоОбработка = ?(ВыбСтрока.ВидОбработки = ПредопределенноеЗначение("Перечисление.ВидыДополнительныхВнешнихОбработок.Обработка"), Истина, Ложь);
    ЭтоОтчет = ?(ВыбСтрока.ВидОбработки = ПредопределенноеЗначение("Перечисление.ВидыДополнительныхВнешнихОбработок.Отчет"), Истина, Ложь);

    Если НЕ (ЭтоОбработка ИЛИ ЭтоОтчет) Тогда
    Возврат;
    КонецЕсли;

    Если НЕ ВыбСтрока.ЭтоГруппа Тогда
    АдресХранилища = ";

    ВнОтчет = ПолучитьСсылкуНаВнешнийОтчетОбработкуПоКодуНаСервере(ВыбСтрока.Код);
    ИмяФайла = КаталогВременныхФайлов() + "SUP.erf";
    ВнОтчет.Записать(ИмяФайла);

    Если ЭтоОтчет Тогда

    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);
    ДополнительныеПараметры.Вставить("АдресХранилища", АдресХранилища);

    ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещения", ЭтаФорма,ДополнительныеПараметры);
    НачатьПомещениеФайла(ОбработкаОкончанияПомещения, АдресХранилища, ИмяФайла, Ложь);
    КонецЕсли;
    КонецЕсли;

    КонецПроцедуры

    &НаКлиенте
    Процедура ПоместитьФайлОтчетаВХранилище(Рез, ДополнительныеПараметры) Экспорт

    ИмяФайла = ДополнительныеПараметры.ИмяФайла;
    АдресХранилища = ДополнительныеПараметры.АдресХранилища;

    ИмяОбработки = ПодключитьВнешнийОтчет(АдресХранилища);
    ОткрытьФорму("ВнешнийОтчет."+ИмяОбработки+".Форма");

    КонецПроцедуры
```

Просьба большая, помогите разобраться :(
---
Сделал без БСП (лишний код в моей конфигурации).

Привожу пример кода, может кому пригодится.

```1c
    &НаСервере
    Функция ПодключитьВнешнююОбработку(АдресХранилища)
    Возврат ВнешниеОбработки.Подключить(АдресХранилища);
    КонецФункции

    &НаСервере
    Функция ПодключитьВнешнийОтчет(АдресХранилища)
    Возврат ВнешниеОтчеты.Подключить(АдресХранилища);
    КонецФункции

    &НаКлиенте
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;
    ВыбСтрока=Элемент.ТекущиеДанные;

    #Если ВебКлиент Тогда
    Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
    НачатьУстановкуРасширенияРаботыСФайлами();
    //ПодключитьРасширениеРаботыСФайлами();
    КонецЕсли;
    #КонецЕсли

    ЭтоОбработка = ?(ВыбСтрока.ВидОбработки = ПредопределенноеЗначение("Перечисление.ВидыДополнительныхВнешнихОбработок.Обработка"), Истина, Ложь);
    ЭтоОтчет = ?(ВыбСтрока.ВидОбработки = ПредопределенноеЗначение("Перечисление.ВидыДополнительныхВнешнихОбработок.Отчет"), Истина, Ложь);

    Если НЕ (ЭтоОбработка ИЛИ ЭтоОтчет) Тогда
    Возврат;
    КонецЕсли;

    Если НЕ ВыбСтрока.ЭтоГруппа Тогда
    АдресХранилища = ";

    ИмяФайла = КаталогВременныхФайлов() + "SUP.erf";

    АдХр = ПолучитьСсылкуНаВнешнийОтчетОбработкуПоКодуНаСервере(ВыбСтрока.Код);

    ФайлВоВрХр = новый ОписаниеПередаваемогоФайла;
    ФайлВоВрХр.Имя = ИмяФайла;
    ФайлВоВрХр.Хранение = АдХр;

    ПолучаемыйФайл = Новый Массив;
    ПолучаемыйФайл.Добавить(ФайлВоВрХр);

    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);
    ДополнительныеПараметры.Вставить("АдресХранилища", АдресХранилища);
    ДополнительныеПараметры.Вставить("ЭтоОбработка", ЭтоОбработка);
    ДополнительныеПараметры.Вставить("ЭтоОтчет", ЭтоОтчет);

    ОбработкаОкончанияПолученияФайла = Новый ОписаниеОповещения("ОбработчикОкончанияПолученияФайлов",ЭтаФорма,ДополнительныеПараметры);
    НачатьПолучениеФайлов(ОбработкаОкончанияПолученияФайла,ПолучаемыйФайл,,Ложь);

    КонецЕсли;

    КонецПроцедуры

    &НаКлиенте
    Процедура ОбработчикОкончанияПолученияФайлов(Рез, ДополнительныеПараметры) Экспорт

    ИмяФайла = ДополнительныеПараметры.ИмяФайла;
    АдресХранилища = ДополнительныеПараметры.АдресХранилища;
    ЭтоОбработка = ДополнительныеПараметры.ЭтоОбработка;
    ИмяФайла = ДополнительныеПараметры.ИмяФайла;
    ЭтоОтчет = ДополнительныеПараметры.ЭтоОтчет;

    Если ЭтоОбработка Тогда

    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);
    ДополнительныеПараметры.Вставить("АдресХранилища", АдресХранилища);

    ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещенияОбр", ЭтаФорма,ДополнительныеПараметры);
    НачатьПомещениеФайла(ОбработкаОкончанияПомещения, АдресХранилища, ИмяФайла, Ложь);

    ИначеЕсли ЭтоОтчет Тогда

    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);
    ДополнительныеПараметры.Вставить("АдресХранилища", АдресХранилища);

    ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещения", ЭтаФорма,ДополнительныеПараметры);
    НачатьПомещениеФайла(ОбработкаОкончанияПомещения, АдресХранилища, ИмяФайла, Ложь);
    КонецЕсли;

    КонецПроцедуры

    &НаКлиенте
    Процедура ПоместитьФайлОтчетаВХранилище(Рез, ДополнительныеПараметры) Экспорт

    ИмяФайла = ДополнительныеПараметры.ИмяФайла;
    АдресХранилища = ДополнительныеПараметры.АдресХранилища;

    ИмяОбработки = ПодключитьВнешнийОтчет(АдресХранилища);
    ОткрытьФорму("ВнешнийОтчет."+ИмяОбработки+".Форма");

    КонецПроцедуры

    &НаСервере
    Функция ПолучитьСсылкуНаВнешнийОтчетОбработкуПоКодуНаСервере(КодОтчетаОбработки)

    Ссылка = Справочники.ОтчетыДляЗаказчика.НайтиПоКоду(КодОтчетаОбработки).Ссылка;
    Хран = Ссылка.ХранилищеВнешнейОбработки.Получить();
    АдресВрХр = ПоместитьВоВременноеХранилище(Хран, Новый УникальныйИдентификатор);
    Возврат АдресВрХр;

    КонецФункции

    &НаКлиенте
    Процедура ОбработчикОкончанияПомещения(Результат, АдресХранилища, ИмяФайла, ДополнительныеПараметры) Экспорт

    Если Результат Тогда
    ИмяОбработки = ПодключитьВнешнийОтчет(АдресХранилища);
    ОткрытьФорму("ВнешнийОтчет."+ИмяОбработки+".Форма");
    Иначе
    Сообщить("Отчет не открыт!");
    КонецЕсли
    КонецПроцедуры

    &НаКлиенте
    Процедура ОбработчикОкончанияПомещенияОбр(Результат, АдресХранилища, ИмяФайла, ДополнительныеПараметры) Экспорт

    Если Результат Тогда
    ИмяОбработки = ПодключитьВнешнююОбработку(АдресХранилища);
    ОткрытьФорму("ВнешняяОбработка."+ИмяОбработки+".Форма");
    Иначе
    Сообщить("Отчет не открыт!");
    КонецЕсли
    КонецПроцедуры
```
---
если используется БСП https://infostart.ru/public/1027823/
---
эту статью читал ранее, не помогло к сожалению.
Работаю без БСП - конфигурация самописная. Все работает если запускать через тонкого клиента.
А вот в браузере - "Асинхронные методы запрещены"
---
Стоит задуматься о подключении модулей БСП в Вашу конфигурацию. Не придется изобретать велосипеды сейчас и возможно в будущем.
---
Сделал без БСП (лишний код в моей конфигурации).

Привожу пример кода, может кому пригодится.

```1c
    &НаСервере
    Функция ПодключитьВнешнююОбработку(АдресХранилища)
    Возврат ВнешниеОбработки.Подключить(АдресХранилища);
    КонецФункции

    &НаСервере
    Функция ПодключитьВнешнийОтчет(АдресХранилища)
    Возврат ВнешниеОтчеты.Подключить(АдресХранилища);
    КонецФункции

    &НаКлиенте
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;
    ВыбСтрока=Элемент.ТекущиеДанные;

    #Если ВебКлиент Тогда
    Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
    НачатьУстановкуРасширенияРаботыСФайлами();
    //ПодключитьРасширениеРаботыСФайлами();
    КонецЕсли;
    #КонецЕсли

    ЭтоОбработка = ?(ВыбСтрока.ВидОбработки = ПредопределенноеЗначение("Перечисление.ВидыДополнительныхВнешнихОбработок.Обработка"), Истина, Ложь);
    ЭтоОтчет = ?(ВыбСтрока.ВидОбработки = ПредопределенноеЗначение("Перечисление.ВидыДополнительныхВнешнихОбработок.Отчет"), Истина, Ложь);

    Если НЕ (ЭтоОбработка ИЛИ ЭтоОтчет) Тогда
    Возврат;
    КонецЕсли;

    Если НЕ ВыбСтрока.ЭтоГруппа Тогда
    АдресХранилища = ";

    ИмяФайла = КаталогВременныхФайлов() + "SUP.erf";

    АдХр = ПолучитьСсылкуНаВнешнийОтчетОбработкуПоКодуНаСервере(ВыбСтрока.Код);

    ФайлВоВрХр = новый ОписаниеПередаваемогоФайла;
    ФайлВоВрХр.Имя = ИмяФайла;
    ФайлВоВрХр.Хранение = АдХр;

    ПолучаемыйФайл = Новый Массив;
    ПолучаемыйФайл.Добавить(ФайлВоВрХр);

    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);
    ДополнительныеПараметры.Вставить("АдресХранилища", АдресХранилища);
    ДополнительныеПараметры.Вставить("ЭтоОбработка", ЭтоОбработка);
    ДополнительныеПараметры.Вставить("ЭтоОтчет", ЭтоОтчет);

    ОбработкаОкончанияПолученияФайла = Новый ОписаниеОповещения("ОбработчикОкончанияПолученияФайлов",ЭтаФорма,ДополнительныеПараметры);
    НачатьПолучениеФайлов(ОбработкаОкончанияПолученияФайла,ПолучаемыйФайл,,Ложь);

    КонецЕсли;

    КонецПроцедуры

    &НаКлиенте
    Процедура ОбработчикОкончанияПолученияФайлов(Рез, ДополнительныеПараметры) Экспорт

    ИмяФайла = ДополнительныеПараметры.ИмяФайла;
    АдресХранилища = ДополнительныеПараметры.АдресХранилища;
    ЭтоОбработка = ДополнительныеПараметры.ЭтоОбработка;
    ИмяФайла = ДополнительныеПараметры.ИмяФайла;
    ЭтоОтчет = ДополнительныеПараметры.ЭтоОтчет;

    Если ЭтоОбработка Тогда

    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);
    ДополнительныеПараметры.Вставить("АдресХранилища", АдресХранилища);

    ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещенияОбр", ЭтаФорма,ДополнительныеПараметры);
    НачатьПомещениеФайла(ОбработкаОкончанияПомещения, АдресХранилища, ИмяФайла, Ложь);

    ИначеЕсли ЭтоОтчет Тогда

    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);
    ДополнительныеПараметры.Вставить("АдресХранилища", АдресХранилища);

    ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещения", ЭтаФорма,ДополнительныеПараметры);
    НачатьПомещениеФайла(ОбработкаОкончанияПомещения, АдресХранилища, ИмяФайла, Ложь);
    КонецЕсли;

    КонецПроцедуры

    &НаКлиенте
    Процедура ПоместитьФайлОтчетаВХранилище(Рез, ДополнительныеПараметры) Экспорт

    ИмяФайла = ДополнительныеПараметры.ИмяФайла;
    АдресХранилища = ДополнительныеПараметры.АдресХранилища;

    ИмяОбработки = ПодключитьВнешнийОтчет(АдресХранилища);
    ОткрытьФорму("ВнешнийОтчет."+ИмяОбработки+".Форма");

    КонецПроцедуры

    &НаСервере
    Функция ПолучитьСсылкуНаВнешнийОтчетОбработкуПоКодуНаСервере(КодОтчетаОбработки)

    Ссылка = Справочники.ОтчетыДляЗаказчика.НайтиПоКоду(КодОтчетаОбработки).Ссылка;
    Хран = Ссылка.ХранилищеВнешнейОбработки.Получить();
    АдресВрХр = ПоместитьВоВременноеХранилище(Хран, Новый УникальныйИдентификатор);
    Возврат АдресВрХр;

    КонецФункции

    &НаКлиенте
    Процедура ОбработчикОкончанияПомещения(Результат, АдресХранилища, ИмяФайла, ДополнительныеПараметры) Экспорт

    Если Результат Тогда
    ИмяОбработки = ПодключитьВнешнийОтчет(АдресХранилища);
    ОткрытьФорму("ВнешнийОтчет."+ИмяОбработки+".Форма");
    Иначе
    Сообщить("Отчет не открыт!");
    КонецЕсли
    КонецПроцедуры

    &НаКлиенте
    Процедура ОбработчикОкончанияПомещенияОбр(Результат, АдресХранилища, ИмяФайла, ДополнительныеПараметры) Экспорт

    Если Результат Тогда
    ИмяОбработки = ПодключитьВнешнююОбработку(АдресХранилища);
    ОткрытьФорму("ВнешняяОбработка."+ИмяОбработки+".Форма");
    Иначе
    Сообщить("Отчет не открыт!");
    КонецЕсли
    КонецПроцедуры
```