Обмен с 1С и Excel через API

Наиболее часто задаваемые вопросы службе технической поддержки Spider Project, подсказки, советы.
Правила форума
Данный раздел является информационным. Темы создают только специалисты компании Spider Project.

Re: Обмен с 1С и Excel через API

Сообщение Peter » 22 июн 2021, 15:57

Описание API см. здесь: http://www.spiderproject.ru/api/
Если будут вопросы - пишите в форум.

Форма в 1с - обычная.
В Excel достаточно разобраться с модулем DemoSource. Остальные модули служебные.
-----
Вложения
Excel_Api_Get.zip
Версия 24.06.2021 18:07
(42.81 КБ) Скачиваний: 391
1С_Обмен со Спайдером.zip
Версия 23.07.2021 14:28
(6.94 КБ) Скачиваний: 437
Excel_Api_Send.zip
Версия 27.08.2021 14:00
(44.76 КБ) Скачиваний: 364
Последний раз редактировалось Peter 23 июн 2022, 14:25, всего редактировалось 4 раз(а).
Peter
 
Сообщения: 76
Зарегистрирован: 14 фев 2015, 20:27

Re: Обмен с 1С и Excel через API

Сообщение Peter » 07 июл 2021, 12:13

Краткий ликбез для неопытных пользователей Excel VBA (Visual Basic for Applications)

Для обмена со Спайдером используется текстовый протокол JSON. Он использует пары “ключ”:“значение”. Вот пример:
{"ключ1":"openFile", "ключ2":"значение"}

Значения могут быть сложными:
{ "docHandle" : 45718736, "ключ3" : { "Code" : "1km_road", "ключ4" : 1}}

К сожалению, в VBA Excel нет стандартных средств для обмена по JSON, поэтому решения могут быть разными.
В принципе, JSON-строки для запроса можно собрать “вручную”, с помощью строковых операций. Но это нудно, и легко ошибиться с балансом скобок. Гораздо удобнее использовать словари (Dictionary). Словарь хранит пары “ключ”-“значение” - как раз то, что нужно. Если значение сложное, то это будет вложенный словарь, или коллекция (Collection) для массивов.

Разберем пример. Откройте окно с VBA (Alt + F11). По умолчанию отображается не тот код, который нам интересен. Найдите в дереве проекта модуль DemoSource и откройте его. На остальной код можно вообще не смотреть.
Процедура Main начинается с инициализации. Проект в строке "FileName =…" замените на любой свой.

Затем заполняются словари. Чтобы сократить объем рутинного кода предусмотрены функции для создания словарей с одной, двумя и тремя парами “ключ”-“значение”: NewD1, NewD2 и NewD3.
При запросе таблицы можно указать коды нужных колонок (иначе вернуться все видимые). Как узнать коды? В Спайдере в свойствах колонки есть поле “Код колонки”.
Когда главный словарь заполнен параметрами команды, его нужно преобразовать в JSON-строку (сериализовать). Это выглядит так:
S = JS.ConvertToJson(D)

Для передачи сформированной строки используется объект Http. Внутри он использует библиотеку WinHttp.WinHttpRequest.5.1, но знать это необязательно. Вот как выглядит вызов:
Set Result = Http.Post(S, Txt)

Параметр Txt (выходной) - необязательный, он содержит ответ в текстовом виде, это бывает полезно при отладке.
Разобрать полученную JSON-строку не так просто. Есть решения, которые делают это чисто на VBA (https://github.com/VBA-tools/VBA-JSON), но там слишком большой объем кода. Да и быстродействие, скорее всего, не очень.
В данном примере используется библиотека MSScriptControl.ScriptControl, но знать это тоже не обязательно. Вот как выглядит получение простого значения (а структуру ответа мы знаем из документации):
Handle = JS.GetVal(Result, "docHandle")

Для сложных объектов (в примере – массив) используется JS.GetObj. Для GetObj обязательно использовать слово Set:
Set Arr = JS.GetObj(Result, "array")

Далее массив перебирается с помощью оператора For Each и лист заполняется полученными данными.
Peter
 
Сообщения: 76
Зарегистрирован: 14 фев 2015, 20:27

Re: Обмен с 1С и Excel через API

Сообщение Peter » 27 июл 2022, 13:50

Дополнение к примерам на Excel

Если использовать 64-х разрядную версию Excel, то при создании экземпляра MSScriptControl.ScriptControl возникает ошибка “Class not registered “
Решение можно найти здесь (первая ссылка ссылается на вторую)
http://stiven76.blogspot.com/2017/01/1- ... tered.html
https://osergey.ru/ru/call-32-bit-com-o ... /#more-508

В статьях упоминается сервер 1С, но 1С тут не при чем. Нужно проделать ровно то, что написано, и ошибка исчезнет.
Peter
 
Сообщения: 76
Зарегистрирован: 14 фев 2015, 20:27

Re: Обмен с 1С и Excel через API

Сообщение Peter » 14 июн 2023, 18:58

Более простой метод избавиться от ошибки “Class not registered “

Вместо Microsoft Script Control можно использовать Tablacus Script Control 64. Он работает отлично.
https://tablacus.github.io/scriptcontrol_en.html

Скачайте zip-файл, установка там тривиальная. После установки в тексте модуля VBA “JsonClass” замените строку
Set ScriptEngine = CreateObject("MSScriptControl.ScriptControl") 'New ScriptControl
на строку
Set ScriptEngine = CreateObject("ScriptControl")

Всё.
Peter
 
Сообщения: 76
Зарегистрирован: 14 фев 2015, 20:27


Вернуться в Часто задаваемые вопросы (ЧаВо), полезные советы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron