1.
sergey.s.betke@yandex.ru
424.02.18 14:21 Сейчас в теме
В ОписанииОповещения есть свойства ИмяПроцедурыОбработкиОшибки и МодульОбработкиОшибки. В своих асинхронных процедурах для обработки исключений напрашивается вызов ИмяПроцедурыОбработкиОшибки в случае исключения. Но аналога ВыполнитьОбработкуОповещения для этих целей в справке не вижу.
Для тонкого клиента при обработке исключения вызов обработчика исключения, указанного в ОписанииОповещения, реализовал через Выполнить. Но для ВебКлиента этот вариант не подходит.
ВыполнитьОбработкуОповещения для этих целей неприменим. Пытаться строить описание оповещения с ИмяПроцедурыОбработкиОшибки невозможно, потому как параметры указанной процедуры отличаются от параметров обработчика ИмяПроцедуры.
Раз процедуры глобального контекста умеют вызывать ИмяПроцедурыОбработкиОшибки, значит в платформе есть соответствующие процедуры для вызова обработчика ошибки из ОписаниеОповещения. Но в справке найти их не могу.
Итого: можно ли и как в ВебКлиенте использовать ИмяПроцедурыОбработкиОшибки из ОписаниеОповещения для вызова обработчика ошибки (исключения)?
4.
sergey.s.betke@yandex.ru
424.02.18 22:06 Сейчас в теме
(3)
Речь о 1С:Документооборот КОРП, автозаполнение шаблонов файлов данными документа. В конфигурации код подсистемы построен на прямой записи в xml файлы, что применимо для docx и odt файлов. Но не для doc. И не для других типов.
В результате - подготовили расширение конфигурации, производящее автозаполнение через COM объекты.
Проблема, собственно, в том, что в 1С:ДО предусмотрено автозаполнение и на клиенте, и на сервере (опционально). Автозаполнение на сервере переписали, проблем нет. Переписали на ДлительныеОперации. Но код в 1С:ДО для клиента был СИНХРОННЫМ! Естественно, на работу в ВебКлиенте он вообще не рассчитан. Но потребность есть.
В связи с этим подготовлен код и для исполнения автозаполнения на клиенте. В тонком клиенте он работает. Но, учитывая, что работаем с COM объектом, необходима обработка исключений.
Как-то так:
Процедура ОбработчикВыполненияАлгоритмаЧерезОповещение(
ПредыдущийРезультат = Неопределено,
ДополнительныеПараметры) Экспорт
Попытка
//опасные код
Исключение
АсинхронныеОперацииКлиентИТГ.ОбработатьИсключениеВОбработчикеОповещения(ИнформацияОбОшибке(),, ДополнительныеПараметры);
КонецПопытки;
КонецПроцедуры
Процедура ОбработатьИсключениеВОбработчикеОповещения(Знач ИнформацияОбОшибке, СтандартнаяОбработка = Истина, ДополнительныеПараметры = Неопределено) Экспорт
Если СтандартнаяОбработка Тогда
ПеременныеПоследовательностиОповещений = ОбновитьИВернутьПеременныеОбработчикаОповещения(ИнформацияОбОшибке, ДополнительныеПараметры, "ИнформацияОбОшибке");
ПодготовленныйОбработчикОшибки = АсинхронныеОперацииСлужебныйКлиентИТГ.ПодготовитьОписаниеОповещенияДляОбработкиРезультата(ДополнительныеПараметры);
Если ПодготовленныйОбработчикОшибки <> Неопределено Тогда
Попытка
ВыполнитьОбработкуОповещенияОбОшибке(ПодготовленныйОбработчикОшибки, ИнформацияОбОшибке, СтандартнаяОбработка);
Если СтандартнаяОбработка Тогда
ОбработатьИсключениеВОбработчикеОповещения(ИнформацияОбОшибке, СтандартнаяОбработка, ПодготовленныйОбработчикОшибки.ДополнительныеПараметры);
КонецЕсли;
Исключение
ОбработатьИсключениеВОбработчикеОповещения(ИнформацияОбОшибке(), СтандартнаяОбработка, ПодготовленныйОбработчикОшибки.ДополнительныеПараметры);
КонецПопытки;
Иначе
АсинхронныеОперацииСлужебныйКлиентПереопределяемыйИТГ.СтандартныйОбработчикОповещенияОбОшибке(ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ВыполнитьОбработкуОповещенияОбОшибке(Знач ОбработчикОшибки, Знач ИнформацияОбОшибке, СтандартнаяОбработка) Экспорт
Если ОбработчикОшибки.ИмяПроцедурыОбработкиОшибки <> "" Тогда
Выражение =
?(ОбработчикОшибки.МодульОбработкиОшибки <> Неопределено, "ОбработчикОшибки.МодульОбработкиОшибки.", "")
+ ОбработчикОшибки.ИмяПроцедурыОбработкиОшибки +
"(ИнформацияОбОшибке, СтандартнаяОбработка, ОбработчикОшибки.ДополнительныеПараметры)";
Выполнить(Выражение);
КонецЕсли;
КонецПроцедуры
Показать
Итого, смысл в том, что иметь возможность писать код с использованием
ИмяПроцедурыОбработкиОшибки
уже сейчас, с расчётом на то, что работа с COM объектом в дальнейшем может быть переписана на работу с внешней компонентой (есть желание нарисовать внешнюю компоненту для работы с Open Office через UNO в целях обеспечения кроссплатформенности). А при работа с расширениями и внешними компонентами платформа уже сейчас использует
ИмяПроцедурыОбработкиОшибки
.
Указанный выше код позволяет указывать обработчик ошибки через
ИмяПроцедурыОбработкиОшибки
, но вызов его осуществляется через
Выполнить
, что не будет работать на ВебКлиенте, ради которого асинхронность и пытаемся реализовать.
2.
sergey.s.betke@yandex.ru
424.02.18 14:27 Сейчас в теме
Собственно, назначение обсуждаемых свойств описано здесь: http://v8.1c.ru/o7/201412async/index.htm. Но как их использовать на ВебКлиенте в своих асинхронных процедурах?..
5.
sergey.s.betke@yandex.ru
427.02.18 12:47 Сейчас в теме
В попытках найти недокументированную процедуру платформы глобального контекста... Файл mngsrv_root.res. Находим в нём javascript код ряда клиентских функций:
8.
sergey.s.betke@yandex.ru
427.02.18 16:53 Сейчас в теме
Пришла дурная мысль в голову: вызывать в ВебКлиенте обработчик оповещения об ошибке через вызов существующих асинхронных методов платформы (например - НачатьУстановкуТолькоЧтение) с заранее ошибочными параметрами, передав необходимое ОписаниеОповещение. Так мы получим вызов обработчика ошибки, указанного в ОписанииОповещения, но параметр СведенияОбОшибке будет в корне неверным. Совершенно неинформативным.
Смириться с этим? Коллеги, возможно у кого-нибудь есть доступ к телу разработчиков платформы. Один вопрос: есть ли на самом деле процедура (пусть и недокументированная), вызывающая обработчик ошибки из ОписанияОповещения? Или может - планируется? Ну ведь не хватает явно!