Аналог ВыполнитьОбработкуОповещения для ИмяПроцедурыОбработкиОшибки

1. sergey.s.betke@yandex.ru 4 24.02.18 14:21 Сейчас в теме
В ОписанииОповещения есть свойства ИмяПроцедурыОбработкиОшибки и МодульОбработкиОшибки. В своих асинхронных процедурах для обработки исключений напрашивается вызов ИмяПроцедурыОбработкиОшибки в случае исключения. Но аналога ВыполнитьОбработкуОповещения для этих целей в справке не вижу.

Для тонкого клиента при обработке исключения вызов обработчика исключения, указанного в ОписанииОповещения, реализовал через Выполнить. Но для ВебКлиента этот вариант не подходит.

ВыполнитьОбработкуОповещения для этих целей неприменим. Пытаться строить описание оповещения с ИмяПроцедурыОбработкиОшибки невозможно, потому как параметры указанной процедуры отличаются от параметров обработчика ИмяПроцедуры.

Раз процедуры глобального контекста умеют вызывать ИмяПроцедурыОбработкиОшибки, значит в платформе есть соответствующие процедуры для вызова обработчика ошибки из ОписаниеОповещения. Но в справке найти их не могу.

Итого: можно ли и как в ВебКлиенте использовать ИмяПроцедурыОбработкиОшибки из ОписаниеОповещения для вызова обработчика ошибки (исключения)?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. spacecraft 24.02.18 15:26 Сейчас в теме
(1)
Итого: можно ли и как в ВебКлиенте использовать ИмяПроцедурыОбработкиОшибки из ОписаниеОповещения для вызова обработчика ошибки (исключения)?

Откуда и что вызывать собрались?
Давайте пример, откуда собрались вызывать "ИмяПроцедурыОбработкиОшибки".
4. sergey.s.betke@yandex.ru 4 24.02.18 22:06 Сейчас в теме
(3)
Речь о 1С:Документооборот КОРП, автозаполнение шаблонов файлов данными документа. В конфигурации код подсистемы построен на прямой записи в xml файлы, что применимо для docx и odt файлов. Но не для doc. И не для других типов.

В результате - подготовили расширение конфигурации, производящее автозаполнение через COM объекты.

Проблема, собственно, в том, что в 1С:ДО предусмотрено автозаполнение и на клиенте, и на сервере (опционально). Автозаполнение на сервере переписали, проблем нет. Переписали на ДлительныеОперации. Но код в 1С:ДО для клиента был СИНХРОННЫМ! Естественно, на работу в ВебКлиенте он вообще не рассчитан. Но потребность есть.

В связи с этим подготовлен код и для исполнения автозаполнения на клиенте. В тонком клиенте он работает. Но, учитывая, что работаем с COM объектом, необходима обработка исключений.

Как-то так:

Процедура ОбработчикВыполненияАлгоритмаЧерезОповещение(
	ПредыдущийРезультат = Неопределено,
	ДополнительныеПараметры) Экспорт
	
	Попытка
		//опасные код
	Исключение
		АсинхронныеОперацииКлиентИТГ.ОбработатьИсключениеВОбработчикеОповещения(ИнформацияОбОшибке(),, ДополнительныеПараметры);
	КонецПопытки;
	
КонецПроцедуры

Процедура ОбработатьИсключениеВОбработчикеОповещения(Знач ИнформацияОбОшибке, СтандартнаяОбработка = Истина, ДополнительныеПараметры = Неопределено) Экспорт
	
	Если СтандартнаяОбработка Тогда
	
		ПеременныеПоследовательностиОповещений = ОбновитьИВернутьПеременныеОбработчикаОповещения(ИнформацияОбОшибке, ДополнительныеПараметры, "ИнформацияОбОшибке");
		ПодготовленныйОбработчикОшибки = АсинхронныеОперацииСлужебныйКлиентИТГ.ПодготовитьОписаниеОповещенияДляОбработкиРезультата(ДополнительныеПараметры);
		
		Если ПодготовленныйОбработчикОшибки <> Неопределено Тогда
			
			Попытка
				ВыполнитьОбработкуОповещенияОбОшибке(ПодготовленныйОбработчикОшибки, ИнформацияОбОшибке, СтандартнаяОбработка);
				Если СтандартнаяОбработка Тогда
					ОбработатьИсключениеВОбработчикеОповещения(ИнформацияОбОшибке, СтандартнаяОбработка, ПодготовленныйОбработчикОшибки.ДополнительныеПараметры);
				КонецЕсли;
			Исключение
				ОбработатьИсключениеВОбработчикеОповещения(ИнформацияОбОшибке(), СтандартнаяОбработка, ПодготовленныйОбработчикОшибки.ДополнительныеПараметры);
			КонецПопытки;
			
		Иначе
			АсинхронныеОперацииСлужебныйКлиентПереопределяемыйИТГ.СтандартныйОбработчикОповещенияОбОшибке(ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ВыполнитьОбработкуОповещенияОбОшибке(Знач ОбработчикОшибки, Знач ИнформацияОбОшибке, СтандартнаяОбработка) Экспорт
	
	Если ОбработчикОшибки.ИмяПроцедурыОбработкиОшибки <> "" Тогда
		
		Выражение =
			?(ОбработчикОшибки.МодульОбработкиОшибки <> Неопределено, "ОбработчикОшибки.МодульОбработкиОшибки.", "")
			+ ОбработчикОшибки.ИмяПроцедурыОбработкиОшибки +
			"(ИнформацияОбОшибке, СтандартнаяОбработка, ОбработчикОшибки.ДополнительныеПараметры)";
		
		Выполнить(Выражение);
		
	КонецЕсли;
	
КонецПроцедуры
Показать


Итого, смысл в том, что иметь возможность писать код с использованием
ИмяПроцедурыОбработкиОшибки 
уже сейчас, с расчётом на то, что работа с COM объектом в дальнейшем может быть переписана на работу с внешней компонентой (есть желание нарисовать внешнюю компоненту для работы с Open Office через UNO в целях обеспечения кроссплатформенности). А при работа с расширениями и внешними компонентами платформа уже сейчас использует
ИмяПроцедурыОбработкиОшибки
.

Указанный выше код позволяет указывать обработчик ошибки через
ИмяПроцедурыОбработкиОшибки
, но вызов его осуществляется через
Выполнить
, что не будет работать на ВебКлиенте, ради которого асинхронность и пытаемся реализовать.
2. sergey.s.betke@yandex.ru 4 24.02.18 14:27 Сейчас в теме
Собственно, назначение обсуждаемых свойств описано здесь: http://v8.1c.ru/o7/201412async/index.htm. Но как их использовать на ВебКлиенте в своих асинхронных процедурах?..
5. sergey.s.betke@yandex.ru 4 27.02.18 12:47 Сейчас в теме
В попытках найти недокументированную процедуру платформы глобального контекста... Файл mngsrv_root.res. Находим в нём javascript код ряда клиентских функций:

R.BeginInstallCryptoExtension=function(b){
  b=G.Eb(b,fH,!0,0);
  var c=DIa()
    .forceAsync()
    .after(function(b){
      return b ? Bj(p.IDS_EXT_CMPNT_ALREADY_INSTALLED,[Ej],void 0,void 0,void 0,!0) : tLa()
    })
    ._catch(function(b){
      B.ci.handleError(b);
      return b
    });
  c.after(function(){
    G.ra.isEqual(b)||b.Em()
  });
  ki.a(c,b)
};

R.ExecuteNotifyProcessing=function(b,c){
  if (!G.ra.isEqual(b)){
    var d=G.Eb(G.va(b),fH,!1,0);
    void 0===c&&(c=G.ra);
    d.Xd©
  }
};
Показать


Хорошо виден кусок кода в асинхронной функции глобального контекста, которая умеет вызывать в случае исключения ИмяПроцедурыОбработкиОшибки:

    ._catch(function(b){
      B.ci.handleError(b);
      return b
    });


Собственно, вопрос в том, существует ли клиентская функция глобального контекста, трансформируемая в handleError в ВебКлиенте...
6. sergey.s.betke@yandex.ru 4 27.02.18 15:06 Сейчас в теме
(5)Ан нет... Дальнейшее изучение javascript дало следующее. Ниже - собственно класс ОписаниеОповещения:

fH.prototype.Fb(
  {name:"ProcedureName",
    ba:"ИмяПроцедуры",
    _get:function(){
      return new J(this.aa[XJ])
    }
  },
  {name:"Module",
    ba:"Модуль",
    _get:function(){
      return this.a[XJ]
    }
  },
  {name:"ErrorHandlerProcedureName",
    ba:"ИмяПроцедурыОбработкиОшибки",
    _get:function(){
      var b=this.aa[YJ];
      return ""!==b? new J(b) : G.ra
    }
  },
  {name:"ErrorHandlerModule",
    ba:"МодульОбработкиОшибки",
    _get:function(){
      var b=this.a[YJ];
      return null!==b? b : G.ra
    }
  },
  {name:"AdditionalParameters",
    ba:"ДополнительныеПараметры",
    _get:function(){
      return this.j
    }
  }
);
  
k=fH.prototype;

k.Hda=function(b,c,d){
  var e=this.a[b],
    f=this.aa[b],
    g=[];
  for(h=2; h<arguments.length; h++) g.push(arguments[h]);
  g.push(this.j);
  ZJ(function(){
    c? e.nba(f,g) : e.yJ(f,g)
  })
};

k.Xd=function(b){
  var c=[XJ,!1];
  c.push.apply(c,arguments);
  this.Hda.apply(this,c)
};

k.Em=function(b){
  var c=[XJ,!0];
  c.push.apply(c,arguments);
  this.Hda.apply(this,c)
};

k.Ye=function(b){
  if(null!==this.a[YJ]){
    var c=new il(!0);
    this.Hda(YJ,!0,Q.T2(b),c);
    c.yb() && B.ci.handleError(b)
  } else B.ci.handleError(b)
};

k.Xi=function(){
  if(!this.$){
    this.$=!0;
    this.a[XJ].Xi();
    null!==this.a[YJ] && this.a[YJ].Xi();
    var b=this.j;
    b && b.Xi && this.j.Xi();
    this.$=!1
  }
};
Показать


По сути, нас интересует метод объекта:

k.Ye=function(b){
  if (null!==this.a[YJ]) {           // Если Неопределено <> ОписаниеОповещения.МодульОбработкиОшибки Тогда
    var c=new il(!0);                //   СтандартнаяОбработка = Истина 
    this.Hda(YJ,!0,Q.T2(b),c);       //   вызываем обработчик ошибки
    c.yb() && B.ci.handleError(b)    //   Если СтандартнаяОбработка Тогда ОбработатьОшибкуПоУмолчанию КонецЕсли
  } else B.ci.handleError(b)         // Иначе ОбработатьОшибкуПоУмолчанию КонецЕсли
};
Показать


Это прямо метод объекта в javascript. Предположу, что и у ОписанияОповещения в 1С может быть недокументированный метод для вызова обработки ошибки...

И обёртки типа

function $Ka(b,c,d,e,f){
  c=G.Eb(c,fH,!1,0);
  d=G.toString(d);
  e=G.toString(e);
  f=G.bb(f);
  d=b.a.init(d,e,f,fK())
    .forceAsync();
  d.after(b,function(){
    c.Xd(this)
  })._catch(function(b){
    c.Ye(b)
  });
  ki.a(d,c)
}
Показать


видны для расширений (шифрование, работа с файлами и т.д.). Всё-таки, какой же код в 1С будет транслирован в c.Ye(b)?
7. sergey.s.betke@yandex.ru 4 27.02.18 16:48 Сейчас в теме
Ещё одна обёртка (VJ), которая используется в этом коде, и пример её использования (в НачатьУстановкуТолькоЧтения):

function VJ(b,c){
  b.after(function(){
    G.ra.isEqual( c ) || c.Xd()
  })._catch(function(b){
    G.ra.isEqual( c ) ? B.ci.handleError(b) : c.Ye(b)
  });
  ki.a(b,c)
}
Показать


{name:"BeginSettingReadOnly",
  ba:"НачатьУстановкуТолькоЧтения",
  wa:function(b,c){
    var d=b=G.Eb(b,fH,!0,0),
      e=G.wb( c );
    VJ(this.a.setReadOnly(e).forceAsync(), d)
  }
}
Показать


Но сопоставленных им процедур 1С не видно...
8. sergey.s.betke@yandex.ru 4 27.02.18 16:53 Сейчас в теме
Пришла дурная мысль в голову: вызывать в ВебКлиенте обработчик оповещения об ошибке через вызов существующих асинхронных методов платформы (например - НачатьУстановкуТолькоЧтение) с заранее ошибочными параметрами, передав необходимое ОписаниеОповещение. Так мы получим вызов обработчика ошибки, указанного в ОписанииОповещения, но параметр СведенияОбОшибке будет в корне неверным. Совершенно неинформативным.

Смириться с этим? Коллеги, возможно у кого-нибудь есть доступ к телу разработчиков платформы. Один вопрос: есть ли на самом деле процедура (пусть и недокументированная), вызывающая обработчик ошибки из ОписанияОповещения? Или может - планируется? Ну ведь не хватает явно!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот