Работа с хранилищем конфигурации из режима 1С: Предприятие минуя конфигуратор

Публикация № 1249769

Разработка - Групповая разработка - Хранилище

Хранилище конфигурации HTTP API

Описание приемов работы с хранилищем конфигурации 1С из режима 1С: Предприятие минуя конфигуратор. Статья содержит ряд примеров работы с хранилищем по протоколу HTTP, описание "внутренностей", а также демонстрационную обработку

Для чего я это все делал:

Изначально было интересно как же устроено хранилище конфигурации, возможно ли каким-либо образом вытащить из него данные и работать с ними. Стандартные средства работы с хранилищем из конфигуратора есть, но для доступа к данным необходим доступ в конфигуратор, а это не всегда возможно обеспечить. Например, есть потребность у службы технической поддержки посмотреть какие были сделаны изменения в рабочей конфигурации за вчера, чтобы сопоставить с обращениями пользователей. Или для системы учета обращений сопоставить конкретное обращение с изменениями в конфигурации (измененные объекты). Или, наконец, построить банальный отчет по изменениям в конфигурации за период.

Что нам потребуется:

  1. Хранилище конфигурации с доступом по протоколу HTTP
  2. Установленный компонент CAPICOM (как установить описано здесь)
  3. Утилита Network Monitor 

Начнем....

Первое, что я сделал - решил проанализировать трафик, которым обменивались конфигуратор и хранилище конфигурации. Для этой задачи прекрасно подходит инструмент от Microsoft - Network Monitor. Первое, что я увидел - конфигуратор общается с хранилищем через отправку POST запросов в теле которых простой XML. Например, по нажатию кнопки "Обновить" в окне "Администрирование хранилища конфигурации" 1С отправляет запрос следующего вида:

Интересующие нас на данном этапе параметры в секции auth: password и user.

Если с User все понятно - это логин, то с password все оказалось сложнее. Это хэш пароля, но как оказалось, хэш не простой. Я долго не мог понять как он формируется, но в итоге удалось определить, что хэш пароля формируется по алгоритму CAPICOM_HASH_ALGORITHM_MD5.

В ответ на этот запрос сервер хранилища отвечает нам тоже данными в виде XML

 

В итоге, имеем 3 секции:

  1. statMap - информация о версиях
  2. bindInfos - информация о подключениях к хранилищу
  3. users - информация о пользователях хранилища

Уже что-то есть, но нам этого мало. Хотим историю хранилища...

Идем дальше...

Запрос на получение истории хранилища следующий (получил я его так же как и в первом примере)

По авторизации все понятно, остальные параметры я оставлял как есть. Предполагаю, что параметры begindate, enddate, beginvernum и endvernum для фильтрации истории по дате и номерам версий.

Отправив такой запрос мы получим ответ в следующем формате:

Уже интереснее. Мы имеем номер версии, версию платформы (pver...), дату версии, версию конфигурации, а так же метку(комментарий).

Но и это еще не все. Осталось сделать то, ради чего все это делалось - состав изменений. Запрос выглядит следующим образом:

Уже все просто. Помимо авторизации нам необходим параметр verNum - номер версии. Отправляем этот запрос серверу хранилища и получаем ответ:

Вот это именно то, чего я хотел. 

  • Name - наименование объекта
  • action - действие (опытным путем понял, что "0" - Добавление, 1 и 5 - изменение)
  • fullName - полное наименование объекта метаданных, где нечто похожее на ГУИД - это идентификатор родителя (Справочник, документ, форма и т.д.), ниже приведу расшифровку того, что мне удалось расшифровать

    СоответствиеОбъектов.Вставить("9cd510cd-abfc-11d4-9434-004095e12fc7", "Главный блок");
    СоответствиеОбъектов.Вставить("09736b02-9cac-4e3f-b4f7-d3e9576ab948", "Роль");
    СоответсвиеОбъектов.Вставить("24c43748-c938-45d0-8d14-01424a72b11e", "Параметр сеанса");
    СоответствиеОбъектов.Вставить("39bddf6a-0c3c-452b-921c-d99cfa1c2f1b", "Интерфейс");
    СоответствиеОбъектов.Вставить("0fe48980-252d-11d6-a3c7-0050bae0a776", "Общий модуль");
    СоответствиеОбъектов.Вставить("857c4a91-e5f4-4fac-86ec-787626f1c108", "План обмена");
    СоответствиеОбъектов.Вставить("37f2fa9a-b276-11d4-9435-004095e12fc7", "Подсистема");
    СоответствиеОбъектов.Вставить("3e5404af-6ef8-4c73-ad11-91bd2dfac4c8", "Стили");
    СоответствиеОбъектов.Вставить("3e7bfcc0-067d-11d6-a3c7-0050bae0a776", "Критерии отбора");
    СоответствиеОбъектов.Вставить("9cd510ce-abfc-11d4-9434-004095e12fc7", "Язык");
    СоответствиеОбъектов.Вставить("7dcd43d9-aca5-4926-b549-1842e6a4e8cf", "Картинка");
    СоответствиеОбъектов.Вставить("9fcd25a0-4822-11d4-9414-008048da11f9", "Блок");
    СоответствиеОбъектов.Вставить("13134201-f60b-11d5-a3c7-0050bae0a776", "Регистр сведений");
    СоответствиеОбъектов.Вставить("0195e80c-b157-11d4-9435-004095e12fc7", "Константа");
    СоответствиеОбъектов.Вставить("bf845118-327b-4682-b5c6-285d2a0eb296", "Обработка");
    СоответствиеОбъектов.Вставить("bc587f20-35d9-11d6-a3c7-0050bae0a776", "Последовательность");
    СоответствиеОбъектов.Вставить("07ee8426-87f1-11d5-b99c-0050bae0a95d", "Форма");
    СоответствиеОбъектов.Вставить("061d872a-5787-460e-95ac-ed74ea3a3e84", "Документ");
    СоответствиеОбъектов.Вставить("b64d9a40-1642-11d6-a3c7-0050bae0a776", "Регистр накоплений");
    СоответствиеОбъектов.Вставить("36a8e346-9aaa-4af9-bdbd-83be3c177977", "Нумератор документов");
    СоответствиеОбъектов.Вставить("f6a80749-5ad7-400b-8519-39dc5dff2542", "Перечисление");
    СоответствиеОбъектов.Вставить("82a1b659-b220-4d94-a9bd-14d757b95a48", "План видов характеристик");
    СоответствиеОбъектов.Вставить("4612bd75-71b7-4a5c-8cc5-2b0b65f9fa0d", "Журнал документов");
    СоответствиеОбъектов.Вставить("631b75a0-29e2-11d6-a3c7-0050bae0a776", "Отчет");
    СоответствиеОбъектов.Вставить("cf4abea6-37b2-11d4-940f-008048da11f9", "Справочник");
    СоответствиеОбъектов.Вставить("fdf816d2-1ead-11d5-b975-0050bae0a95d", "Форма");
    СоответствиеОбъектов.Вставить("4e828da6-0f44-4b5b-b1c0-a2b3cfe7bdcc", "Подписка на событие");
    СоответствиеОбъектов.Вставить("11bdaf85-d5ad-4d91-bb24-aa0eee139052", "Регламентное задание");     
    СоответствиеОбъектов.Вставить("fdf816d2-1ead-11d5-b975-0050bae0a95d", "Форма");  
    СоответствиеОбъектов.Вставить("0fffc09c-8f4c-47cc-b41c-8d5c5a221d79", "HTTP сервис");

Дальше, в планах получение версии объекта из хранилища, если кого-то заинтересует, опишу и этот функционал.

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

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

Наименование Файл Версия Размер
Работа с хранилищем конфигурации из режима 1С: Предприятие минуя конфигуратор

.epf 15,41Kb
11.06.20
2
.epf 15,41Kb 2 Скачать

Специальные предложения

Вознаграждение за ответ
Показать полностью
Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. -vito- 478 11.06.20 17:31 Сейчас в теме
Круто!
Дальше, в планах получение версии объекта из хранилища, если кого-то заинтересует, опишу и этот функционал

Очень интересно! Подписался.
jaroslav.h; YPermitin; +2 Ответить
2. Yashazz 3251 11.06.20 18:34 Сейчас в теме
Я вот, честно сказать, не очень понял. Лежит у меня, допустим, хранилище на некоем сервере компании, и подключаемся мы с коллегами к нему... И хранилище это, как учит нас теория, по сути пара файлов формата, близкого к файловым SDBL...И вот с чего оно вдруг будет отвечать на рест-запросы? Волшебный компонент "CAPICOM" поможет?

пы.сы. опечатку в "СоответсТвие" поправьте)
3. MaxxG 77 11.06.20 18:49 Сейчас в теме
(2)Спасибо, опечатку поправил.
Хранилище - это не только несколько файлов, но и сервер хранилища конфигураций. Если сервер опубликован по протоколу http, то конфигуратор общается с ним с помощью post запросов. Что я и описал в статье. Компонент capicom необходим лишь для получения хэша пароля.
4. Yashazz 3251 11.06.20 19:01 Сейчас в теме
(3) Вооот) Только вы это упомянуть забыли, как краеугольное условие применения) И невольно создаётся ощущение, что старые-добрые варианты хранилища тоже так тягать можно. О чём я вам аккуратно и напомнил. Пропишите в статье, пожалуйста, во избежание дезориентации читателя, что хранилище-то опубликованное должно быть.

Кстати, вопрос защищённости такого публикования и такого обращения, случайно, не копали? Он слабовато освещён.
5. borodatii 3 12.06.20 01:29 Сейчас в теме
(4) Зная 1С, думаю, всё передаётся в открытом виде, нужно только перехватить трафик между хранилищем и пользователем, чтобы узнать данные для авторизации, а дальше можно делать всё что захочется.
6. MaxxG 77 12.06.20 20:36 Сейчас в теме
(5)Да, все передаётся в открытом виде. Именно это я и описал в статье
7. MaxxG 77 12.06.20 20:40 Сейчас в теме
(4) в начале статьи я описал, что нам потребуется сервер хранилища с доступом по http. Попробую позже более четко сформировать это требование, чтобы ни у кого не возникало вопросов. Трафик никак не защищается и не кодируется. Думаю, что при классическом доступе по tcp ситуация аналогичная, просто при доступе по http примеры более показательны
8. LexBond 12.06.20 20:41 Сейчас в теме
Отличная работа. Как с вами связаться? Мой мейл: bonduser*yandex.ru
12. malikov_pro 341 15.06.20 10:24 Сейчас в теме
(9) Если будет в виде надстройки для nginx на lua, то да, а так неудобно еще один узел разворачивать.
Сейчас на сервере развернуто 4 сервиса под каждый из вариантов клиентов (рарус, scloud, локальные установки клиентов), для каждого добавлять доп сервис неудобно.

(5) Оборачивается в HTTPS nginx-ом например или настроить VPN до сервера с хранилищем OpenVPN RA на pfSense например. При организации по HTTPS дополнительно прикрывать по allow IP.

(0) Если глубоко копали формат обмена, то после какого сообщения запись в базе хранилища сформирована и имеет смысл запускать gitsync например?
13. -vito- 478 15.06.20 12:26 Сейчас в теме
(12)
Если глубоко копали формат обмена, то после какого сообщения запись в базе хранилища сформирована и имеет смысл запускать gitsync например?

Судя по вопросу, Вы хотите выполнять синхронизацию с Git по событию помещения в хранилище.
Я у себя делал подобное с помощью PowerShell-а и планировщика заданий. Скрипт PS, запущенный как служба, при изменении каталога /data Хранилища генерировал событие Windows. А в планировщике настроена задача, срабатывающая по этому событию. Причем срабатывание ставил с задержкой на 5-10 минут, для того, чтобы комментарий к версии Хранилища уже "устаканился". Зачастую разработчики пишут комментарий не сразу при помещении в Хран, а в течение нескольких минут. Или редактируют, например номер задачи дописывают.
14. malikov_pro 341 15.06.20 12:40 Сейчас в теме
(13)
Судя по вопросу, Вы хотите выполнять синхронизацию с Git по событию помещения в хранилище.

Да, именно так. У самого развернуто на ubuntu. Активно использую nginx как обратный прокси, поэтому хотел как дополнение к нему.
Интересно именно помещение изменения, а не изменение БД, чтобы лишних срабатываний не было.

Коммент редактировать после помещения бывает нужно, при автоматике уже "никак".
15. malikov_pro 341 15.06.20 12:42 Сейчас в теме
(13) Усложняется это еще тем что при помещении даже с комментарием и при отсутствии изменения по данным отдельная версия не фиксируется в хранилище (на сколько знаю). По идее и этот вариант нужно обработать.
17. artbear 1185 17.06.20 11:38 Сейчас в теме
(13) подписка на изменение файлов\каталогов для хранилища работает неточно, т.к. хранилище довольно часто меняет свои файлы, даже если разработчик ничего не поменял (
я и многие коллеги за долгие годы используют периодический опрос хранилища и хранилище прекрасно синхронизируется с гитом.
18. -vito- 478 17.06.20 13:47 Сейчас в теме
(17)
подписка на изменение файлов\каталогов для хранилища работает неточно, т.к. хранилище довольно часто меняет свои файлы, даже если разработчик ничего не поменял (
я и многие коллеги за долгие годы используют периодический опрос хранилища и хранилище прекрасно синхронизируется с гитом

Артур, я как раз не хотел использовать периодический опрос. Мне важно было сделать с задержкой после изменения, т.к. я не хотел чтобы периодический опрос, выполнившийся через несколько секунд после помещения, забрал результат с недозаполненным комментарием. Не замечал ложных срабатываний, но даже если они и есть, GitSync тут же, получив список версий, видит что синхронизирована последняя версия и лишних телодвижений не выполняет.
Кстати, если я правильно помню, в материалах курса по инженерным практикам (и вышедшей следом книге), описывалось отслеживание изменений файла БД хранилища. Я отслеживаю не его, а каталог с данными.
10. PerlAmutor 101 14.06.20 17:43 Сейчас в теме
Если пароль преобразовать сначала в UTF-8, убрать оттуда BOM (если есть) и скормить классу "Новый ХешированиеДанных" в виде Двоичных Данных, то MD5 хэш тоже не будет совпадать?
11. MaxxG 77 15.06.20 10:19 Сейчас в теме
(10)Нет, я очень много способов перебрал, прежде чем дошел до компоненты capicom. Различий кодирования просто в MD5 и CAPICOM_HASH_ALGORITHM_MD5 я пока не нашел
16. artbear 1185 17.06.20 11:34 Сейчас в теме
Очень интересный и полезный анализ, спасибо автору!
Оставьте свое сообщение

См. также

Обновление из хранилища по расписанию

Сервисные утилиты Хранилище v8 Абонемент ($m)

Помещаете изменения в хранилище днем, а рабочая база обновляется ночью, не мешая пользователям в течение дня.

5 стартмани

16.08.2019    3581    10    adapter    1