gifts2017

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

Опубликовал Александр Анисин (alex271) в раздел Программирование - Универсальные функции

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

 

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

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

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

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

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

http://infostart.ru/public/319157/

 

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

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

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

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

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

 

Скачать файлы

Наименование Файл Версия Размер
Конфигурация с библиотеками универсальных функций и обработки асинхронных вызовов 4
.cf 13,90Kb
01.06.15
4
.cf 1.0 13,90Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Иван Иванов (lex27119) 01.06.15 10:44
Интересный подход.
Попробую использовать.