Библиотека универсальной обработки асинхронных вызовов

Привожу библиотеку процедур, которые помогут быстро освоить и использовать возможности асинхронных вызовов платформы 1С: Предприятие 8.3
В библиотеке содержатся универсальные обработчики — инфраструктура, с помощью которой можно организовать использование асинхронных вызовов, задавая только параметры постобработки.

 

Как только в платформе 8.3 появились возможности использования асинхронных вызовов, я сразу же решил попробовать их использовать, но столкнулся с целым рядом сложностей.

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

Не утверждаю, что с помощью данной библиотеки можно обработать абсолютно все виды асинхронных вызовов, коих в платворме 8.3 стало достаточно много, но часть нагрузки на разработчика, связанную с организацией асинхронной работы, с помощью данной библиотеки снять можно

К библиотеке прилагается конфигурация, содержащая данную библиотеку, а также библиотеку универсальных функций.

Библиотека универсальных функций опубликована здесь:

//infostart.ru/public/319157/

 

#Если Клиент Тогда

// Асинхронно показывает вопрос и инициализирует обработку ответа
// Параметры:
// ДополнительныеПараметры - Структура - Содержит параметры обработки результата асинхронного вызова (см. ОбработкаРезультатаОповещения).
//
// Описание других параметров см. в описании процедуры ПоказатьВопрос
//
Процедура ПоказатьВопросИсполнения(ТекстВопроса,ДополнительныеПараметры,Кнопки = Неопределено,Таймаут = 60,КнопкаПоУмолчанию = Неопределено,Заголовок = "",КнопкаТаймаута = Неопределено) Экспорт

ДополнительныеПараметры.Вставить("УсловиеРезультата",КодВозвратаДиалога.Да);
ОписаниеОповещения = СоздатьОповещение(ДополнительныеПараметры);

Если Кнопки = Неопределено Тогда
Кнопки = РежимДиалогаВопрос.ДаНет;
КонецЕсли;

Если КнопкаПоУмолчанию = Неопределено Тогда
КнопкаПоУмолчанию = КодВозвратаДиалога.Нет;
КонецЕсли;

Если КнопкаТаймаута = Неопределено Тогда
КнопкаТаймаута = КодВозвратаДиалога.Нет;
КонецЕсли;

ПоказатьВопрос(ОписаниеОповещения,ТекстВопроса,Кнопки,Таймаут,КнопкаПоУмолчанию,Заголовок,КнопкаТаймаута);

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

// Асинхронно осуществляет обработку результата оповещения
// Параметры:
// Результат - Тип зависит от обработчика - Значение содержит результат выполнения асинхронного вызова
// ДополнительныеПараметры - Структура - Содержит параметры обработки результата асинхронного вызова
//   Ключи:
//   "УсловиеРезультата" - Если неопределено, обработка осуществляется независимо от значения Результат, в противном случае обсработка выполняется если Результат равен данному значению
//   "Команда" - Строка - Содержит текст команды, подлежащей выполнению в полной форме для оператора Выполнить
//   "Сервер" - Булево - Если Истина, то команда выполяется на сервере, иначе на клиенте
//   "ОбъектОповещения" - Если заполнен, то команда считается методом объекта, иначе выполняется независимо
//   "ПередатьРезультат" - Булево - Если Истина, то Результат передается на сервер, иначе не передается
//
Процедура ОбработкаРезультатаОповещения(Результат,ДополнительныеПараметры) Экспорт

УсловиеРезультата = ПолучитьЗначениеПоКлючу(ДополнительныеПараметры,"УсловиеРезультата");
Если УсловиеРезультата = Неопределено или Результат = УсловиеРезультата Тогда
ТекстКоманды = ПолучитьЗначениеПоКлючу(ДополнительныеПараметры,"Команда",Тип("Строка"));
ТипБулево = Тип("Булево");
Если не ПустаяСтрока(ТекстКоманды) Тогда
ПередатьНаСервер = ПолучитьЗначениеПоКлючу(ДополнительныеПараметры,"Сервер",ТипБулево);
ОбъектОповещения = ПолучитьЗначениеПоКлючу(ДополнительныеПараметры,"ОбъектОповещения");
Если ОбъектОповещения = Неопределено Тогда
КомандаИсполнения = ТекстКоманды;
Иначе
КомандаИсполнения = "ОбъектОповещения."+ТекстКоманды;
КонецЕсли;
Если ПередатьНаСервер Тогда
ПередатьРезультат = ПолучитьЗначениеПоКлючу(ДополнительныеПараметры,"ПередатьРезультат",ТипБулево);
Если ПередатьРезультат Тогда
ВыполнитьОповещениеНаСервере(ОбъектОповещения,КомандаИсполнения,Результат);
Иначе
ВыполнитьОповещениеНаСервере(ОбъектОповещения,КомандаИсполнения);
КонецЕсли;
Иначе
Выполнить(КомандаИсполнения);
КонецЕсли;
КонецЕсли;
КонецЕсли;

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

// Выполняется при возникновении ошибок обработки оповещения
//
Процедура ОбработкаОшибокОповещения() Экспорт
Сообщить("В процессе обработки оповещения возникла ошибка по причине: "+ОписаниеОшибки());
КонецПроцедуры

// Создает и возвращает описание оповещения
// Параметры:
// ДополнительныеПараметры - Структура - Содержит параметры обработки результата асинхронного вызова (см. ОбработкаРезультатаОповещения).
//
Функция СоздатьОповещение(ДополнительныеПараметры = Неопределено) Экспорт

Если ДополнительныеПараметры = Неопределено Тогда
ДополнительныеПараметры = Новый Структура;
КонецЕсли;

ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаРезультатаОповещения",АсинхронныеВызовы,ДополнительныеПараметры,"ОбработкаОшибокОповещения",АсинхронныеВызовы);
Возврат ОписаниеОповещения;

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

#КонецЕсли

// Выполняет команду обработки оповещения на сервере (см. ОбработкаРезультатаОповещения)
//
Процедура ВыполнитьОповещениеНаСервере(ОбъектОповещения,КомандаИсполнения,Результат = Неопределено) Экспорт
Выполнить(КомандаИсполнения);
КонецПроцедуры

 

1 Comment

  1. lex27119

    Интересный подход.

    Попробую использовать.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *