1с не получает результат с весов, если не поставить точку останова

1. Danjah 16.01.21 14:34 Сейчас в теме
При получении веса, всегда возвращается 0. Но если включить отладку и поставить в любом месте ДО выделенной строки точку останова (можно даже в других процедурах), то вес возвращается корректно. Если поставить точку после, то вернется 0. Подскажите, пожалуйста, куда копать?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
12. papami 55 16.01.21 18:49 Сейчас в теме
(11)
Значит факт подключения определяется как-то некорректно. Возможно дело в драйвере.
Как вариант, подключайте весы раньше. При старте программы, например. Чтобы разобщить с запросом веса.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user868505 16.01.21 15:28 Сейчас в теме
Думаю, что дело в том, что вы инициируете подключение, но до момента считывания веса это подключение просто не успевает отработать. А точкой останова вы даете время.
Попробуйте поставить задержку, или в цикле несколько попыток получения веса..
А физически как весы подключены?
3. Danjah 16.01.21 17:32 Сейчас в теме
(2) Цикл ничего не дает, а вот задержка помогла. Попробовал через "Показать вопрос" добавить задержку в 1 сек (меньше нельзя), т.е. перед получением веса появляется пустой вопрос с таймаутом в 1 сек и после его исчезновения алгоритм выполняется дальше (просто первое, что пришло в голову). Но не совсем понимаю, как это правильно использовать, в типовую процедуру встраивать задержку не хочется. Да и к тому же эти весы не единственные, с остальными проблем нет. Весы подключены через ком-порт, пробрасываются через рдп.
4. papami 55 16.01.21 17:46 Сейчас в теме
(3)
Начать выполнение команды - получается асинхронный вызов.
Попробуйте как-то синхронно выполнить.
Покажите код где идет подключение и обращение к этой процедуре.

С другими весами дело может быть в том что проброс быстрей работает. И соединение успевает отработать до вызова получения веса
7. Danjah 16.01.21 18:06 Сейчас в теме
Процедура НачатьПодключениеОборудования(ОповещениеПриПодключении, ИдентификаторКлиента, ТипыПО = Неопределено, ИдентификаторУстройства = Неопределено) Экспорт
	   
	ОбъектДрайвера = Неопределено;
	
	Результат = ОбновитьРабочееМестоКлиента();
	Если Не Результат Тогда
		Если ОповещениеПриПодключении <> Неопределено Тогда
			ОписаниеОшибки = НСтр("ru='Предварительно необходимо выбрать рабочее место подключаемого оборудования текущего сеанса.'");
			РезультатВыполнения = ПараметрыВыполненияОперацииНаОборудовании(Результат, ОписаниеОшибки);
			ВыполнитьОбработкуОповещения(ОповещениеПриПодключении, РезультатВыполнения);
		КонецЕсли;
		Возврат;
	КонецЕсли;
	
	СписокОборудования = МенеджерОборудованияВызовСервера.ОборудованиеПоПараметрам(ТипыПО, ИдентификаторУстройства);
	
	Если СписокОборудования.Количество() > 0 Тогда
		Для Каждого Устройство Из СписокОборудования Цикл
			
			// Проверим, не подключено ли устройство ранее.
			ПодключенноеУстройство = ПолучитьПодключенноеУстройство(глПодключаемоеОборудование.ПараметрыПодключенияПО, Устройство.Ссылка);
			
			Если ПодключенноеУстройство = Неопределено Тогда // Если устройство не было подключено ранее.
				
				ОбработчикДрайвераМодуль = МенеджерОборудованияКлиентПовтИсп.ПолучитьОбработчикДрайвера(Устройство.ОбработчикДрайвера, Не Устройство.ВСоставеКонфигурации, Устройство.ТипОборудованияИмя);
				
				НовоеПодключение = Новый Структура();
				НовоеПодключение.Вставить("Клиенты"                 , Новый Массив());
				НовоеПодключение.Клиенты.Добавить(ИдентификаторКлиента);
				НовоеПодключение.Вставить("Ссылка"                  , Устройство.Ссылка);
				НовоеПодключение.Вставить("ИдентификаторУстройства" , Устройство.ИдентификаторУстройства);
				НовоеПодключение.Вставить("ОбработчикДрайвера"      , Устройство.ОбработчикДрайвера);
				НовоеПодключение.Вставить("Наименование"            , Устройство.Наименование);
				НовоеПодключение.Вставить("ТипОборудования"         , Устройство.ТипОборудования);
				НовоеПодключение.Вставить("ТипОборудованияИмя"      , Устройство.ТипОборудованияИмя);
				НовоеПодключение.Вставить("ДрайверОборудования"     , Устройство.ДрайверОборудования);
				НовоеПодключение.Вставить("ВСоставеКонфигурации"    , Устройство.ВСоставеКонфигурации);
				НовоеПодключение.Вставить("ИдентификаторОбъекта"    , Устройство.ИдентификаторОбъекта);
				НовоеПодключение.Вставить("ИмяМакетаДрайвера"       , Устройство.ИмяМакетаДрайвера);
				НовоеПодключение.Вставить("ИмяФайлаДрайвера"        , Устройство.ИмяФайлаДрайвера);
				НовоеПодключение.Вставить("РабочееМесто"            , Устройство.РабочееМесто);
				НовоеПодключение.Вставить("ИмяКомпьютера"           , Устройство.ИмяКомпьютера);
				НовоеПодключение.Вставить("Параметры"               , Устройство.Параметры);
				НовоеПодключение.Вставить("ПараметрыРегистрации"    , Устройство.ПараметрыРегистрации);
				НовоеПодключение.Вставить("КоличествоПодключенных"  , 1);
				НовоеПодключение.Вставить("ПараметрыПодключения"    , Новый Структура());
				НовоеПодключение.Вставить("ОбъектДрайвера"          , Неопределено);
				НовоеПодключение.Вставить("ОбработчикДрайвераМодуль", ОбработчикДрайвераМодуль);
				НовоеПодключение.ПараметрыПодключения.Вставить("ТипОборудования"     , Устройство.ТипОборудованияИмя);
				НовоеПодключение.ПараметрыПодключения.Вставить("ПараметрыРегистрации", Устройство.ПараметрыРегистрации);
				
				Если ОбработчикДрайвераМодуль = Неопределено Тогда
					// Сообщить об ошибке, что не удалось подключить обработчик.
					Если ОповещениеПриПодключении <> Неопределено Тогда
						ОписаниеОшибки = НСтр("ru='Не удалось подключить обработчик драйвера.'");
						РезультатВыполнения = ПараметрыВыполненияОперацииНаОборудовании(Ложь, ОписаниеОшибки);
						ВыполнитьОбработкуОповещения(ОповещениеПриПодключении, РезультатВыполнения);
					КонецЕсли;
					Продолжить;
				Иначе
					
					// Разделение на асинхронные и синхронные вызовы.
					Если ОбработчикДрайвераМодуль.ПоддержкаАсинхронногоРежима() Тогда
						// Асинхронные вызовы
						ПараметрыКоманды = Новый Структура("НовоеПодключение, ОповещениеПриПодключении, ОбработчикДрайвераМодуль", НовоеПодключение, ОповещениеПриПодключении, ОбработчикДрайвераМодуль);
						Оповещение = Новый ОписаниеОповещения("НачатьПодключениеОборудования_ПолучениеОбъектаДрайвераЗавер­шение", ЭтотОбъект, ПараметрыКоманды);
						НачатьПолучениеОбъектаДрайвера(Оповещение, Устройство);
					Иначе
						// Синхронные
						ОбъектДрайвера = ПолучитьОбъектДрайвера(Устройство);
						Если ОбъектДрайвера = Неопределено Тогда
							Если ОповещениеПриПодключении <> Неопределено Тогда
								// Сообщить об ошибке, что не удалось загрузить драйвер.
								ОписаниеОшибки = НСтр("ru='%Наименование%: Не удалось загрузить драйвер устройства.
													|Проверьте, что драйвер корректно установлен и зарегистрирован в системе.'");
								ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, "%Наименование%",НовоеПодключение.Наименование);
								РезультатВыполнения = ПараметрыВыполненияОперацииНаОборудовании(Ложь, ОписаниеОшибки);
								ВыполнитьОбработкуОповещения(ОповещениеПриПодключении, РезультатВыполнения);
							КонецЕсли;
							Продолжить;
						Иначе
							ВыходныеПараметры = Неопределено;

                                                        // В этом месте происходит подключение

							Результат = ОбработчикДрайвераМодуль.ПодключитьУстройство(ОбъектДрайвера, НовоеПодключение.Параметры, НовоеПодключение.ПараметрыПодключения, ВыходныеПараметры); 
							
							Если Результат Тогда
								
								Если ВыходныеПараметры.Количество() >= 2 Тогда
									НовоеПодключение.Вставить("ИсточникСобытия", ВыходныеПараметры[0]);
									НовоеПодключение.Вставить("ИменаСобытий",    ВыходныеПараметры[1]);
								Иначе
									НовоеПодключение.Вставить("ИсточникСобытия", "");
									НовоеПодключение.Вставить("ИменаСобытий",    Неопределено);
								КонецЕсли;
								НовоеПодключение.ОбъектДрайвера = ОбъектДрайвера;
								МассивПараметровПодключения = глПодключаемоеОборудование.ПараметрыПодключенияПО; //Массив - 
								МассивПараметровПодключения.Добавить(НовоеПодключение);
								
								Если ОповещениеПриПодключении <> Неопределено Тогда
									ОписаниеОшибки = НСтр("ru='Ошибок нет.'");
									РезультатВыполнения = Новый Структура("Результат, ОписаниеОшибки, ПараметрыПодключения", Истина, ОписаниеОшибки, НовоеПодключение.ПараметрыПодключения);
									ВыполнитьОбработкуОповещения(ОповещениеПриПодключении, РезультатВыполнения);
								КонецЕсли;
								
							Иначе
								// Сообщим пользователю о том, что не удалось подключить устройство.
								Если ОповещениеПриПодключении <> Неопределено Тогда
									ОписаниеОшибки = НСтр("ru='Не удалось подключить устройство ""%Наименование%"": %ОписаниеОшибки% (%КодОшибки%)'");
									ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, "%Наименование%"  , НовоеПодключение.Наименование);
									ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, "%ОписаниеОшибки%", ВыходныеПараметры[1]);
									ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, "%КодОшибки%"     , ВыходныеПараметры[0]);
									РезультатВыполнения = ПараметрыВыполненияОперацииНаОборудовании(Ложь, ОписаниеОшибки);
									ВыполнитьОбработкуОповещения(ОповещениеПриПодключении, РезультатВыполнения);
								КонецЕсли;
							КонецЕсли;
						КонецЕсли;
						
					КонецЕсли;
					
				КонецЕсли;
			
			Иначе // Устройство было подключено ранее.
				// Увеличим количество пользователей данного соединения.
				МассивКлиентов = ПодключенноеУстройство.Клиенты; //Массив - 
				МассивКлиентов.Добавить(ИдентификаторКлиента);
				ПодключенноеУстройство.КоличествоПодключенных = ПодключенноеУстройство.КоличествоПодключенных + 1;
				Если ОповещениеПриПодключении <> Неопределено Тогда
					ОписаниеОшибки = НСтр("ru='Ошибок нет.'");
					РезультатВыполнения = Новый Структура("Результат, ОписаниеОшибки, ПараметрыПодключения", Истина, ОписаниеОшибки, ПодключенноеУстройство.ПараметрыПодключения);
					ВыполнитьОбработкуОповещения(ОповещениеПриПодключении, РезультатВыполнения);
				КонецЕсли;
			КонецЕсли;
			
		КонецЦикла;
		
	ИначеЕсли ИдентификаторУстройства <> Неопределено И ОповещениеПриПодключении <> Неопределено Тогда
		ОписаниеОшибки =  НСтр("ru='Выбранное устройство не может использоваться для подключения. Укажите другое устройство.'");
		РезультатВыполнения = ПараметрыВыполненияОперацииНаОборудовании(Ложь, ОписаниеОшибки);
		ВыполнитьОбработкуОповещения(ОповещениеПриПодключении, РезультатВыполнения);
	ИначеЕсли ТипыПО = Неопределено И ИдентификаторУстройства = Неопределено Тогда
		ОписаниеОшибки =  НСтр("ru='Нет доступного оборудования для подключения.'");
		РезультатВыполнения = ПараметрыВыполненияОперацииНаОборудовании(Ложь, ОписаниеОшибки);
		ВыполнитьОбработкуОповещения(ОповещениеПриПодключении, РезультатВыполнения);
	КонецЕсли;

