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