1. maguga 22 10.01.12 15:32 Сейчас в теме

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

Доброго времени суток.

Вопрос наверно больше филосовский. Часто бывает так, что 1с ка обращаеться к чему либо за пределы самой себя. Это может быть ком объект, может быть веб-сервис.
В данный момент запускаю внешний веб-сервис, он не отвечает, в этот момент 1с "висит". И помогает только ребут компьютера. Вопрос в следующем, можно ли все внешние вызовы запускать в какой нибудь конструкции, на которую можно поставить таймаут, либо типа цикла с обработкойПрерыванияПользователя?
Ответы
Избранное Подписка Сортировка: Древо
10. ЧерныйКот 26.12.16 14:45 Сейчас в теме
(1) может быть меня закидают помидорами, но я для искусственного таймаута использую такую процедуру :

Процедура Подождать(Секунд, Shell = Неопределено) Экспорт
	
	Попытка
		Если Shell = Неопределено Тогда
			Shell = Новый COMОбъект("WScript.Shell"); 
		КонецЕсли;
		Shell.Run("timeout /T " + Секунд + " /nobreak" ,0,True);
	Исключение
		// обработка не требуется
	КонецПопытки;
	
КонецПроцедуры
Показать
2. alex_bob 217 10.01.12 15:48 Сейчас в теме
Ну, например обернуть в фоновое задание
3. maguga 22 10.01.12 16:46 Сейчас в теме
Это будет скорее всего распаралеливание работы, когда пользователь продолжить жить своей жизнью, а фоновое задание паралельно начнет жить само по себе. Как правило результат "внешнего вызова" нужен пользователю для принятия решения в данный момент и результат фонового задание(которое когда то там выполниться) уже не интересно.

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

Например.

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

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

Если есть возможность в получать состояние веб сервиса, можно использовать прерывание пользователя.
7. maguga 22 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 22 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 - таймаут не установлен.

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

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

Вакансии

Программист 1С
Москва
зарплата от 80 000 руб.
Полный день

Senior 1C Developer ЛЮБОЙ ГОРОД
Москва
зарплата от 80 000 руб.
Полный день

Консультант-аналитик 1С
Москва
зарплата от 120 000 руб. до 120 000 руб.
Полный день

Удаленный ИТ-журналист
Санкт-Петербург
По совместительству

Программист 1С
Санкт-Петербург
зарплата до 120 000 руб.
По совместительству