Интересный баг обнаружил. Кто -нибудь сталкивался?

1. IgorWolf 16.07.20 00:53 Сейчас в теме
Всех приветствую!

Столкнулся со странным багом.
Внешняя обработка на УФ.
Два реквизита на форме - строка и число (15,3).
При открытии подключается обработчик ожидания с интервалом 0,1 сек.
В обработчике переменной числу присваивается какое-то значение.

И тут происходит фигня.

Перезаписывается пустым значение переменная строки.

Подскажите, плиз, что происходит? А то кукуха собралась улетать.

Релиз 1С - 8.3.10.2772.

Текст обработки:
&НаКлиенте
Процедура ОбработкаОжидания() Экспорт
	ТекущийВес = 111; 
	ПодключитьОбработчикОжидания("ОбработкаОжидания", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ПодключитьОбработчикОжидания("ОбработкаОжидания", 0.1, Истина);
КонецПроцедуры
Показать
Прикрепленные файлы:
БредСобачий.epf
Найденные решения
25. lmnlmn 69 16.07.20 12:42 Сейчас в теме
(21) Да ладно. Старые костыли всегда уютнее новых. Поставь свойство "ОбновлениеТекстаРедактирования" у поля со строкой в "При изменении значения" или "Не использовать" и пользуйся на здоровье тем что есть.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. Xershi 1490 16.07.20 07:57 Сейчас в теме
(1) это не баг, а кривой код.
7. IgorWolf 16.07.20 09:46 Сейчас в теме
8. Xershi 1490 16.07.20 10:04 Сейчас в теме
(7) в том что вы код зацикливаете.
9. IgorWolf 16.07.20 10:37 Сейчас в теме
(8) Я уже ниже написал.
Только таким образом можно добиться интервала 0.1 секунда. Смотрите документацию. Последний параметр Истина указывает на разовый вызов ожидания
Нет никакого зацикливания
Даже если так сделать, то ничего не поменяется
&НаКлиенте
Процедура ОбработкаОжидания() Экспорт
ТекущийВес = 111;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ОбработкаОжидания", 1, Ложь);
КонецПроцедуры
11. azhilichev 213 16.07.20 11:01 Сейчас в теме
(9) Xershi прав. Зачем вам такой интервал на стороне клиента?
15. Xershi 1490 16.07.20 11:33 Сейчас в теме
(9) про 3 параметр однократность я в курсе.
Но вы не понимаете что написали.
Вы однократно выполнили код при открытии.
Далее код вызвал процедуру и закончился.
Но в этом коде снова вызов однократный процедуры.
И она снова однократно ее вызывает это называется рекурсия. Если бы вы 3 параметр в ложь поставили, у вас скорее всего 1С вообще бы зависла)))
17. IgorWolf 16.07.20 11:43 Сейчас в теме
(15) Ну все правильно. Мне нужно с частотой 0.1 секунда опрашивать весы.
Можно каким-то другим способом это решить?
Да и не рекурсия это. Пока код обработчика не выполнится - другой обработчик одновременно не запуститься.
18. Xershi 1490 16.07.20 11:47 Сейчас в теме
(17) весы сами должны в 1С отдавать инфу. Через внешнее событие.
Если делать так как вы написали, то и результат такой будет.
19. IgorWolf 16.07.20 11:50 Сейчас в теме
(18) Мой драйвер для весов не создает внешнее событие.
И потом, это все работает нормально. Данные с весов успешно снимаются.
Просто вдруг обнаружилось, что нельзя на форме ввести строковые или числовые поля.
22. Xershi 1490 16.07.20 12:05 Сейчас в теме
(19) это стандартное явление, что фокус сбивается.
Делайте драйвер по стандартам через внешнее событие и околесицу городить не придется. И типовые будут с коробки работать!
Кстати драйвер на чем пишите?
Хочу на джаве учиться такие вещи писать.
23. IgorWolf 16.07.20 12:06 Сейчас в теме
(22) Драйвер не мой. Работаем с тем, что есть.
И 10 лет успешно работает через обработчик ожидания.
24. Xershi 1490 16.07.20 12:07 Сейчас в теме
(23) тогда пишите в 1С, чтобы они реализовали как в ОФ. Логика УФ другая.
2. coollerinc 189 16.07.20 01:17 Сейчас в теме
Зачем у вас два обработчика ожидания?
6. IgorWolf 16.07.20 09:42 Сейчас в теме
(2) Только таким образом можно добиться интервала 0.1 секунда. Смотрите документацию. Последний параметр Истина указывает на разовый вызов ожидания
3. azhilichev 213 16.07.20 02:41 Сейчас в теме
Если говорить конкретно про пример, который вы приложили внешней обработкой, то из-за обработчика ожидания не отрабатывает событие присвоения значения реквизиту ШК. Это событие возникает в момент перевода фокуса на другой элемент формы.
5. IgorWolf 16.07.20 09:41 Сейчас в теме
(3) согласен. Не реквизит перезаписывается пустым значением, а просто не дает ввести что-либо в поле ШК что либо.

А как решить проблему, можете подсказать?
10. azhilichev 213 16.07.20 11:00 Сейчас в теме
(5) Могу подсказать в зависимости от задачи, которую решаете. Тот пример, который в обработке, он бессмысленный. И хорошего решение для него одно. Не использовать обработчик ожидания.
12. IgorWolf 16.07.20 11:06 Сейчас в теме
(10) Задача простая. АРМ взвешивания туш. Обработчик ожидания должен снимать данные с весов реальном времени.
В реальной задаче в реквизит ТекущийВес пишутся данные полученные с весов.
Такой интервал нужен для большей точности при взвешивании.
Но даже если поставить секунду, то в строковый (или числовой) реквизит все равно ничего не ввести руками.
Даже если я реквизит ТекущийВес не выношу на форму, но пишу в него. Все равно не дает вносить данные руками в другие строковые или числовые реквизиты на форме.
13. azhilichev 213 16.07.20 11:21 Сейчас в теме
(12) Как минимум, логику получения данных с весов надо реализовывать на стороне сервера. Не стоит клиенту напрямую отдавать эти данные.
Обработчик ожидания для сбора данных - так себе решение. Более правильно было бы организовать между сервером 1С и клиентским сеансом сокет, и траслировать данные с сервера. И не стоит забывать, что у клиента 1С с асинхронностью есть проблемы.

Может быть вам может помочь это Улучшения в синтаксисе языка 1С для работы с асинхронными функциями: синхронная асинхронность.
14. azhilichev 213 16.07.20 11:22 Сейчас в теме
(12) И подумайте, а действительно ли вам нужна точность в реальном времени.
16. IgorWolf 16.07.20 11:41 Сейчас в теме
(14) (13) Точность нужна в реальном времени. Операторы должны видеть вес, который у них лежит на весах.

Не представляю, как я могу обработать на сервере получение данных с весов. Весов много, они разные. Подключены к разным ПК по COM порту. Для каждого типа весов свой драйвер. Соответственно самым очевидным решением выглядит считывать данные с весов на клиенте.

Так концептуально менять архитектуру всей системы из-за того, что фокус пропадает - ну это совсем не рационально, на мой взгляд.

К тому же у же несколько АРМов уже так работают без проблем. Просто весь ввод был организован через тачскрины и не было необходимости вручную заполнять какие-то поля на форме.

А тут вдруг такой сюрприз. Почему вообще при записи в реквизит формы внутри обработчика ожидания пропадает фокус? Это баг или фича?

может дело в релизе платформы?
20. lmnlmn 69 16.07.20 11:55 Сейчас в теме
(12)
Обработчик ожидания должен снимать данные с весов реальном времени

Обработчик ожидания весьма далек от реального времени так как вызывается во время простоя программы через указанные временные интервалы. Т.е. если активно шуровать мышкой, то обработчик может и не запускаться "в реальном времени". От лукавого это все для вашей задачи.
21. IgorWolf 16.07.20 12:04 Сейчас в теме
(20) Весы подключены по COM порту к клиентскому ПК. Есть драйвер весов. У драйвера есть метод Update(), после выполнения которого можно прочитать поле Weight.
Я ничего лучше не придумал, чем выполнять опрос обработчиком ожидания.

