База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Почему ответ от весов приходит без точки остановки и как это исправить? › RE: Почему ответ от весов приходит без точки остановки и как это исправить?
 Odin — Одинэсник
Odin — ОдинэсникОтвет:
При работе с весами по протоколу MT-SICS через TCP важно учитывать, что весы могут не сразу отправлять полный ответ после получения команды, а формировать его с небольшой задержкой. Если функция сразу после отправки команды пытается прочитать ответ, то может получить неполные данные — например, без ожидаемой точки остановы (CRLF или другого завершающего символа).
Основные причины и рекомендации:
1. **Отсутствие таймаута ожидания ответа**
   В вашем коде нет явного ожидания или таймаута перед чтением ответа. Весы могут формировать ответ с задержкой, и если читать сразу — получите неполный ответ.
   Решение: добавить ожидание (таймаут) перед чтением или реализовать цикл чтения с проверкой окончания ответа.
2. **Неправильный формат окончания команды или ответа**
   MT-SICS требует окончания команды CRLF (rn), вы используете Символы.ВК + Символы.ПС — это rn, что правильно. Но стоит проверить, что весы действительно ожидают именно такой формат. Иногда требуется дополнительная проверка документации весов.
3. **Чтение ответа по частям**
   Возможно, ответ весов приходит по частям, и OPI_TCP.ПрочитатьСтроку читает только первую часть. Нужно реализовать чтение в цикле, пока не будет получен полный ответ (например, до CRLF).
4. **Проверка кодировки**
   Вы используете »ASCII», убедитесь, что весы действительно работают с этой кодировкой. Иногда требуется »UTF-8″ или другая.
5. **Проверка соединения и буферов**
   Убедитесь, что соединение стабильно, и буферы не переполняются.
Пример улучшенного варианта с таймаутом и циклом чтения:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 1C Функция ОтправитьКомандуНаВесы() Экспорт     АдресВесов = Объект.АдресВесов;     Команда = "S";     Таймаут = 5000; // 5 секунд     ИнтервалОжидания = 100; // мс     МаксимумПопыток = Таймаут / ИнтервалОжидания;     Соединение = OPI_TCP.ОткрытьСоединение(АдресВесов);     Если Не ЗначениеЗаполнено(Соединение) Тогда         Сообщить("Не удалось открыть соединение с весами");         Возврат Ложь;     КонецЕсли;     Данные = Команда + Символы.ВК + Символы.ПС;     OPI_TCP.ОтправитьСтроку(Соединение, Данные, "ASCII");     Ответ = "";     Попытка = 0;     Пока Попытка  0 Тогда                 Прервать;             КонецЕсли;         КонецЕсли;         Попытка = Попытка + 1;         Пауза(ИнтервалОжидания);     КонецЦикла;     Если НЕ ЗначениеЗаполнено(Ответ) Тогда         Сообщить("Нет ответа от весов — проверь соединение или CRLF.");         OPI_TCP.ЗакрытьСоединение(Соединение);         Возврат Ложь;     Иначе         Объект.Вывод = Ответ;     КонецЕсли;     OPI_TCP.ЗакрытьСоединение(Соединение);     Возврат Истина; КонецФункции | 
**Итог:**
Да, нужен таймаут и/или цикл ожидания полного ответа от весов. Без этого вы рискуете получить неполный ответ без точки остановы. Также проверьте корректность формата команд и ответов, а также стабильность соединения.
Рекомендую посмотреть здесь:
https://helpf.pro/faq/view/920.html (пример работы с COM-объектами и таймаутами)
и документацию к вашим весам по протоколу MT-SICS.
—
Если нужна помощь с конкретным кодом или настройкой — обращайтесь.
