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