Точности при таком методе для предприятия достаточно.

Работает уже 10 лет (просто раньше было на обычных формах).

Вы можете предложить лучшее решение?
25. lmnlmn 69 16.07.20 12:42 Сейчас в теме
(21) Да ладно. Старые костыли всегда уютнее новых. Поставь свойство "ОбновлениеТекстаРедактирования" у поля со строкой в "При изменении значения" или "Не использовать" и пользуйся на здоровье тем что есть.
26. Xershi 1490 16.07.20 12:43 Сейчас в теме
(25) лайф хак от матерых?) Будем иметь ввиду как сломать 1С))
27. lmnlmn 69 16.07.20 12:52 Сейчас в теме
(26) Не, не! Это как починить 1С! ))
28. IgorWolf 16.07.20 12:58 Сейчас в теме
(27) Спасибо. Вот это дело.
минус в том, что на релизе 8.3.10.2772 - это решение не сработало.
Зато на 8.3.16.1296 - работает.

Буду думать над переводом предприятия на новую платформу.
29. lmnlmn 69 16.07.20 13:06 Сейчас в теме
(28)Из синтакс-помощника по свойству:
Примечание:
В режиме совместимости конфигурации Версия8_2_13 не влияет на поведение поля ввода управляемой формы.
В остальных случаях влияет на то, в каких ситуациях будет обновляться текст в поле ввода при установке значения.
30. IgorWolf 16.07.20 13:16 Сейчас в теме
(29) Понял. Переход на новую платформу не поможет(((
31. lmnlmn 69 16.07.20 13:17 Сейчас в теме
(30) Неужели все еще совместимость с 8.2 используете?
33. IgorWolf 16.07.20 13:37 Сейчас в теме
(31) Там ОЧЕНЬ сильно переписанная УТ 2009 года.

Через год планируем на ERP, пока так мучаемся
34. lmnlmn 69 16.07.20 14:27 Сейчас в теме
(33) Так может на обычной форме сделать?
37. IgorWolf 16.07.20 17:59 Сейчас в теме
(34) Тачскрины с обычными формами как-то не очень)
38. lmnlmn 69 16.07.20 18:06 Сейчас в теме
(37) На 8.2.16 можно поднять. Там проблем поменьше будет, чем режим совместимости выключать.
32. Xershi 1490 16.07.20 13:18 Сейчас в теме
(30) почему?) Поднять совместимость до не использовать можно будет. Пару недель работы в плечи))
35. coollerinc 189 16.07.20 15:04 Сейчас в теме
(32)Весь гемор был при переходе на новую версию совместимости был связан с закрытием форы, только на клиенте. Что при закрытии программы нельзя вызывать серверные вызовы. А все типовые формы выполняли отключение подключаемого оборудования на сервере. Т.к. что было сложновато, да и не во всех формах сделали)
36. Xershi 1490 16.07.20 15:21 Сейчас в теме
(35) нет там гемора, если понять логику.
39. SlavaKron 18.07.20 17:40 Сейчас в теме
Значение веса можно выводить не реквизит формы, а в поле HTML.
&НаКлиенте
Процедура ОбработкаОжидания() Экспорт
	//ТекущийВес = 111;
	ГСЧ = Новый ГенераторСлучайныхЧисел;
	Элементы.Реквизит1.Документ.showWeight(ГСЧ.СлучайноеЧисло());
	ПодключитьОбработчикОжидания("ОбработкаОжидания", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Реквизит1 =
	"<ht ml>
	|	<sc ript language='JavaScript' type='text/javascript'>
	|		document.showWeight = function(weight) {document.body.innerHTML = weight};		 
	|	</sc ript> 
	|</html>";
	
	ПодключитьОбработчикОжидания("ОбработкаОжидания", 0.1, Истина);
КонецПроцедуры
Показать
Прикрепленные файлы:
БредСобачий.epf
Оставьте свое сообщение

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