gifts2017

Реверс-инжиниринг документации платформы 1С 8.3

Опубликовал Алексей Лустин (lustin) в раздел Администрирование - Системное

Никому нельзя верить на слово, особливо документации. Во-первых потому-что документацию пишут далеко не авторы функционала, а во-вторых потому-что формулировки используемые в документации ориентированы на широкий круг читателей и формулировки могут, скажем так, "иногда страдать". В связи с этим часто приходится исследовать конкретный инструмент собственными руками. На вопрос "зачем" такое делать ?, скажу сразу - очень многое становится понятным и иногда возникают новые идеи. После прочтения данной публикации они возникнут и у вас.

Давно ничего не публиковал на Инфостарте, оперативная нагрузка не позволяла заняться серьзными публикациями. Да и это исследование первоначально начиналось как обычная блогозапись в рамках истории построения корпоративного дистрибутива, проблемы которая еще пока нормально не решается и продолжаются исследования

Но есть, то чем хочется поделиться с сообществом уже сейчас, потому что это будет интересно многим. В связи с тем, что:

  1. многие уже сейчас начали делать сервис обновления баз
  2. многие до конца не понимают поведения тонкого клиента при запросе списка обновлений баз и обновления дистрибутива клиента 
Итак - маленький интересный момент...

Исследование поведения клиента 1С при запросе списка информационных баз

У нас наличествует документация - http://its.1c.ru/db/v83doc#content:30:1
Не скажу, что она дала полное понимание поведения данного сервиса, а точнее совсем не дала.

Больше дало обсуждение на форуме Mista.ru
Но опять же – нет полного понимания поведения. Потому что взаимодействия по протоколу HTTP не всегда такое простое, как описывается. Особливо, если используются странные понятия – такие как например “Интернет-сервис”. Что это за зверь неясно.

Поэтому перед тем как делать управление списком клиентов и списком информационных систем, которое каждый разрабатывает для себя сам – так как все очень сильно зависит от степени коммуникации между группами внутри DevOps, необходимо произвести маленькое исследование.

Для простоты – нам понадобится Ruby и следующий команды:

> gem install sinatra

> echo #proxy-r-and-d > onec-proxy-sinatra.rb

состав файла onec-proxy-sinatra.rb

запускающая команда простая до невозможности:

> ruby.exe onec-proxy-sinatra.rb

и теперь когда мы выполним следующую настройку:
image

в консоли будем наблюдать следующую картинку:

2 (два) запроса по HTTP – HEAD & GET

HEAD /WebCommonInfoBases HTTP/1.1
GET /WebCommonInfoBases/CheckInfoBases?InfoBasesCheckCode=00000000-0000-0000-0000-000000000000
 &ClientID=00000000-0000-0000-0000-000000000000 HTTP/1.1
 

Если расскоментировать строку 'return strange' – то ситуация немедленно меняется

HEAD /WebCommonInfoBases HTTP/1.1
GET /WebCommonInfoBases?wsdl HTTP/1.1
 

То есть обращаю внимание – если на запрос HEAD обратного ответа нет совсем, но на порту присутствует слушающий сокет, платформа версии 1С:Предприятие 8.3 (8.3.4.428) делает чистый HTTP вызов, аналогичный SOAP вызову из документации.

Для тех кто не понял. Такое впечатление, что в платформу уже встроена поддержка НЕ только SOAP вызова для обновления списка информационных баз. И еще если посмотреть на возвращаемый заголовок мы видим что оно принимает JSON

"accept\"=>\"application/json\"

Ну а дальше, все просто - прикидываемся сервисом который ожидает 1С (Gist ссылка)

на выходе имеем ожидаемое

REST сервис для получения списка информационных баз:

"HEAD /WebCommonInfoBases HTTP/1.1" 200 0

“GET /WebCommonInfoBases/CheckInfoBases
    ?InfoBasesCheckCode=00000000-0000-0000-0000-000000000000
    &ClientID=00000000-0000-0000-0000-000000000000 HTTP/1.1" 200

"GET /WebCommonInfoBases/GetInfoBases
    ?InfoBasesCheckCode=00000000-0000-0000-0000-000000000000
     &ClientID=00000000-0000-0000-0000-000000000000 HTTP/1.1" 200
 

Вообще подобным образом достаточно удобно исследовать поведение платформы – тонкий клиент по HTTP, HTTPS или SOAP 1.1 вызовы. На основе данных исследований обычно строятся более стабильные решения.

Для непонятливых: вы можете сделать свой собственный сервис обновления для тонких клиентов 1С 8.3 на ruby, python, C#(WCF). Также вынужден заметить, что если знать что такое HTTP заголовки вы можете сделать и мониторинг ВСЕХ запусков тонких клиентов в компании или в облаке. 

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение
Комментарии
1. Евгений Сосна (pumbaE) 24.03.14 00:22
даже 1сфреш не использует такое, читаешь инструкцию по подключению баз к тонкому клиенту и понимаешь, что не хватает подключения общего списка баз данных и тогда простое подключение доп. базы превратилось бы в выбор и оплату, без ручного подключения.
2. Алексей Лустин (lustin) 24.03.14 01:05
(1) еще самое плохое сейчас, это то что в принципе любой пользователь вправе отредактировать эту настройку - я имею ввиду сервис обновления.

Настройка доступна для любого пользователя в каталоге AppData\Roaming\1C\1CEStart

В большом предприятии просто через групповые политики везутся скрипты, которые после установки тонкого клиента прописывают в нем что-то типа InternetService=http://1c-update.example.lan/iblist

Если "фрешевцы" разберутся с сервисом обновления, то скорее всего встроят настройку в документацию
И тогда будет счастье

3. Доржи Цыденов (support) 24.03.14 01:19
(2) lustin, http://pastebin.com/
Доступ к сайту ограничен в соответствии с Федеральными законами №114-ФЗ от 25.07.2002 (О противодействии экстремистской деятельности), №436-ФЗ от 29.12.2010 (О защите детей от информации, причиняющей вред их здоровью и развитию), №149-ФЗ от 27.07.2006 (Об информации, информационных технологиях и о защите информации) и Постановлением Правительства РФ от 26.10.2012 №1101.
4. Алексей Лустин (lustin) 24.03.14 02:02
(3) у меня Билайн провайдер открывает нормально.
А куда перенести, а то ruby код в подсветке 1С выглядит Не очень.
5. Евгений Сосна (pumbaE) 24.03.14 09:01
(3) ОФФ: вежливые люди охраняют покой :)
6. Андрей Овсянкин (Evil Beaver) 24.03.14 12:14
(3) support, pastebin открывается без проблем.
7. poyson (poyson) 24.03.14 13:41
Отлично. спасибо. Попробуем сами... Думаю поможет при общении с заказчиками и программерами.
8. Анна Кузнецова (Nefertary) 24.03.14 14:05
Прошу прощения, но :
инжИниринг

А информация полезная, спасибо
9. Alexander Speshilov (speshuric) 24.03.14 14:42
(0) 1. А случайно не исследовалось поведение в кейсах, отличных от "OK 200"? У нашего любимого вендора и здесь иногда сюрпризы могут быть.
2. Интересно было бы попробовать сделать такой сервис на основании Java-интерфейса для административного сервера.
10. Евгений Сосна (pumbaE) 24.03.14 14:59
(9) у меня не получилось завести java интерфейс для администрирования, во всяком случаи то что заявлено в samples не смогло подключиться к кластеру и произвести простейшие действия.
ev-kov; speshuric; +2 Ответить 2
11. Alexander Speshilov (speshuric) 24.03.14 15:09
(10) Печально. Можно через COM, конечно, но так неинтересно - тянуть за собой дистрибутив 1С фактически придётся.
12. Алексей Лустин (lustin) 26.03.14 22:39
(9) speshuric, Такие кейсы пока не исследовал, видимо у тебя есть какой -то особый опыт. На досуге попробую.

Что касается Java интерфейса сервера, ты имеешь ввиду что написать для него proxy сервис ?
13. Алексей Лустин (lustin) 28.03.14 09:34
(10)(11)Посмотрел я на досуге более подробно библиотеки Java для сервиса.
Результатов 2:

1. во-первых они мне не понравились по датам http://1c-dn.com/forum/forum17/topic882/#message3402
2. во вторых обнаружил я протокол который используют для коммуникации между библиотеками и сервисами.

Вот с протоколом оказалась веселая история - он слегка стандартный/нестандартный.
Чуть подробней расскажу попозже.

P.S. Кстати API требует сессий с сервером и поддержки connections. Таким образом простую REST обертку не напишешь, надо еще и жизненным циклом соединений управлять...
14. DAnry (DAnry) 28.03.14 12:26
Спасибо за статью, очень познавательно
15. Дмитрий Шерстобитов (DitriX) 28.03.14 19:23
Теперь осталось дождаться рест на 1с, и пилить еще одну базу, в которую будет все это сыпаться. Видь так?
16. Denis Michaylov (denis_aka_wolf) 31.03.14 07:57
Автору респект! Отличная статья !
17. Алексей Лустин (lustin) 31.03.14 11:47
(15) DitriX, не уверен что именно так. В качестве первого прототипа, можно попробовать, но вынужден заметить - в 1С-вском REST сервисе скорее всего не будет возможности проанализировать HTTP headers.

Имеется ввиду журналирование вызовов данного сервиса - с какого IP, каким пользователем, какая версия тонкого клиента и еще много другой информации. А эта функциональность сервис-менеджерам очень понадобится, особенно в крупном предприятии.
18. А Р (p1l1gr1m) 21.04.14 18:54
Стартер 1С при получении списка баз сейчас умеет авторизовать только по basic авторизации, никто не подскажет - каким образом заставить его использовать NTLM/Kerberos авторизацию?
19. Сергей Бутузов (ЖУДА) 05.06.14 20:15
ахахахх Это Реверс-инжиниринг ? =D
20. Алексей Лустин (lustin) 06.06.14 09:48
(19) ЖУДА, Очень содержательно ;-)

"К пулемёту нет претензий ?" (С) КВН