IE 2017

Таймауты на передачу управления

1. Дмитрий Лупанов (maguga) 19 10.01.12 15:32 Сейчас в теме
Доброго времени суток.

Вопрос наверно больше филосовский. Часто бывает так, что 1с ка обращаеться к чему либо за пределы самой себя. Это может быть ком объект, может быть веб-сервис.
В данный момент запускаю внешний веб-сервис, он не отвечает, в этот момент 1с "висит". И помогает только ребут компьютера. Вопрос в следующем, можно ли все внешние вызовы запускать в какой нибудь конструкции, на которую можно поставить таймаут, либо типа цикла с обработкойПрерыванияПользователя?
Ответы
2. Алексей Бобылкин (alex_bob) 214 10.01.12 15:48 Сейчас в теме
Ну, например обернуть в фоновое задание
3. Дмитрий Лупанов (maguga) 19 10.01.12 16:46 Сейчас в теме
Это будет скорее всего распаралеливание работы, когда пользователь продолжить жить своей жизнью, а фоновое задание паралельно начнет жить само по себе. Как правило результат "внешнего вызова" нужен пользователю для принятия решения в данный момент и результат фонового задание(которое когда то там выполниться) уже не интересно.

Есть еще какие то варианты?
4. Василий Дыркин (Login0001) 10.01.12 17:27 Сейчас в теме
Можно запускать этот внешний процесс и вешать обработчик ожидания с определенным тайм аутом... по получении результата от внешней обработки отключать обработчик.
5. Дмитрий Лупанов (maguga) 19 10.01.12 18:21 Сейчас в теме
(4) Login0001, А как данная конструкция будет выглядеть?

Например.

1)Создается документ.
2)Подставляеться товар
3)запускаем вебсервис, существует ли на данный товар партнерская скидка.(управление ушло, ждем, 1с не отвечает... спустя 15 мин партнер сказал "НЕТ СКИДКИ")
4)Подставляем розничную цену.
5)Подставляем товар
3)запускаем вебсервис, существует ли на данный товар партнерская скидка.(управление ушло, ждем, 1с не отвечает... спустя 15 мин вебсервис не дал ответа, 20 минут нет ответа, покупатель устал ждать.... 1с при этом висит, кнопочки не работают)

В идеале должен быть некий "рубильник", что мол не хочу дальше ждать веб сервис, поставлю покупателю товар без скидки. Но проблема в том, что 1с отдала все упраление веб сервису, у меня нет такого рубильника
6. Ольга (ВРедная) 37 10.01.12 19:43 Сейчас в теме
Как 1С получает значение от веб сервиса?
Управление передали, и ждем чтобы что произошло?
Покажите как выглядит этот кусок кода.

Если есть возможность в получать состояние веб сервиса, можно использовать прерывание пользователя.
7. Дмитрий Лупанов (maguga) 19 11.01.12 10:49 Сейчас в теме
(6) ВРедная,
1с получает значение так
		мПроцентПолучен=Ложь;
		мПроцент=0;
		Попытка
			если мПолучатьБаланс Тогда
				СтруктураВозврата=ВебСервисы.ПолучитьПроцентПартнера(Номенклатура);
				мПроцентПолучен=СтруктураВозврата.ПроцентПолучен;
				мПроцент=Число(СтруктураВозврата.Процент);
			КонецЕсли
		Исключение
			мПроцентПолучен=Ложь;
			мПроцент=0;
		КонецПопытки;

...Показать Скрыть

Вот общий модуль
Функция ПолучитьПроцентПартнера(Номенклатура) Экспорт
	ПроцентПолучен=Ложь;
	Процент=0;
	ГУИД  		= "" + Номенклатура.УникальныйИдентификатор();
	Попытка
		Прокси 				= WSССылки.Обмены.СоздатьWSПрокси("http://www.site.ru/synh", "sitepr", "siteprSoap");
		Прокси.Пользователь = "exchange";
		Прокси.Пароль 		= "pass";
		Ответ 				= Прокси.ПолучитьПроцент(ГУИД);
		ПроцентПолучен=Истина;
		Процент=Ответ;
	Исключение
		ПроцентПолучен=Ложь;
		Процент=0;
	КонецПопытки;
	
	СтруктураВозврата=Новый Структура();
	СтруктураВозврата.Вставить("ПроцентПолучен",ПроцентПолучен);
	СтруктураВозврата.Вставить("Процент",Число(Процент));
	Возврат СтруктураВозврата;
КонецФункции
...Показать Скрыть


Управление передали, и ждем чтобы что произошло?

Ждем чтоб нам вернулось число от партнера, ну или не вернулось :)

Если есть возможность в получать состояние веб сервиса, можно использовать прерывание пользователя.

Дело в том что, в момент работы этой строчки кода
Ответ= Прокси.ПолучитьПроцент(ГУИД);

выполняется стороняя функция, и пока она не отработает управление к 1с не вернеться. Получить состояние веб сервиса в этот момент может и можно, но мало вероятно.

Я предпологал что существуют некие режимы типа
		
                  Прокси.Пароль 		= "pass";
		УстановитьЗащищеныйРежимСТаймаутом(таймаут=100сек)
                  Ответ= Прокси.ПолучитьПроцент(ГУИД);
		ВыключитьЗащищеныйРежимСТаймаутом()
		ПроцентПолучен=Истина;

...Показать Скрыть

Ну или что нибудь аналогичное.
8. Дмитрий Лупанов (maguga) 19 11.01.12 10:55 Сейчас в теме
в догонку.
Нашел старый кусок кода, когда стучались к аксапте
	// Создаем объект адаптера и отсылаем данные
	Попытка
		Состояние("Управление передано Аксапте. Ожидайте...");
		comAdapter  = new COMОбъект("OVK.DAXAdapter");
		waitRetMain=1200;
		waitRetTest=15;
	    retCode = comAdapter.sendRequest(СтрокаXML, waitRetMain, waitRetTest);
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат 2;
	КонецПопытки;
	Возврат retCode;

...Показать Скрыть

Предпологаю что таймауты тогда обрабатывали Аксаптеры, но было бы приятно еслиб это была штатная штука.
9. Конюхов Артем (konuchovartem@gmail.com) 26.12.16 14:36 Сейчас в теме
Web сервисы

WSПрокси.Таймаут (Timeout)
Использование:

Только чтение.
Описание:

Тип: Число.
Определяет время ожидания соединения и операций, осуществляемых объектом WSПрокси, в секундах.
0 - таймаут не установлен.

Доступность:

Сервер, толстый клиент, внешнее соединение.
10. Андрей Белов (ЧерныйКот) 26.12.16 14:45 Сейчас в теме
(1) может быть меня закидают помидорами, но я для искусственного таймаута использую такую процедуру :

Процедура Подождать(Секунд, Shell = Неопределено) Экспорт
	
	Попытка
		Если Shell = Неопределено Тогда
			Shell = Новый COMОбъект("WScript.Shell"); 
		КонецЕсли;
		Shell.Run("timeout /T " + Секунд + " /nobreak" ,0,True);
	Исключение
		// обработка не требуется
	КонецПопытки;
	
КонецПроцедуры
...Показать Скрыть
Оставьте свое сообщение