Помогите придумать как прервать выполнение функции по времени

1. user635667 138 08.05.21 08:03 Сейчас в теме
Есть кнопка "Найти товар по коду" в РМК.
Если товар весовой, то выполняется функция
ПолучитьВесСЭлектронныхВесов();

Ситуации:
1. Все норм, вес получает мгновенно, отрабатывает как надо.

2. Иногда прилетает ошибка "ПортаВводаВывода", думаю проблема в com адаптере, скоро поменяю. С этим тоже проблем нет, ошибка также прилетает мгновенно и не влияет на работу РМК. Кассир просто сам вбивает вес.

3. Самый плохой вариант. Возникает периодически, не могу выловить в чем проблема и как исправить. Думаю все та же проблема с адаптером. В общем по выполнении функции
ПолучитьВесСЭлектронныхВесов();
зависает окно РМК. Бесконечно крутится колесо мышки. 1С как бы ждет результат, а результат все нет. Помогает перезапустить 1С через Диспетчер задач.
Идея - данную функцию
ПолучитьВесСЭлектронныхВесов();
ограничить по времени выполнения, например 3 сек. Если никакого результата нет, то прервать выполнение функции и продолжить работать дальше, как в случае со второй ситуацией.

Вопрос - как ограничить время выполнения функции и прервать ее в случае отсутствия результата ???
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. chg 08.05.21 08:12 Сейчас в теме
Можно как вариант так, если приемлемо:
Для прерывания выполнения программного кода, необходимо прописать вызов процедуры глобального контекста ОбработкаПрерыванияПользователя(). Эта процедура делает проверку нажатия сочетания клавиш Ctrl+Break. При нажатии пользователем этого сочетания клавиш, прерывается выполнение программного кода. Данная процедура не выводит окон для подтверждения прерывания. Процедура ОбработкаПрерыванияПользователя() может вызываться только в обработчиках, которые срабатывают при действиях пользователей. Таким образом, процедуру можно вызывать при нажатии на кнопку, но нельзя вызывать в таких событиях как ПриОткрытии() и т.д.
+
3. user635667 138 08.05.21 08:18 Сейчас в теме
(2)
ОбработкаПрерыванияПользователя

Т.е. вы предлагаете дать возможность прервать мою функцию функцией ОбработкаПрерыванияПользователя(). при этом кассиру придется нажимать соответствующие кнопки на клавиатуре??
А можно это как-то автоматизировать? Мне нужна полная автоматизация, иначе не интересно =)
ОбработкаОжидания() - для моих целей не подойдет???
+
4. chg 08.05.21 08:21 Сейчас в теме
(3)
ОбработкаОжидания()

судя по всему нет, т.к.:
Обработка ожидания в системе 1С:Предприятие, как следует из документации, предназначена для периодического выполнения процедуры глобального модуля с заданным интервалом времени.
+
5. Xershi 1479 08.05.21 09:37 Сейчас в теме
Выполнение процедуры нужно запихнуть в фоновое задание, если через 3 секунды не будет результата, тогда отменить и написать код, что делать дальше.
+
6. user635667 138 08.05.21 09:42 Сейчас в теме
(5)Что дальше уже все написано. Стопорит на том что результата бесконечно нет. Напишите пожалуйста как реализолвать вашу идею?
Мой код такой:
ПараметрыТовара = ПолучитьТоварПоКоду(Результат);	
		Если НЕ ПараметрыТовара = Неопределено тогда
			ПараметрыОбработки = ПараметрыОбработкиВыбораТовара();
			ОбработатьВыборТовара(ПараметрыТовара[0], ПараметрыОбработки);
			Если ПараметрыТовара[1] тогда
				
ПолучитьВесСЭлектронныхВесов();

				Если ТекущийТоварЦена = 0 тогда
					ТекущийЭлемент = Элементы.ТекущийТоварЦена;
					Иначе Если ТекущийТоварКоличество = 0 тогда
						ТекущийЭлемент = Элементы.ТекущийТоварКоличество;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		иначе 
			ПоказатьОповещениеПользователя("ТОВАР НЕ НАЙДЕН!",,,,,);
			ПредлагаемПоискПоКоду();
		КонецЕсли;
Показать


Нужно как-то модифицировать ПолучитьВесСЭлектронныхВесов();
+
8. Xershi 1479 09.05.21 10:58 Сейчас в теме
(6) читайте как опрашивать фоновые.
Раз в секунду опрос на 4 опрос скинуть.
+
7. sergling 34 08.05.21 13:19 Сейчас в теме
Перед получением веса заряжаете фоновое задание, потом в цикле пинг и опрос фонового, если за указанный интервал от фонового нет ответа, то возвращаем ноль дальше в код.
+
9. ImHunter 315 09.05.21 12:06 Сейчас в теме
(6) (7) (8) Если платформа 8.3.13 и свежее, то можно и не пинговать.
Нужно запустить фоновое задание и затем выполнить ФоновыеЗадания.ОжидатьЗавершенияВыполнения(...).
+
10. DenisCh 10.05.21 11:25 Сейчас в теме
(9) Так она тот же пинг и делает... Только внутри бсп...
+
11. user635667 138 10.05.21 11:35 Сейчас в теме
В общем после праздников буду курить тему фоновых заданий)
Я поменял адаптер, пока полёт нормальный. Но задачу все равно надо решить.
+
12. ImHunter 315 10.05.21 13:25 Сейчас в теме
(10) БСП тут вообще непричем. Это платформенный механизм. Т.е., есть надежда, что это не тупо пингом делается, а системными методами для управления потоками.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот