#0
by maxim_ro
Всем привет! Есть проблема которую не могу уже решить n - ный день. Имеется посттерминал, обращение к которому ведется посредством TCP-IP протокола. Описание протокола у меня есть. Нужно прикрутить его к 1С 7.7. Нашел 4 метода для организации работы 1С с сокетами но вот проблема в том ни одна из компонент не может получить данные от посттерминала. Думал может терминал не возвращает ответ, для тестирования компонент скачал утилиту NetCat которую запускаю в режиме сервера (nc –l –p 2000, слушаю порт 2000) и на ней тестирую работоспособность компонент. Опробовал такие компоненты и результаты: • Внешняя компонента LRC_TCP.dll (версия 1.0.0.0), раз через раз подключалась, данные полученные от сервера должны были обрабатываться процедурой ОбработкаВнешнегоСобытия. Работала криво и под конец тестирования она напрочь отказалась работать. Не подходит • Внешняя компонента netaInet.dll (версия 1.0.0.4) данные отправляет нормально но почему то не принимает. Для приема данных в глобальном модуле есть процедура Ответ(Стр) Экспорт. Если данные отправлять без ожидания ответа тогда срабатывает если с ожиданием ответа то иногда сообщение отправляется но в ответ ничего не приходит или же просто данные не отправляются. Так же для работы компоненты необходимо наличие констант ПолучатьОтвет и ЖдатьСоединения они у меня установлены в значения 5 и 4 соответственно. Подходит если разобраться с приемом данных • Внешняя компонента RiK_Inet.dll (версия 1.0.0.0) компонента вроде как продолжение netaInet.dll но почему то когда она отправляет данные она еще добавляет служебную информацию (размер отправленных данных) и опять же не принимает данные. Для получения данных от сервера (то есть от посттерминала) в глобальном модуле есть процедура Инет_СтрокаОтСервера(Стр) Экспорт но почему не срабатывает. Не подходит. • ActiveX объект MSWINSCK.OCX (версия 6.0.81.69). Файл взял из поставки Microsoft Visual Basic 6 все остальные версии файла ругались на отсутствие лицензии. Данные отправляет нормально но вот не знаю как принять данные. После того как сервер отправит данные переменная BytesReceived изменяется, а вот процедура GetData почему то всегда возвращает пустое значение. Подходит если разобраться с приемом данных Вот остановился на двох компонентах: netaInet.dll и MSWINSCK.OCX. Больше склоняюсь к последней. Ссобственно и два вопроса: - может кто-нибудь подсказать почему netaInet.dll не отправляет данные когда стоит влаг дожидаться ответа - как используя MSWINSCK.OCX отлавливать получение данных от сервера. Заранее благодарен.
#2
by Serginio1
Кстати у обработки внешнего события ограничение на длину передаваемой строки. Создавал глобальную переменную в которую помещал строку. Напиши сам ВК.
#3
by also
>>Для получения данных от сервера (то есть от посттерминала) в глобальном модуле есть процедура Инет_СтрокаОтСервера(Стр) Экспорт но почему не срабатывает. Все там работает
#6
by Serginio1
Разве все и упомнишь. Можно, все равно блокирутся до окончания обработки, т.к. сервер может работать не с одним терминалом. Но уже логика была сделана Данные из ОбработкавнешнегоСобытия, а по сути нет разницы где хранить строку.
#7
by maxim_ro
ну написать свою компоненту идея была но это уже последний вариант, пока что хочется найти ответ на мои вопросы
#8
by maxim_ro
так почему у netaInet может не срабатывать процедура в глобальном модуле Ответ Экспорт =( уже наверное все варианты перепробовал и как с помощью MSWINSCK.OCX в 1С обработать ответ от сервера тоже не понятно
#10
by maxim_ro
про RiK_Inet уже писал выше, отсылает ерунду потому что добавляет системную информацию и данные тоже напрочь не принимает =(
#14
by maxim_ro
у RiK_Inet когда сервер данные отправляет Процедура Инет_СтрокаОтСервера(Стр) Экспорт ничего не показывает
#16
by maxim_ro
как не в том, что от 1С к серверу строка отправляется и назад от сервера к 1С тоже строку отправляю
#17
by Sadovnikov
Внимательно перечитай свои же слова: "она еще добавляет служебную информацию (размер отправленных данных) "
#18
by maxim_ro
Отправляю строку без пробелов, а в описании компоненты написано что в начало добавляется размер отправленных данных, ну а почему не принимает непонятно
#20
by maxim_ro
может скинуть вам пример кода, я не издеваюсь я уже который день парюсь над этой задачей %)
#21
by Sadovnikov
Вот так она отправляет строку, медитируй: . function TRiK_Inet.SendString(var paParams: PSafeArray{(OleVariant)}) : OleVariant; var if Active = false then begin
#22
by maxim_ro
так вы принимали участие в ее написании =)) ну подскажите тогда почему когда ОтправитьСтроку(<IPАдрес>, <НомерПорта>, <Сообщение>, 1) процедура в глобальном модуле которая должна обработать ответ от сервера не срабатывает
#23
by Sadovnikov
Я же написал выше - потому что сервер отдает обратно данные не в том формате. Он их дожен отдать так же, как нарисовано в . Данные в другом формате компонента игнорирует.
#24
by maxim_ro
тогда выходит что с помощью компоненты можно связать две конфигурации 1С использующие RiK_Inet или нужно что бы 3-е приложение отправляло данные в нужном формате (в случае с моим посттерминалом невозможно) ?? =(
#25
by Sadovnikov
Почему? Ч одной стороны может быть 1С, а с другой - другое приложение, которое будет формировать нужный протокол общения.
#26
by maxim_ro
а тогда понятно почему не было ответа =( значит RiK_Inet для моего случая точно отпадает, у посттерминала свой формат сообщения =( придется искать другие варианты =(
#28
by maxim_ro
это железяка другой фирмы, начальство принесло мне его и дало задачу связать с 1С, описание протокола мне дали вот и парюсь. А как я понял изготовлен он вообще французами так что лично для меня никто протокол не поменяет =(
#30
by Sadovnikov
Тогда еще шарить по инету. Где-то пробегало, как без ВК (кажись на вбскрипте) работать с сокетами из 1С.
#32
by maxim_ro
ну шарюсь уже давно вот нашел 4 выше описанных варианта, netaInet тоже получается для данного случая не подходит? она же вроде отправляет просто строку только ответ не приходит у меня лично, как вб скрипт не знаю буду искать но вот MSWINSCK.OCX отправлять отправляет а чтоб получить данные я так понял в 1С событие фиг отловишь %)
#33
by Sadovnikov
Я бы не стал NetaInet юзать... Очень давно писалась, дофига ограничений, есть нестабильность в работе...
#35
by maxim_ro
понятно, спасибо за подсказку. LRC_TCP.dll, netaInet.dll, RiK_Inet.dll значит уже отпали для данного варианта буду дальше мучить гугл, а может вдруг кто нить чего подскажет работающего под мой случай
#37
by Мутабор
+36 он щас подтвердит что этот код он в садике написал, пока на горшочке сидел, а ты стырил :)
#38
by maxim_ro
да неважно кто написал главное что стало понятно почему ответ не приходит в моем случае =)
#40
by Serginio1
Обычно клиент посылает данные с заголовком где прописывается длина сообщения, для упрощения считывания итд. Некий свой упрощенный протокол. Написать ВК сервер даже долго не писав на нормальных языкан ну максимум час. Этой ветке уже сутки пойдут. Плюс прими меры для обслуживания одновременно нескольких терминалов. Мне пришлось делать свой протокол по верх UDP, очень плохая связь но я и клиента программировал, по TCP/IP все элементарно зная протокол клиента.
#41
by maxim_ro
я вот нашел пример как через вбскрипт посылать и принимать данные работает но не совсем то, не знаю или час нужно что бы написать свою компоненту, никогда не пробовал. Поищу примеры может и правда чего нибудь своего напишу =)
#43
by H A D G E H O G s
<<Мне пришлось делать свой протокол по верх UDP>> Это ты к тому, что UDP как бы пофигу, дошло ли до адресата цельным сообщение, так?
#47
by H A D G E H O G s
Я не верю в чудо написания компоненты. Автором. За 1 час. Да и за день тоже.
#48
by Serginio1
Да постоянно рвало соединение. Пришлось делать свой протокол с ожиданием ответа. Зато если сервер выключили а тнминал оставили включенным на утро при включении документ прописывался. А на производстве наводок до хрена.
#49
by Serginio1
Это ты зря Берешь Вот пример правда уже не помню что за вариант. Не рабочий uses begin if testval<>-1928374650 Then except on e:exception do end except on e:exception do end var buf:array of byte; len:Integer; begin if ClientSocket.Size>ClientSocket.Position then begin end.
#50
by Serginio1
Ну и сама компонента. Код не вычищаю {$WARN SYMBOL_PLATFORM OFF} interface uses procedure TC1SoccetServer5.SendResult(const StringResult: WideString); begin initialization end.
#54
by Serginio1
Мне уже жалко Гения1С, правда не особо то и в курсе, что зесь происходит. Если, что то я ничего у него не крал. Часть кода здесь явно не моя как и комментарии.
#56
by H A D G E H O G s
Да если еще знаешь, как отлаживать dll-ки в Дельфи. И еще знаешь про косяк, связанный с этой отладкой в версиях младше 7-ой под платформой NT, да еще как его обходить - вообще сказка.
#58
by Serginio1
Сначала юнит по любому отлаживаешь в составе проекта, это проще. Есть ShowMessage. Это касается и потоков. Кстати разные версии по разному отлаживаются. Сейчас нет времени, но перейду на 2009, да и на C# 4 с динамиками тоже не плохо.
#59
by H A D G E H O G s
Зачем ShowMessage? Если есть Breakpoints и отладка локальных переменных при отключенной оптимизации проекта.
#66
by Бералус
'working vb code ' Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim sData As String
#68
by Serginio1
На разных версиях семерки по разному Breakpoints отрабатывает при выключенной оптимизации. Та же проблема была и с потоками.
#69
by maxim_ro
пример кода для вб скрипт работает а вот что это за WinsockBytesToString ?? просто так Winsock.GetData(sData,8) ничего не возвращает хотя переменная BytesReceived после отправления данных увеличивается и кеш с данными обнуляется
#70
by maxim_ro
как в 1С отловить событие DataArrival(n) которое происходит в WinSock в момент получения данных %) непонятно, как только разобраться будет решение моей проблемы
#73
by maxim_ro
после отправления данных от сервера переменная Winsock.BytesReceived отображает количество полученных данных но вот метод Winsock.GetData(Ответ) ничего не возвращает
#74
by Бералус
таким способом не удается. и еще по моему средствами 1с невозможна захватить событии от активХ. Вереятность мало , что обращение к WinsockBytesToString нужный момент.(Между прочим -эта произвольная имя) Включи VBscript коды . Или создать новый ВК. Когда надо было употреблять сканнер ШК в терминальном режиме я выбрал 2-й способ. Могу помочь с ВК.
#76
by maxim_ro
Winsock.GetData(Ответ,8); такой фрагмент кода получает получает в переменную ответ пустое значение, так я уже пробовал попробую навалять ВК раньше никогда не приходилось, а вы компоненту на чем писали? я ищу примеры под Visual Studio
#77
by Бералус
не уверен, таим способом удается еще событии от Winsock : Error,SendComplete,Close который без них почти что не обойдется... Winsock.State -ами это не легко и не удобно Я на Vb6 писал
#79
by maxim_ro
когда давно, пару лет назад писал на C Builder опыта использования других языков нет =) буду искать примеры и по логике менять под свои нужды %)
#85
by Бералус
Нашел перекрасный пример ВК на Vsual Studio (исходники на С шарп). Могу передать. И естественно C Builder подходит для ВК)
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
В этой группе 1С
- ZEBRA TLP 2844. Печать этикетки.
- Значение не является значением объектного типа
- Оприходование б/у материалов...
- v7: Вопросы к тесту 1С:Профессионал БП - помогите
- Ввод реализации на основании заказа при отсутствии товара
- Не показывает СверхУрочные в Начислении ЗП ЗУП 8.1
- ЗУП Задолженность по ЗП
- v7: УПП. Распределение оплаты труда по номенклатурным группам.
- СКД: Как программно изменить родителя группировки в СКД
- Ошибка при чтении из архива
- WEB: Плейер на весь экран. Где туплю?
- 1С++ и монопольный режим (dbf)
- Счета 60.01 и 60.02
- Зависает процесс 1cv8.exe
- Обновление 1С v 8.1 УПП 1.2.24.2
- округление НДС в СФ
- Как сделать такой запрос к регистру сведений?
- Аналог в 1С8 функций ПолучитьАтрибут() и УстановитьАтрибут()?
- Материалы в разрезе МОЛ.......Док Треб-накл- счет 10
- Проблема USB принтера. Указанный порт не существует.