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 не будет опубликован. Обязательные поля помечены *