gifts2017

Реализация доступа к сокетам внешней компонентой для 1С Native API на языке Delphi (8.2)

Опубликовал Владислав Ярославлев (vladon) в раздел Программирование - Внешние компоненты

Пример реализации функций работы с сокетами во внешней компоненте, написанной для 1С Native API на языке Delphi.

Пример реализации функций работы с сокетами во внешней компоненте, написанной для 1С Native API на языке Delphi.

Использованы исходники реализации интерфейса от пользователя v77: http://infostart.ru/public/81644/

При написании руководствовался ещё реализацией Native API от romix: http://infostart.ru/public/88060/ 

В файле SocketNative.zip: исходники; скомпилированные dll для Windows x86 и x64; пример конфигурации 1С (выгрузка информационной базы с запуском на сервере).

Исходники компилировались Embarcadero Delphi XE3. 

Исправление от 01.10.2012 - теперь работает и на сервере x64, спасибо юзеру romix (v77).

Функции: 

 
  • Подключиться (Connect)
  • Отключиться (Disconnect)
  • Послать (SendData)
  • Принять (RecvData) 

Порядок использования:

Подключаем внешюю компоненту (считаем, что расположена в макете интегрированной обработки TestNativeAPI):


ПодключитьВнешнююКомпоненту("Обработка.TestNativeAPI.Макет.SocketNative", "SocketNative", ТипВнешнейКомпоненты.Native); 

Сокет = Новый("AddIn.SocketNative.SocketNative");  

 

Устанавливаем свойства Сервер, Порт, Таймаут:

Сокет.Сервер = ;
Сокет.Порт = ;
Сокет.Таймаут = ;

И подключаемся:

Сокет.Подключиться();

Теперь можно, например, отправлять данные:

Сокет.Послать("Hello, world");

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
SocketNative-20121001.zip
.zip 3,90Mb
01.10.12
149
.zip 3,90Mb 149 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Константин Зонин (CVZ) 19.07.12 11:21
Проверено, работает на 64-битном сервере 1С
2. Олег (oleg_km) 19.07.12 12:57
Так он только подключаться может, а слушать? С подключиться проблем нет, вот как слушающий организовать
3. Владислав Ярославлев (vladon) 19.07.12 13:18
(2) oleg_km, ну это нужно сервер писать, в принципе несложно. Просто нет смысла организовывать её в виде компоненты.

Есть какая-то конкретная задача для "слушания"? Опишите, возможно, я смогу взяться.
4. Олег (oleg_km) 19.07.12 13:22
не понятно как делать многопоточность, как читать подключенные сокеты. Я думал ты придумал что-то. С клиентом все понятно
5. Владислав Ярославлев (vladon) 19.07.12 14:20
(4) oleg_km, у меня реализована многопоточность, например, резолв IP-адреса по имени хоста происходит в отдельном потоке, посмотрите исходники.

Просто не понимаю смысла реализовывать сервер в виде ВК для 1С.
6. phabi0z 14.08.12 23:35
Написал компоненту для оптимизации раскроя листов под win32. Недавно установили сервер 1с x64 под win 64... Конечно же ВК не работает. Перекомпилил на Delphi ex2 под x64. При подключении ВК сервер 1c падает.

Теперь вопрос. Есть ли какие-то особенности при компиляции ВК для x64?
PS. Владислав (vladon), не могли бы написать свою почту для связи, если не затруднительно?
7. phabi0z 20.08.12 22:57
(1) CVZ,
подключить компоненту на 64 сервере 1с не удалось!
Пробовал на версии 8.2.13.209 и на версии 8.2.16.352 - результат одинаковый - зависание с последующим отсоединением от сервера


Подскажи как подключал?
8. Владислав Ярославлев (vladon) 24.09.12 16:16
Проблему с x64 подтверждаю, работаю над этим.
9. Константин Зонин (CVZ) 24.09.12 16:55
(7) phabi0z, приношу свои извинения, как выяснилось сегодня - тестили на 32 бит...
10. Владислав Ярославлев (vladon) 01.10.12 12:51
(7) phabi0z, ошибка с x64 исправлена, качайте обновлённый файл.
11. phabi0z 01.10.12 15:11
(10) vladon, спасибо
уже решил проблему переписав свой код на си,
но все равно скачаю для анализа проблемы
12. Владислав Ярославлев (vladon) 01.10.12 15:29
(11) phabi0z, а можно, если не гостайна, взглянуть на ваш код на си?

а проблема была в размерности типов, оказывается, в 64-бит delphi размерность Integer остаётся 32 бита, а размерность pointer увеличивается до 64 бит

в 32-битном дельфи sizeof(Integer)=sizeof(Pointer)=32bit

поэтому в 32-бит сервере работало, а в 64-бит сервере ссылки на функции в классе были неверными
13. phabi0z 01.10.12 16:33
(12) vladon,
Я так и понял, что проблема в размерности типов, но не смог решить ее в delphi,
в классах ковыряться не было времени.

А для переноса своего кода на си я использовал пример с диска ИТС.
Он написан под vs2008 и там в принципе нет ничего сложного.
По себе могу сказать, что в основном программировал на delphi, но проблем с пониманием 1С-ной технологии создания внешних компонент на NativeApi у меня не возникло.

Выкладывать код ВК считаю нецелесообразным, так как каркас проекта есть на ИТС.
В дальнейшем планирую написать статью (если ее еще никто не написал)

Если очень надо - скину код проекта в личку, но без основной библиотеки раскроя(это гостайна)
14. Владислав Ярославлев (vladon) 01.10.12 16:38
(13) phabi0z, вот я как раз вообще не смог разобраться с примером с ИТС, под x64 у меня не компилируется (вернее, компилируется, с ворнингами о размере переменных), VS 2012

если можно, скиньте, пожалуйста, в личку или на мыло - vladon@vladon.ru
15. phabi0z 01.10.12 16:45
(14) vladon, ок, сейчас скину на мыло
16. phabi0z 01.10.12 17:05
(14) vladon,
ворнинги я убрал с помощью оператора static_cast<int>(var),
в общем в коде глянешь.
17. Resha D (Resha) 18.05.13 13:35
Есть один нюанс. этой компонентой не возможно передать произвольные данные.

Данные вида (26 байт, 16-й вид):

1A 00 00 00 C0 00 01 00 00 00 10 00 00 00 01 E0 01 00 33 39 37 32 35 31 37 38

передались как

1A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

и, соответствующим образом изменилась и строка в 1С после вызова метода "ОбъектСокет.SendData(СтрокаЗапроса)".

Если кто знает как можно передать по TCP из 1С произвольные данные, прошу подсказать.
Или может где взять исходники этой компоненты.

Вариант через Winscock так же не прошел, т.к. 1С (или Winsock) изменила строку на следующую:

1A 00 00 00 41 00 01 00 00 00 10 00 00 00 01 61 01 00 33 39 37 32 35 31 37 38
(все буквы типа À (код 192) заменены на обычные A (код 65))

К тому же так и не нашел рабочий вариант использования Winsock который можно использовать в одной процедуре (без обработчиков событий)
18. Fred (Aspirant) 02.10.13 09:39
Не совсем понятно как и где это можно использовать?
19. Алексей Ко (Жолтокнижниг) 06.10.13 17:37
{Обработка.TestSocketNative.Форма.Форма.Форма(27)}: Недостаточно фактических параметров
Сокет.Послать("Hello, world");
20. Капитан Немо (capitan) 10.10.14 19:55
Обычно в этом месте кричат - Верните мой стартмани и ставят минус :)
Но я не сторонник таких мер. Как говорят профессора - раз что то ищет, значит что то знает.
Но желающим скачать обработку отсюда докладываю : на win 7 64-х не работает
{Обработка.TestSocketNative.Форма.Форма.Форма(22)}: Поле объекта не обнаружено (Сервер)
ОбъектСокет.Сервер = СокрЛП(TCPАдрес);
На сайте автора есть версия №2 в ней хотя бы реализован пример до конца.
И он работает ... &НаСервере
Нафига внешняя компонента на сервере ?
Как пожелание - здесь положить свежую версию и рабочие примеры возможно для 32 х и 64 х
И создавать компоненту на клиенте.
21. Дмитрий (gdu199) 13.10.14 13:36
Ждем вариант для клиента, а то как то нехорошо получается. Неплохо было бы предупреждать в топике
22. Vladimir Urusov (uvsd2014) 18.02.15 09:44
23. KostyaBu Bu (KostyaBu) 05.09.15 00:38
ошибка {Обработка.TestSocketNative.Форма.Форма.Форма(28)}: Поле объекта не обнаружено (Сервер)
Сокет2.Сервер = Сервер;
код

Сокет2= Новый("AddIn.SocketNative.SocketNative");
Сокет2.Сервер = Сервер;
Сокет2.Порт = номерСокета;
Сокет2.Таймаут = 100;

Обработка в придложенным вариантом не работает!
chizh.84; dinork; +2 Ответить
24. Артем Коноплин (artemka) 16.09.15 15:59
Все спрашивают - нафига компонента на сервере?
Отвечаю: для выполнения обмена в автоматическом режиме сейчас используются фоновые задания 1с, которые мониторят папки на наличие файлов с данными и грузят их, когда они появляются. Т.к. интервал опроса стоит очень маленький - 10 сек, а заданий много, то грузит это сервер просто не по-детски.
А хотелось бы, чтобы была ВК которая вызывала бы событияе на сервере для загрузки данных.
Конечно можно написать службу, которая будет при появлении данных создавать сеанс 1с и вызывать там загрузку, но это долго (создание сеанса) и неэффективно (сеанс будет подниматься по нескольку раз в минуту).
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа