1CHServer - внешняя компонента, позволяющая реализовать выполнение кода в другом сеансе 1С Предприятия по запросу клиента.

20.12.10

Разработка - Разработка внешних компонент

Для чего это нужно!?
Применений может быть несколько, например вывод сообщений пользователю, закрытие сеанса ну или более сложные операции.

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

Наименование Файл Версия Размер
1CHServer.zip
.zip 32,35Kb
118
.zip 32,35Kb 118 Скачать

Понадобилось мне реализовать отображении информации об остатках из одной базы в другой в реальном времени.

Держать у каждого пользователя в сеансе дополнительное COM-соединение не очень хотелось. Так и родилось данное решение.

 

Принцип работы довольно прост:

  1. На компьютере (назовем его сервером) запускается обработка, где создается объект "AddIn.1CHServer" Этот сервер будет прослушивать определенный порт и ожидать входящий запрос от клиента.
  2. Клиент отправляет запрос серверу с помощью объекта HTTPСоединение
  3. AddIn.1CHServer получив запрос генерирует внешнее события для сеанса 1С Предприятия в котом данный объект создан
  4. На сервере выполняется запрошенный клиентом код и результат возвращается клиенту при помощи метода ВернутьРезультат(...)

Результат, возвращаемый клиенту может быть только тексовым т.к. запрос отправляется при помощи метода Получить() объекта HHTPСоединение

Теперь вместо того, чтобы держать 10-15 постоянных COM-соединений клиент лишь отправляет текст кода для выполнения в сеансе, где создан AddIn.1CHServer и получает ответ.

Работает, конечно, медленнее, чем при могло бы быть через "V8x.ComConnector", но есть и свои преимущества. Например, если надо срочно обновить базу данных, то не надо убивать все COM-сеансы, а достаточно просто остановить на время 1CHServer и обновить БД.

Не рекомендуется выполнять "тяжелый" код на сервере, т.к. это замедлит получение ответа другими клиентами.

ОПИСАНИЕ КОМНОНЕНТЫ

Методы:

  • Запустить(<Порт>) - запуск прослушивания указанного порта;
  • Остановить() - остановка сервера;
  • ВернутьРезультат(<ТекстовыйРезультат>) - возврат результата клиенту (метод обязательно должен вызываться, иначе сервер перестанет принимать входящие запросы от клиентов);

Свойства:

  • Порт - порт на котором работает сервер (только чтение);

В случае ошибки (при работе компоненты или при выполнении кода на сервере) возвращается результат вида: Error: <ОписаниеОшибки>

 

В коде, выполняемом на сервере, не должно быть комментариев

Для работы компоненты потребуется установленный Microsoft .NET Framework 2.0, взять его можно отсюда.

Регистрация компоненты в Windows - запустить reg.bat
Удаление информации о компоненте - запустить unreg.bat

Прилагаются примеры обработок для сервера и для клиента (8.2)

Критика и предложения приветствуются.

 

http://shkuraev.ru


См. также

Медиадисплей. Рекламный информационный монитор для покупателя.

Разработка внешних компонент POS терминал Рабочее место Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Управленческий учет Платные (руб)

Монитор покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Можно использовать в качестве графического меню-борда в кафе и видеовывески. Управление выводом на телевизор через hdmi-приставку на базе Windows или Android. В качестве устройства отображения можно использовать Android-планшеты, фоторамки с Android, монитор любого Windows-компьютера, доступного по сети. Настраивается ЛЮБОЙ ДИЗАЙН экрана!

16800 руб.

30.05.2017    52098    34    69    

43

Внешняя компонента для сканирования (замена TWAIN-компоненты БСП) (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

2400 руб.

12.05.2020    26242    131    99    

83

Внешняя компонента для подключения 1С к телефонии Asterisk

Разработка внешних компонент Телефония, SIP Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    44974    117    64    

60

Внешняя компонента печати PDF (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    35074    104    123    

111

Мастер создания внешних компонент 1С (технология COM) для DELPHI 6/7/8/2005/2006/2007/2008/2010/XE/XE2/XE3

Разработка внешних компонент Платформа 1С v8.3 Платные (руб)

Средство для сверхбыстрой разработки внешних компонент 1С:Предприятия 7.7 и 8 по технологии COM на всех версиях DELPHI, начиная с 6.

2000 руб.

28.03.2013    53997    35    14    

68

QR-код с логотипом компании (обычная и управляемая форма)

Разработка внешних компонент Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Как известно, стремление сделать свою рекламную продукцию запоминающейся и выделяющейся — верный путь к успеху. Сегодня, мы поговорим с вами о том, что можно сделать с обычным черно-белым QR-кодом, чтобы он стал более живым и привлекательным. Если вам не терпится попробовать сделать QR-код с логотипом компании, то эта обработка для вас!

2400 руб.

22.06.2016    30839    4    4    

8

Внешняя компонента 1С и С++. Продолжаем разговор.

Разработка внешних компонент Платформа 1С v8.3 Бесплатно (free)

А давайте запилим 8.3.26 до релиза, или оповещение с сервера...

19.02.2024    4037    starik-2005    28    

52

Внешние компоненты 1С и язык C++

Разработка внешних компонент Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Некоторые практические аспекты создания внешних компонент на языке С++ для платформы 1С 8.3++.

26.01.2024    4774    starik-2005    32    

39
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. luns 20.12.10 11:52 Сейчас в теме
Плюс авансом.
Штука полезная если работает.
2. German 413 20.12.10 12:57 Сейчас в теме
http://main.1c-ei.ru/Articles/fone-run

100 лет в обед, и без всяких ВК, просто на регламентных заданиях
3. salexdv 2327 20.12.10 13:13 Сейчас в теме
German пишет:
http://main.1c-ei.ru/Articles/fone-run
100 лет в обед, и без всяких ВК, просто на регламентных заданиях


Ну и как с помощью всего этого получить, например, остатки из базы, которая находится другом здании, городе, стране?
4. German 413 20.12.10 13:21 Сейчас в теме
наверно с помощью это никак только Web сервисы

Результат, возвращаемый клиенту может быть только тексовым т.к. запрос отправляется при помощи метода Получить() объекта HHTPСоединение

Да и вашем случае реализация не очень
5. salexdv 2327 20.12.10 13:25 Сейчас в теме
Очень или нет, но она стабильно работает ))
6. Ish_2 1104 20.12.10 14:15 Сейчас в теме
В 8-ке ВК - это зло по определению.
Публикация таких ВК , может представлять интерес как демонстрация некоторых возможностей,
как некий прикол.
Претендовать же на некое технологичное решение, которое стоит рассматривать всерьез - Боже упаси !
27. Abadonna 3958 23.09.11 10:50 Сейчас в теме
(6)
В 8-ке ВК - это зло по определению.

ВК зло, потому что я ни фига их писать не умею, 8х- отстой, потому что мне влом да и слабо в ней разобраться, 77- гуд.
Так? ;)
Это я твою мысль слегка развил в помощь апологетам семерки
Jeka44; salexdv; +2 Ответить
28. Ish_2 1104 26.09.11 01:23 Сейчас в теме
(27) Через год прострелило. Ответил-таки.
Ну погоди ! Я тебе через год так отвечу - все ахнут.
7. salexdv 2327 20.12.10 14:47 Сейчас в теме
Ну давайте тогда поубиваем всякие AddIn.Scaner45, AddIn.FprnM45 и пр., да и будет радоваться на голую 8-ку без ТО и прочих нужных вещей
Без моей компоненты очень даже можно обойтись - это просто пример решения одной из задач.
Но в целом с высказыванием совершенно не согласен.
ВК и в 7-ке и в 8-ке - вещь!
8. markers 274 21.12.10 11:15 Сейчас в теме
Alxd,
Лично я считаю что от ВК (вообще) в 8-ке нет толку потому-что очень многое хочется увести на выполнение в фоне, и в нём хочется реализовать интересные штуки, но ВК там нету! Тока ком! По этому я не вижу смысла писать ВК, если на 8-ке не всегда применимо.
9. cool.vlad4 2 21.12.10 17:51 Сейчас в теме
:D от ВК нет толку, ну, ну, ну ...я и смотрю как народ йоксели, мираклы или душеловские наработки скачивает...ВК это единственный способ протянуть мост из 1С в ООП, со всеми вытекающими последствиями - как всякий мост он хуже протоптанных троп, но и без него никуда...Даже в 1С используют ВК (namedcl или как он там, библиотечка склонений) Так, что не надо про ВК.
ЗЫ я уж не говорю про работу всякой периферии (сканеры и т.п.)
ЗЫ порой смотришь, что сама 1С посылает на SQL и диву даешься, вся 1С это сплошной ВК...шучу, конечно...
PS А последний пост, это, конечно, тоже прикол, "тока com" и никаких ВК, только велосипед и никаких колес...
10. Душелов 4013 21.12.10 21:21 Сейчас в теме
Хорошо ) Идею можно развить и довести до ума ;)

А получение данных с удаленных баз я сделал и без веб-сервисов и ВК - 8.2, использую комобъект тонкого клиента, с соединением с вебсервером и сериализацией полученного результата. Плюс в том, что передаешь произвольный текст запроса. Главное правильно передать параметры )
11. salexdv 2327 21.12.10 21:38 Сейчас в теме
Душелов пишет:
А получение данных с удаленных баз я сделал и без веб-сервисов и ВК - 8.2, использую комобъект тонкого клиента, с соединением с вебсервером и сериализацией полученного результата. Плюс в том, что передаешь произвольный текст запроса. Главное правильно передать параметры )


Тоже ловко :-)
12. milkers 2859 26.12.10 10:00 Сейчас в теме
Остаются большие вопросы с безопасностью. Как гарантировать, что компонента не содержит закладок? Как гарантировать что произвольный код на сервере не выполнит кто-нибудь другой?
Можно отрыть порт на доступ только с определенного внешнего ip, но это элементарно обходится.
13. salexdv 2327 26.12.10 12:05 Сейчас в теме
(12) Можно воспользоваться TCPViewer и понаблюдать за соединениями. Если останутся сомнения, то никто не мешает реализовать какую-нибудь другую схему без использования компоненты
14. mykolap 194 27.07.11 12:32 Сейчас в теме
Веб сервисы для таких целей как по мне гораздо лучше.
На практике для выполнения похожих задач пользуюсь именно ими.
15. salexdv 2327 27.07.11 12:47 Сейчас в теме
(14) Несомненно, веб-сервисы ловчее будут.
Только не всегда быстрее. При моей постановки задачи 1CHServer обрабатывает до 100 мелких запросов в секунду (реальная нагрузка, пока от 1 до 20 запросов в секунду).
Проповал Apache, не так шустер он.
16. Kabz 77 22.09.11 00:22 Сейчас в теме
Все хорошо и лог есть но есть проблема
даю такую команду http://127.0.0.1:1245/taxi/1.x/requestcar
получаю
22.09.2011 0:17:32 - Возвращен ответ: возратtax
22.09.2011 0:17:32 - Входящее соединение (127.0.0.1:51162)
22.09.2011 0:17:32 - Текст запроса:
favicon.ico
22.09.2011 0:17:32 - Возвращен ответ: возратfavicon.ico
19. salexdv 2327 22.09.11 09:19 Сейчас в теме
(16) Что-то я не пойму, что вы вообще пытаетесь сделать?
20. cool.vlad4 2 22.09.11 10:25 Сейчас в теме
(19) Да ему нужно отвечать на веб запросы ,а данные по всей видимости брать из 1С - http://forum.infostart.ru/forum26/topic42376/message453838/#message453838 ...я и предложил делать веб сервис и через com например брать данные.
17. Kabz 77 22.09.11 00:24 Сейчас в теме
а если даю http://127.0.0.1:1245/taxi1.xrequestcar
22.09.2011 0:23:05 - Входящее соединение (127.0.0.1:51217)
22.09.2011 0:23:05 - Текст запроса:
taxi1.xrequestcar
22.09.2011 0:23:05 - Возвращен ответ: возратtaxi1.xrequestcar

то есть почему то коряво обрабатываются / обрезает и добавляет какую то чуш ... ,
18. cool.vlad4 2 22.09.11 00:58 Сейчас в теме
(17) Почему ты решил, что коряво обрабатывается? Тебе не совсем это нужно, прочитай 10 пост и вспомни что я говорил про com
21. Kabz 77 22.09.11 12:36 Сейчас в теме
Все просто слушаю порт 1245 на сервере даю команду в лисе http://127.0.0.1:1245/taxi/1.x/requestcar
если в команде есть / то компонента дает 2 денные часть строки + favicon.ico - откуда она это берет не пойму
если команда например такая http://127.0.0.1:1245/taxi_1.x_requestcar то данные поступаю правельные taxi_1.x_requestcar
22. salexdv 2327 22.09.11 13:05 Сейчас в теме
(21) Просто выделение текста запроса в компоненте идет по символу "/", поэтому и такой результат
Именно поэтому в публикации красным написано
В коде, выполняемом на сервере, не должно быть комментариев
23. Kabz 77 22.09.11 13:34 Сейчас в теме
обидно хотел для другово немного использовать.
24. salexdv 2327 22.09.11 13:42 Сейчас в теме
(23) Предлагаю для удобства подправить код самого сервера и ввести некие аббревиатуры для команд.
Что-то вроде http://127.0.0.1:1245/АПокажиКаМнеДругОстатки

На сервере
Если Команда = "АПокажиКаМнеДругОстатки" Тогда
   ........
КонецЕсли


И все будет замечательно ;)
25. Kabz 77 22.09.11 16:06 Сейчас в теме
Только команды не я присылаю .. , а так бы использовал.. там в команде еще xml внутри ...
26. salexdv 2327 22.09.11 16:13 Сейчас в теме
(25) Могу подправить компоненту, только требуется более подробное описание входящих запросов. Пишите на почту
29. fixin 4252 28.05.12 20:16 Сейчас в теме
30. salexdv 2327 28.05.12 22:40 Сейчас в теме
(29) Простота накладывает свои жесткие ограничения
    Требуется изменение конфигурации;
    Сильно грузится процессор;
    Нет возможности запускать "сервер" на совсем удаленном компьютере;
31. fixin 4252 29.05.12 10:49 Сейчас в теме
(30) ваш метод не требует изменения конфигурации? ;-)
для ускорения и вам придется загружать центральный сервер, другого не дано. Терминальное подключение тоже загружает центральный сервер.
Нет возможности запускать "сервер" на совсем удаленном компьютере - ну почему же, можно формировать файл запроса и получать файл ответа, ноу проблемс....
32. undo 29.12.13 19:08 Сейчас в теме
Обработка классная как вариант можно в файл писать не историю обращений а текущий список обращений.
т.е. каждому входящему обращению к серверу присваивается уникальный номер, дальше данный номер передается во внешнем событии. Само событие может содержать произвольный текст в заголовке которого и есть данный уникальный номер, текст к примеру может быть упакован в что-то типа контейнера из начального и конечного символа.
после обработки запроса, его ответ пакуется в контейнер с тем же уникальным номером и отправляется обратно. Это позволит принимать сразу несколько входящих задач разделённые между собой. или это бред.
Тогда в случае выполнения тяжелого запроса обработка сможет продолжить принимать данные и ставить их в очередь.
34. salexdv 2327 29.12.13 19:49 Сейчас в теме
(32) Так никто не мешает это реализовать. На клиенте просто, как вам надо, формируете пакет и через HTTPСоединение текстом передаете серверу. Он его выполняет. Все, что вы опишете на встроенном языке без ошибок, на сервере выполнится.
Ну либо можно переделать обработку для сервера.
33. undo 29.12.13 19:09 Сейчас в теме
а если текст паковать в контейнер из условных символов, то это позволит передавать на сервер и принимать с него любой набор символов.
35. undo 29.12.13 20:16 Сейчас в теме
Спасибо, это писал к ограничению на использование комментариев.
Если компонента их обрабатывает и неправильно на них реагирует или это сам протокол HTTPСоединение неправильно их обрабатывает.? Если протокол то да тут управляющими символами пожалуй не получится исправить ситуацию, а вот если сама компонента тогда дело поправимо. и конечно не исключаю что я сильно заблуждаюсь.
36. salexdv 2327 29.12.13 20:23 Сейчас в теме
(35) Во всем виновато HTTPСоединение
37. undo 29.12.13 20:29 Сейчас в теме
Прискорбно что таким продуктивным вещам мешают такие древние :) технологии, но ничто не мешает использовать её по принцыпу ключевых слов.
38. salexdv 2327 29.12.13 20:36 Сейчас в теме
(37) Может я плохо искал и слэш можно как-то экранировать
39. undo 29.12.13 22:40 Сейчас в теме
не знаю поможет ли это другим, но мою проблему решило.

Функция Кодировать(Стр, Кодировка)
ЦДО= Новый COMОбъект("CDO.Message");
БодиПарт=ЦДО.BodyPart;
Поля=БодиПарт.Fields;
Поле=Поля.Item("urn:schemas:mailheader:content-type");
Поле.Value="text/plain; charset=""windows-1251""";
Поля.Update();
Стрим = БодиПарт.GetDecodedContentStream();
Стрим.charset = "windows-1251";
Стрим.WriteText(Стр);
Стрим.Flush();
БодиПарт.ContentTransferEncoding = Кодировка;
Стрим=БодиПарт.GetEncodedContentStream();
Возврат Стрим.ReadText();
КонецФункции // Кодировать64(Стр)

Процедура ОсновныеДействияФормыВыполнитьНаСервере(Кнопка)

Если НЕ ЗначениеЗаполнено(АдресСервера) Тогда
Предупреждение("Не указан адрес сервера!");
Возврат
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Порт) Тогда
Предупреждение("Не указан порт!");
Возврат
КонецЕсли;

Запрос = ЭлементыФормы.ТекстЗапроса.ПолучитьТекст();
Кодировка = "base64";
Запрос=Кодировать(Запрос,Кодировка);

Если ЗначениеЗаполнено(Запрос) Тогда
ОтправитьЗапросНаСервер(Запрос);
Иначе
Предупреждение("Не указан код, который должен выполняться на сервере.");
КонецЕсли;

КонецПроцедуры

В обработке сервера
Функция Декодировать(Стр, Кодировка)
ЦДО= Новый COMОбъект("CDO.Message");
БодиПарт=ЦДО.BodyPart;
БодиПарт.ContentTransferEncoding = Кодировка;
Стрим=БодиПарт.GetEncodedContentStream();
Поля=БодиПарт.Fields;
Поле=Поля.Item("urn:schemas:mailheader:content-type");
Поле.Value="text/plain; charset=""windows-1251""";
Поля.Update();
Стрим.WriteText(Стр);
Стрим.Flush();
Стрим = БодиПарт.GetDecodedContentStream();
Стрим.charset = "windows-1251";
Возврат Стрим.ReadText();
КонецФункции // Декодировать64(Стр)

Функция ВыполнитьЗапросКлиента(Запрос)

Результат = "";
СтруктураРезультата = Новый Структура("Ошибка, ОписаниеОшибки, Результат", Ложь, "", "");

Кодировка = "base64";
Запрос = Декодировать(Запрос,Кодировка);

Попытка
Выполнить(Запрос);
Исключение
Результат = "Error: " + ОписаниеОшибки();
КонецПопытки;

Возврат Строка(Результат);

КонецФункции
40. undo 29.12.13 22:43 Сейчас в теме
т.е. суть в следующем, предварительно перед передачей запроса, я его кодирую в Base64, а при получении перед передачей на выполнение обратно его декодирую. Образец кодирования и декодирования взял у smaharbA с "mista" за что ему большое спасибо.
Не проверял насколько это сказывается на быстродействии данной обработки но факт имеет место.
41. salexdv 2327 29.12.13 23:02 Сейчас в теме
(40) Вот я и говорю, что проблему можно решить простой модификацией обработки клиента и "сервера". Компонента - лишь обеспечивает связь с "сервером", а дальше все в ваших руках
42. undo 29.12.13 23:12 Сейчас в теме
Верное замечание, дальше уже есть мысль что нужно полученный ответ запроса, любого виды через функцию ЗначениеВФайл сохранить во временный файл перекодировать его в base64 и отправить клиенту на раскодирование. Таким образом можно и таблицы значений передавать и любые другие объекты предпологаю.
Конечно в этом случае предпологается идентичность идентификаторов данных или использовать в запросе представления объектов и передавать в таблице значений только текстовые представления данных.
Вообщем ОГРОМНЫЙ зачет.
43. undo 29.12.13 23:14 Сейчас в теме
Нужно будет попробовать реализовать данный момент на 7.7
Оставьте свое сообщение