КонецПроцедуры
Показать


Если точку ставить до этой строки, то вес нулевой возвращается. Т.е. как и подозревалось весы не успевают подключиться, а с них уже запрашивается вес.
8. papami 55 16.01.21 18:15 Сейчас в теме
(7)
НачатьПодключениеОборудования(ОповещениеПриПодключении

Вот ОповещениеПриПодключении отработает когда соединение установится.
И уже в нем нужно вызывать команду получения веса

Все эти асинхронности сделаны для комфорта пользователя, чтобы не блокировался (не вис) интерфейс. Но в этом случае нужно учитывать, что команды должны быть выполнены по очереди в любом случае.
1. Подключаем асинхронно
2. Получаем оповещение, что подключили
3. Из этого оповещения вызываем команду получения веса
4. Получаем оповещение, что выполнение команды завершилось.
5. Далее по программе
9. Danjah 16.01.21 18:25 Сейчас в теме
(8) В том то и дело, что процедура получения веса, которую я скинул в первом сообщении, вызывается из этого оповещения при подключении
10. papami 55 16.01.21 18:34 Сейчас в теме
(9)
А результат выполнения какой прилетает в оповещение?
11. Danjah 16.01.21 18:40 Сейчас в теме
(10) Все как надо
Прикрепленные файлы:
12. papami 55 16.01.21 18:49 Сейчас в теме
(11)
Значит факт подключения определяется как-то некорректно. Возможно дело в драйвере.
Как вариант, подключайте весы раньше. При старте программы, например. Чтобы разобщить с запросом веса.
13. Danjah 20.01.21 12:59 Сейчас в теме
(12)Сделал подключение весов при первом запросе веса и отключение при закрытии формы. Самое интересное, что этим весам не просто не хватает времени, чтобы подключиться, тут дело в чем-то другом. Т.к. запрос веса возвращал бы ошибку, если бы весы были не подключены.
14. papami 55 20.01.21 16:17 Сейчас в теме
(13)
А может сами настройки драйвера посмотреть. Что там вообще доступно. Таймауты какие-нибудь
15. Danjah 20.01.21 19:08 Сейчас в теме
(14)Есть таймаут, стоит 2000 мсек по умолчанию, пробовал разные варианты от 100 мсек до 10000 мсек, разницы никакой не было
16. papami 55 20.01.21 21:21 Сейчас в теме
(15)
А без РДП нормально все?
17. Danjah 20.01.21 21:36 Сейчас в теме
(16)
Не проверял, 1с на сервере стоит, вроде проблема только в 1с, но не уверен. В любом случае, решение правильное и логичное, ведь раньше весы подключались и отключались при каждом получении веса, а поскольку взвешивания происходят часто, смысла в этом нет.
5. user868505 16.01.21 17:53 Сейчас в теме
(3) можно не просто задержку встраивать, а извратиться как-то типа получать результат в цикле, пока он не станет <> 0, с ограничением на количество итераций.
Ну или другие весы)
6. user868505 16.01.21 17:57 Сейчас в теме
(3) Решения, конечно, не самые красивые.
Или попробовать как (4) говорит - всё-таки каким-то образом дождаться ответа, что подключение прошло.
Оставьте свое сообщение

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