Доброго времени суток.
Вопрос наверно больше филосовский. Часто бывает так, что 1с ка обращаеться к чему либо за пределы самой себя. Это может быть ком объект, может быть веб-сервис.
В данный момент запускаю внешний веб-сервис, он не отвечает, в этот момент 1с "висит". И помогает только ребут компьютера. Вопрос в следующем, можно ли все внешние вызовы запускать в какой нибудь конструкции, на которую можно поставить таймаут, либо типа цикла с обработкойПрерыванияПользователя?
Вопрос наверно больше филосовский. Часто бывает так, что 1с ка обращаеться к чему либо за пределы самой себя. Это может быть ком объект, может быть веб-сервис.
В данный момент запускаю внешний веб-сервис, он не отвечает, в этот момент 1с "висит". И помогает только ребут компьютера. Вопрос в следующем, можно ли все внешние вызовы запускать в какой нибудь конструкции, на которую можно поставить таймаут, либо типа цикла с обработкойПрерыванияПользователя?
По теме из базы знаний
- 54-ФЗ и Разрешительный режим. Обработки для подключения онлайн-касс к 1С (поддержка Маркировки) + Эмулятор + ФФД 1.2
- Пайплайны Jenkins - программирование и настройка. Загружаемые модули. Цикл "Многопоточный CI для 1С", часть 5
- 1С + asterisk (потоковая передача данных из канала) часть 3. Реал тайм распознавание речи. Часть 1.
- Обработчик ожидания. Нюансы
- Обработка обслуживания Терминал системы быстрых платежей - оплата по QR Тинькофф Банк для УТ10.х, УПП 1.3.х, КА 1.х, Розница 1.х
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) может быть меня закидают помидорами, но я для искусственного таймаута использую такую процедуру :
Процедура Подождать(Секунд, Shell = Неопределено) Экспорт
Попытка
Если Shell = Неопределено Тогда
Shell = Новый COMОбъект("WScript.Shell");
КонецЕсли;
Shell.Run("timeout /T " + Секунд + " /nobreak" ,0,True);
Исключение
// обработка не требуется
КонецПопытки;
КонецПроцедуры
Показать
Это будет скорее всего распаралеливание работы, когда пользователь продолжить жить своей жизнью, а фоновое задание паралельно начнет жить само по себе. Как правило результат "внешнего вызова" нужен пользователю для принятия решения в данный момент и результат фонового задание(которое когда то там выполниться) уже не интересно.
Есть еще какие то варианты?
Есть еще какие то варианты?
(4) Login0001, А как данная конструкция будет выглядеть?
Например.
1)Создается документ.
2)Подставляеться товар
3)запускаем вебсервис, существует ли на данный товар партнерская скидка.(управление ушло, ждем, 1с не отвечает... спустя 15 мин партнер сказал "НЕТ СКИДКИ")
4)Подставляем розничную цену.
5)Подставляем товар
3)запускаем вебсервис, существует ли на данный товар партнерская скидка.(управление ушло, ждем, 1с не отвечает... спустя 15 мин вебсервис не дал ответа, 20 минут нет ответа, покупатель устал ждать.... 1с при этом висит, кнопочки не работают)
В идеале должен быть некий "рубильник", что мол не хочу дальше ждать веб сервис, поставлю покупателю товар без скидки. Но проблема в том, что 1с отдала все упраление веб сервису, у меня нет такого рубильника
Например.
1)Создается документ.
2)Подставляеться товар
3)запускаем вебсервис, существует ли на данный товар партнерская скидка.(управление ушло, ждем, 1с не отвечает... спустя 15 мин партнер сказал "НЕТ СКИДКИ")
4)Подставляем розничную цену.
5)Подставляем товар
3)запускаем вебсервис, существует ли на данный товар партнерская скидка.(управление ушло, ждем, 1с не отвечает... спустя 15 мин вебсервис не дал ответа, 20 минут нет ответа, покупатель устал ждать.... 1с при этом висит, кнопочки не работают)
В идеале должен быть некий "рубильник", что мол не хочу дальше ждать веб сервис, поставлю покупателю товар без скидки. Но проблема в том, что 1с отдала все упраление веб сервису, у меня нет такого рубильника
Как 1С получает значение от веб сервиса?
Управление передали, и ждем чтобы что произошло?
Покажите как выглядит этот кусок кода.
Если есть возможность в получать состояние веб сервиса, можно использовать прерывание пользователя.
Управление передали, и ждем чтобы что произошло?
Покажите как выглядит этот кусок кода.
Если есть возможность в получать состояние веб сервиса, можно использовать прерывание пользователя.
(6) ВРедная,
1с получает значение так
Вот общий модуль
Ждем чтоб нам вернулось число от партнера, ну или не вернулось :)
Дело в том что, в момент работы этой строчки кода
выполняется стороняя функция, и пока она не отработает управление к 1с не вернеться. Получить состояние веб сервиса в этот момент может и можно, но мало вероятно.
Я предпологал что существуют некие режимы типа
Ну или что нибудь аналогичное.
1с получает значение так
мПроцентПолучен=Ложь;
мПроцент=0;
Попытка
если мПолучатьБаланс Тогда
СтруктураВозврата=ВебСервисы.ПолучитьПроцентПартнера(Номенклатура);
мПроцентПолучен=СтруктураВозврата.ПроцентПолучен;
мПроцент=Число(СтруктураВозврата.Процент);
КонецЕсли
Исключение
мПроцентПолучен=Ложь;
мПроцент=0;
КонецПопытки;
ПоказатьВот общий модуль
Функция ПолучитьПроцентПартнера(Номенклатура) Экспорт
ПроцентПолучен=Ложь;
Процент=0;
ГУИД = "" + Номенклатура.УникальныйИдентификатор();
Попытка
Прокси = WSССылки.Обмены.СоздатьWSПрокси("http://www.site.ru/synh", "sitepr", "siteprSoap");
Прокси.Пользователь = "exchange";
Прокси.Пароль = "pass";
Ответ = Прокси.ПолучитьПроцент(ГУИД);
ПроцентПолучен=Истина;
Процент=Ответ;
Исключение
ПроцентПолучен=Ложь;
Процент=0;
КонецПопытки;
СтруктураВозврата=Новый Структура();
СтруктураВозврата.Вставить("ПроцентПолучен",ПроцентПолучен);
СтруктураВозврата.Вставить("Процент",Число(Процент));
Возврат СтруктураВозврата;
КонецФункции
ПоказатьУправление передали, и ждем чтобы что произошло?
Ждем чтоб нам вернулось число от партнера, ну или не вернулось :)
Если есть возможность в получать состояние веб сервиса, можно использовать прерывание пользователя.
Дело в том что, в момент работы этой строчки кода
Ответ= Прокси.ПолучитьПроцент(ГУИД);
выполняется стороняя функция, и пока она не отработает управление к 1с не вернеться. Получить состояние веб сервиса в этот момент может и можно, но мало вероятно.
Я предпологал что существуют некие режимы типа
Прокси.Пароль = "pass";
УстановитьЗащищеныйРежимСТаймаутом(таймаут=100сек)
Ответ= Прокси.ПолучитьПроцент(ГУИД);
ВыключитьЗащищеныйРежимСТаймаутом()
ПроцентПолучен=Истина;
Ну или что нибудь аналогичное.
в догонку.
Нашел старый кусок кода, когда стучались к аксапте
Предпологаю что таймауты тогда обрабатывали Аксаптеры, но было бы приятно еслиб это была штатная штука.
Нашел старый кусок кода, когда стучались к аксапте
// Создаем объект адаптера и отсылаем данные
Попытка
Состояние("Управление передано Аксапте. Ожидайте...");
comAdapter = new COMОбъект("OVK.DAXAdapter");
waitRetMain=1200;
waitRetTest=15;
retCode = comAdapter.sendRequest(СтрокаXML, waitRetMain, waitRetTest);
Исключение
Сообщить(ОписаниеОшибки());
Возврат 2;
КонецПопытки;
Возврат retCode;
ПоказатьПредпологаю что таймауты тогда обрабатывали Аксаптеры, но было бы приятно еслиб это была штатная штука.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот