Http-1C(OLE) -connector

Создание веб сервера на 1С …

COM приложение слушает указанный порт передает post get запросы в 1с.

При приходе запроса вызывает  функцию в модуле внешнего соединения. и возращает ответ обратно.

 

 Функция ObtainedData(Тип,Отправитель,Команда=»»,Параметр=»»,Данные=»») экспорт

  • Параметры:
  • Тип — тип запроса (get,Post)
  • Отправитель —  ip адрес отправителя запроса.
  • Команда — сама команда например /list
  • Параметр — get параметры запроса
  • Данные -сюда передаются данные post запроса (передавайте только  текст , бинарники думаю 1с не примет)

В приложении выберите порт какой слушать можно и 80 если не поднят другой веб сервер , и строку  COM подключения к 1с.

По следам http://forum.infostart.ru/forum26/topic42376/

Пожелания приветствуються.

 

Примеры использования. Дебиторка контрагентов для менеджеров (у тех, у кого нет доступа  в 1с — можно смотреть по инету) или расчетные листки  сотрудников — пароль передавать в параметрах).

 

17.10.2011   Исправлена ошибка  возникающая при  работе метода POST без данных.

22.10.2011 Добавлено:  сохранение параметров в реестре,  Запущенная при закрытии сворачивается в трей.

29.10.2011 Добавлено: в передоваемой строке можно передать код http ошибки пример «&Error(404,Not Found)  Данная страница не найдена»

66 Comments

  1. Kabz

    Создание веб сервера на 1С …

    Перейти к публикации

    Reply ↓
  2. Kuzja_R

    Отлично! Только хорошо бы организовать сохранение строки параметров соединения с базой. Может файл настроек какой-то. И сворачивание в трей не лишним будет.

    Reply ↓
  3. script

    На Win ХР при старте выдает Access violation at address ….. in modul comcntr.dll ……… и не стартует.

    Reply ↓
  4. Kabz

    (2)Проверял на 2003 , 2008 ,7 , и на хp должно работать , переустановите 8.2 (и база должна быть на 8.2)

    Reply ↓
  5. anton.fly7

    у меня давняя проблема: не могу из 1с77 достучаться до web-сервиса на 1с82

    с помощью этой штуки возможно?

    на 1с82 поднят веб-сервис, он принимает файл обмена и загружает из него документы в базу.

    из другой 1с82 могу отправить на этот веб-сервис файлы, из 1с77 так и не смог…

    Reply ↓
  6. Kabz

    Это не веб сервис , а мини веб сервер, есть различия..:) сможешь постучаться из 7 и получить файл , я передаю xml через него.

    Reply ↓
  7. powerpc

    (5) а можно такой же HTTP сервер написать на 1С ? Чтобы добавить туда авторизацию, выбор базы, интерактивность ?

    Reply ↓
  8. see1c.ru

    (2) на XP работает

    Reply ↓
  9. cool.vlad4

    (2) regsvr32 ПолныйПуть/comcntr.dll

    Reply ↓
  10. Kabz

    (6) можно .. , я сначала написал тсп -1с conector , но в 1с тогда надо все данные парсить включая заголовки.

    Reply ↓
  11. powerpc

    (9) а тсп-1с connector выложить можете здесь или выслать на 6549090@rambler.ru ?

    Reply ↓
  12. Kabz

    не могу он перерос в Http-1C(OLE) -connector — тех исходников не осталось.. а и зачем все в 1с парсить , на основе этого можно все что угодно йз 1с передовать..

    Reply ↓
  13. powerpc

    (11) не понял, а где происходит обработка команды list, которая возвращает список сотрудников браузеру ? В самом мини http-сервере ? Как добавить свои команды обработки ?

    Reply ↓
  14. see1c.ru

    Почему возникает ошибка при Post запросе?

    Access violation at address 0059BA45 in module ‘Http-1C(OLE) -conector.exe’. Read of address 00000000

    Текст1 =

    «<html xmlns=»»http://www.w3.org/1999/xhtml»»>

    |<head>

    |<meta http-equiv=»»Content-Type»» content=»»text/html; charset=utf-8″» />

    |<title>Документ без названия</title>

    |</head>

    |<body>

    | <form method=»»Post«» action=»»/»»>

    | Введите Ваше имя: <input type=»»text»» name=»»name»»>

    |

    | <input type=»»submit»» name=»»okbutton»» value=»»OK»»>

    | </form>

    |Привет !»+Команда+» — «+Параметр+» — «+Данные+»

    |</body>

    |</html>»;

    Возврат Текст1;

    Reply ↓
  15. see1c.ru

    (12)

    В 1С , МодульВнешнегоСоединения

    Reply ↓
  16. powerpc

    (14) see1c.ru, клево. Не знал такую фишку. Спасибо большое, буду знать.

    Reply ↓
  17. bobank

    А можно поподробней, как работать с этим? Где запускать, какую строку соединения прописывать, как вызывать из html?

    Reply ↓
  18. Kuzja_R

    (16) bobank, все можно увидеть на скриншоте. Хотя конечно да, help нужен.

    Reply ↓
  19. Aleksey.Bochkov

    А в чем ценность?

    Стандартные веб-сервисы такое же умеют.

    Reply ↓
  20. psih12

    (17) Kuzja_R, Поддерживаю по поводу хэлпа

    Reply ↓
  21. TitanLuchs

    Интересно. А эта штука не будет конфликтовать с другим веб-сервером, установленном на компе, с апачем например?

    И если в комп подключен йотовский модем с внешним белым айпишником, то получится извне достучаться до 1С и получить результат обработки запроса?

    Reply ↓
  22. Kabz

    (21)я использовал просто другой порт не 80 а 4080 ли 8080 и тд..

    Reply ↓
  23. Kabz

    какой вам Help нужен что такое COM и строка соединения смотреть в руководстве по 1с

    программа вызывает 1 функцию в модуле внешнего соединения , что в ней вернете то и отправит обратно ..

    Запускать на компьютере где установлен 1с и есть доступ к базе которая в строке сопединения,и какой вы хотите использовать в качестве веб сервиса , про открытие нужных портов говорить не буду к сис админу.

    Reply ↓
  24. TitanLuchs

    (23)Ясно, спс

    Reply ↓
  25. Kabz

    (13) вроде поправил

    Reply ↓
  26. see1c.ru

    (25) Да, работает.

    Reply ↓
  27. bobank

    (22) спасибо за help, теперь ясно

    Reply ↓
  28. bazcom

    мини веб сервер!!!

    Reply ↓
  29. psih12

    (27) bobank, за какой help Вы спасибо говорите?

    Reply ↓
  30. bobank

    (29) psih12, пост №22 🙂 Вместе с демо-конфигурацией все понятно.

    Reply ↓
  31. psih12

    А как использовать параметр и данные? Может кто выложит примерчик? Я имею ввиду, например, как получить не весь список сотрудников, а Иванова или Сидорова.

    Reply ↓
  32. Kabz

    (31) напиши в модуле

    функция ObtainedData(Тип,Отправитель,команда=»»,параметр=»»,данные=»») экспорт

    НачалоПервогоПараметра = Найти(Параметр,»name=»)+5;

    ОкончаниеПервогоПараметра = Найти(Параметр,»&»);

    Имя = Сред(Параметр,НачалоПервогоПараметра,ОкончаниеПервогоПараметра-НачалоПервогоПараметра);

    Текст1 =

    «<html xmlns=»»http://www.w3.org/1999/xhtml»»>

    |<head>

    |<meta http-equiv=»»Content-Type»» content=»»text/html; charset=utf-8″» />

    |<title>Документ без названия</title>

    |</head>

    |

    | <form method=»»post»» action=»»/»»>

    | Введите Ваше имя: <input type=»»text»» name=»»name»»>

    |

    | <input type=»»submit»» name=»»okbutton»» value=»»OK»»>

    | </form>

    |Ваше имя «+Имя+»

    |

    |</html>»;

    Возврат Текст1;

    КонецФункции

    Reply ↓
  33. psih12

    (32) спасибо, но вызвать не получается. Набираю в браузере «127.0.0.1:4080/name=Сидоров&» и вылетает ошибка. В чём я не прав?

    Reply ↓
  34. Kabz

    (33) в 32 совсем другой пример без листа просто набери 127.0.0.1:4080

    параметры в вебе передаются так http://127.0.0.1:4080/list?name=IVAN

    пример только для английских параметров.. для руских надо делать транскодирование..

    функция ObtainedData(Тип,Отправитель,команда=»»,параметр=»»,данные=»») экспорт

    если нрег(команда)=»/list» тогда

    НачалоПервогоПараметра = Найти(Параметр,»name=»)+5;

    ОкончаниеПервогоПараметра = Найти(Параметр,»&»);

    Имя = Сред(Параметр,НачалоПервогоПараметра,ОкончаниеПервогоПараметра-НачалоПервогоПараметра);

    тх=»<HTML><HEAD>

    |<META content=»»text/html; charset=utf-8″» http-equiv=Content-Type>

    |<META name=GENERATOR content=»»MSHTML 9.00.8112.16437″»></HEAD>

    |<BODY>

    |<P><STRONG>Пример работы    Сотрудники</STRONG></P>

    |<P>

    |<TABLE width=»»100%»»>

    |<TBODY> «;

    выб=Справочники.Сотрудники.Выбрать();

    пока выб.Следующий() цикл

    если ЗначениеЗаполнено(имя) и выб.Наименование<>имя тогда

    продолжить;

    КонецЕсли;

    тх=тх+»<TR><TD>»+выб.Наименование+»</TD><TD>»+выб.ГодРождения+»</TD></TR>» ;

    КонецЦикла;

    Возврат тх;

    КонецФункции

    Reply ↓
  35. psih12

    (32) Дорпботал немного твой пост.

    функция ObtainedData(Тип,Отправитель,команда=»»,параметр=»»,данные=»») экспорт

    НачалоПервогоПараметра = Найти(Параметр,»name=»)+5;

    ОкончаниеПервогоПараметра = Найти(Параметр,»&»);

    Имя = Сред(Параметр,НачалоПервогоПараметра,ОкончаниеПервогоПараметра-НачалоПервогоПараметра);

    Текст1 =

    «<html xmlns=»»http://www.w3.org/1999/xhtml»»>

    |<head>

    |<meta http-equiv=»»Content-Type»» content=»»text/html; charset=utf-8″» />

    |<title>Документ без названия</title>

    |</head>

    |

    | <form method=»»post»» action=»»/»»>

    | Введите Имя: <input type=»»text»» name=»»name»»>

    |

    | <input type=»»submit»» name=»»okbutton»» value=»»OK»»>

    | </form>»;

    Если ЗначениеЗаполнено(Имя) тогда

    Текст1 =Текст1 +»

    |Год рождения «+Справочники.Сотрудники.НайтиПоНаименованию(Имя).ГодРождения+»

    |

    |</html>»;

    Иначе

    Текст1 =Текст1+»

    |Год рождения

    |

    |</html>»;

    КонецЕсли;

    Возврат Текст1;

    КонецФункции

    Теперь не пойму, почему здесь-то русское название фамилии не распознаётся?

    Reply ↓
  36. see1c.ru

    (35) Не мудрствуя лукаво можно например так перекодировать 🙂

    Функция Перекодировка(СтрокаВКодировке=»») Экспорт

    Алф = «АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчш­щьыъэюя»;

    КАлф = «%D0%90%D0%91%D0%92%D0%93%D0%94%D0%95%D0%81%D0%96%D0%97%D0%9­8%D0%99%D0%9A%D0%9B%D0%9C%D0%9D%D0%9E%D0%9F%D0%A0%D0%A1%D0%A­2%D0%A3%D0%A4%D0%A5%D0%A6%D0%A7%D0%A8%D0%A9%D0%AC%D0%AB%D0%A­A%D0%AD%D0%AE%D0%AF%D0%B0%D0%B1%D0%B2%D0%B3%D0%B4%D0%B5%D1%9­1%D0%B6%D0%B7%D0%B8%D0%B9%D0%BA%D0%BB%D0%BC%D0%BD%D0%BE%D0%B­F%D1%80%D1%81%D1%82%D1%83%D1%84%D1%85%D1%86%D1%87%D1%88%D1%8­9%D1%8C%D1%8B%D1%8A%D1%8D%D1%8E%D1%8F»;

    Сим = «!#%&'(),:;<>?[]#k8SjZc9Dxk`{| }»;

    КСим = ВРег(«%21%23%25%26%27%28%29%2c%3a%3b%3c%3e%3f%5b%5d%5e%60%7b%7c%2­0%7d»);

    ТекСтрока = СтрокаВКодировке;

    Для а = 1 по СтрДлина(КАлф)/6 Цикл

    ТекСтрока = СтрЗаменить(ТекСтрока,Сред(КАлф,а*6-5,6),Сред(Алф,а,1));

    КонецЦикла;

    Для б = 1 по СтрДлина(Сим) Цикл

    ТекСтрока = СтрЗаменить(ТекСтрока,Сред(КСим,б*3-2,3),Сред(Сим,б,1));

    //Тек = Тек + Сред(КСим,а*3-2,3)+ Символы.ВК;

    КонецЦикла;

    ТекСтрока = СтрЗаменить(ТекСтрока,»%E2%84%96″,»№»);

    ТекСтрока = СтрЗаменить(ТекСтрока,»+»,» «);

    ТекСтрока = СтрЗаменить(ТекСтрока,»%2B»,»+»);

    Возврат ТекСтрока;

    КонецФункции

    Reply ↓
  37. psih12

    (34) (36) see1c.ru, Спасибо. Теперь бы с данными разобраться. Они-то для чего?

    Reply ↓
  38. rzh

    Скачать не могу, инфоденег пока не набрал 🙂

    Но штука явно полезная. Без лишних заморочек с Веб-сервисом 1с и дополнительным софтом, запросто организовать съем нужных данных из базы.

    Обязательно мастхев. Спасибо!

    Reply ↓
  39. galyausik1

    Думаю пригодится.

    Спасибо автору.

    Reply ↓
  40. undo

    быстрое получение коротких предопределённых данных, ведь если в параметре передавать ключевые слова и по ним формировать различные отчеты и возвращать ответ, то вообще будет супер.

    Reply ↓
  41. psih12

    С помощью автора и сообщества почти разобрался в работе. Однако остался вопрос, может кто подскажет. Написал функцию, которая должна по артикулу товара выдавать его количество. Однако, на самом деле, ничего не выдает. В чём может быть причина? Вот текст функции:

    функция ObtainedData(Тип,Отправитель,команда=»»,параметр=»»,данные=»») экспорт

    НачалоПервогоПараметра = Найти(Параметр,»name=»)+5;

    ОкончаниеПервогоПараметра = Найти(Параметр,»&»);

    Артикул = Сред(Параметр,НачалоПервогоПараметра,ОкончаниеПервогоПараметра-НачалоПервогоПараметра);

    Если ЗначениеЗаполнено(Артикул) тогда

    УсловиеОтбор=Новый Структура(«Номенклатура»);

    УсловиеОтбор.Номенклатура=Справочники.Номенклатура.НайтиПоРеквизиту(«Артикул»,Артикул);

    ТоварыНаСкладахОстатки= РегистрыНакопления.ТоварыНаСкладах.Остатки (,УсловиеОтбор);

    Если ТоварыНаСкладахОстатки.Количество()>0 тогда

    КоличествоТовара=ТоварыНаСкладахОстатки.КоличествоОстаток;

    КонецЕсли;

    КонецЕсли;

    Текст1 =

    «<html xmlns=»»http://www.w3.org/1999/xhtml»»>

    |<head>

    |<meta http-equiv=»»Content-Type»» content=»»text/html; charset=utf-8″» />

    |<title>Документ без названия</title>

    |</head>

    |

    | <form method=»»post»» action=»»/»»>

    | Введите Артикул: <input type=»»text»» name=»»Number»»>

    |

    | <input type=»»submit»» name=»»okbutton»» value=»»OK»»>

    | </form>»;

    Если ЗначениеЗаполнено(Артикул) тогда

    Текст1 =Текст1 +»

    |Количество «+КоличествоТовара+»

    |

    |</html>»;

    Иначе

    Текст1 =Текст1+»

    |Количество

    |

    |</html>»;

    КонецЕсли;

    Возврат Текст1;

    КонецФункции

    Reply ↓
  42. Kabz

    (41)КоличествоТовара- занули ..

    если артикул русский делай транс кодирование..

    Reply ↓
  43. psih12

    (42) Занулил-эффекта тоже 0, артикул цифровой.

    Reply ↓
  44. bobank

    (41) psih12, преобразуй параметр в число:

    Артикул = 0 + Сред(Параметр,НачалоПервогоПараметра,ОкончаниеПервогоПараметра-НачалоПервогоПараметра);

    Reply ↓
  45. bobank

    (41) psih12, а параметр имеет имя «name» ? У него имя «Number». И соответственно не

    НачалоПервогоПараметра = Найти(Параметр,»name=»)+5;

    а

    НачалоПервогоПараметра = Найти(Параметр,»Number=»)+7;

    Reply ↓
  46. psih12

    (44) bobank, тогда вообще каракули выдает. Немного ошибся — артикул в конфигурации представлен как строка, правда, русских названий в нём нет. В основном, цифры, но есть и следующего вида, например: 123456-070

    Reply ↓
  47. bobank
    bobank пишет:

    (41) psih12, а параметр имеет имя «name» ? У него имя «Number». И соответственно не

    НачалоПервогоПараметра = Найти(Параметр,»name=»)+5;

    а

    НачалоПервогоПараметра = Найти(Параметр,»Number=»)+7;

    Reply ↓
  48. psih12

    (47) bobank, Поправил-вернул на место «name=». Эффекта нет

    Reply ↓
  49. see1c.ru

    (35)

    просто выведи в низ html странички значения параметров:

    команда + » » +параметр+» «+данные;

    и посмотри что приходит в обработку

    Reply ↓
  50. Kabz

    (43)(44)(45)(46)(47)(48)(49) Ребята это форум про компоненту , а не умение работать с 1с и отладчиком , подключи отладку и посмотри как все работает и сформируй нужный файл…

    Reply ↓
  51. sumixam

    очень полезная вещь

    Reply ↓
  52. ms200999

    Сохранил в закладках, обязательно посмотрю позже. Симпатичная идея.

    Reply ↓
  53. Enya_06

    о! Отлично!!!! Этого мне как раз и не хватало!! Подали идею!

    Reply ↓
  54. VVi3ard

    Отличная вещь, спасибо!

    Reply ↓
  55. Kuzja_R
  56. 7fortune

    Автору — спасибо огромное! ваша разработка очень помогла!

    Reply ↓
  57. ekors

    Ребята, помогите…

    Пытаюсь сделать POST с передачей данных (из внешней программы) и не могу понять как написать в обработке полученные данные…

    В 1с:

    Если (Тип = «POST») И (команда = «/detailout») Тогда

    Текст1 = «Тип: » + Тип + » » + «Отправитель: » + Отправитель + » » + «Команда: » + команда + » » + «Параметр: » + параметр + » » + «Данные: » + данные + » «;

    КонецЕсли;

    Из внешней программы на androide делаю POST-вызов:

    http://127.0.0.1:4080/detailout?000000003&000000014

    job1.PostString(«http://127.0.0.1:4080/detailout?» & HTTPUserCode & «&» & TaskCode & «&xml=», sTmp)

    sTmp — это base64-строка

    Но не вижу как эти POST данные использовать в обработке…

    Переменая «данные» — пустая…

    Подскажите куда копать?

    Reply ↓
  58. ekors

    Кажется я понял в чем проблема…

    Если данные для POST привести к формату base64, а в 1с сделать encode, то вроде пошло…

    Я не ожидал, что нужно это делать…

    Причина в этом?

    Reply ↓
  59. militskis

    А что означает сообщение «Существуют активные сеансы работы с данной базой, использующую версию платформы, не поддерживающую совместную работу с этой версией. Не совпадает версия временного файла.»

    Сообщение появляется в двух случаях:

    1. Запущена база 1С — сообщение появляется при нажатии кнопки Старт в утилите.

    2. Запущена утилита (кнопкой старт) — сообщение появляется при запуске базы.

    На компьютере установлено одновременно две платформы: 8.2 и 8.3. База запускается в 8.3.

    Пользователей в базе нет введенных. строка запуска: file=»D:Pavelдоговора»;

    Reply ↓
  60. Kabz

    Утилита работает только с 8.2 поэтому к базе надо подключаться 8.2

    Reply ↓
  61. Kabz

    У МЕНЯ ЕСТЬ СЛУЖБА КОТОРАЯ ПОДКЛЮЧАЕТ 8.2_8.3 ПОПОЗЖЕ ЕЕ ВЫЛОЖУ.

    Reply ↓
  62. militskis

    Буду ждать — спасибо.

    Reply ↓
  63. Exit_in

    (61) Добрый день. для 8.3 уже готово? и работает данная утилита для серверных баз?

    Reply ↓
  64. itserve

    Добрый день!

    Спасайте!

    На удаленном сервере поднят веб-сервер на IIS, как мне при использовании вашей обработки сделать так, чтобы get-запросы можно было обработать в 1С?

    Reply ↓
  65. Kabz

    ничего не понял давайте в личку, хотя старая процедура я использую другую и 8.3 она не актуальна.

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *