Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 сен 2021, 20:29

Получение изменений справочника REST OData

Автор gridmaniac, 27 мая 2017, 19:27

0 Пользователей и 1 гость просматривают эту тему.

gridmaniac

Приветствую, коллеги.
Появилась необходимость синхронизировать справочник Номенклатура с интернет-магазином.
Решил пойти по пути публикации REST сервиса с возможностью взаимодействия по протоколу OData.
В итоге сервис работает, запросы по типу
http://localhost/Demo/odata/standard.odata/Catalog_Номенклатура?$format=json
http://localhost/Demo//odata/standard.odata/Catalog_Контрагенты?$filter=Ref_Key eq guid'fa5a6033-3609-11e5-8af5-94de802c77e4'
работают отлично.

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

Узнал про возможность регистрировать изменения объектов с использованием планов обмена.
Появилась идея периодически обращаться к REST сервису и запрашивать только изменения в справочнике номенклатура, таким образом избавиться от избыточности в отправке данных.

Работаю с планами обмена впервые.
Создал новый план обмена ОбменСВебСервисом.
При создании указал Имя, Синоним и Комментарий.
В состав добавил справочник Номенклатура и Контрагенты.
На всех стоит галочка Авторегистрация: Разрешить.
На вкладке Права добавил права на чтение и Просмотр для Пользователь и АдминистраторККМ.
Далее закрыл окно и нажал кнопку Применить изменения конфигурации.
Скриншоты:
Скриншот 1
Скриншот 2
Скриншот 3

Затем добавил новую запись в справочник Номенклатура.

Теперь пытаюсь получить эти изменения через REST OData.
Следуя документации:

ЦитироватьДля формирования сообщения обмена необходимо выполнить POST-запрос с использованием URL следующего вида:http://host/base/odata/standard.odata/SelectChanges?<params>. Где в качестве параметров необходимо указать следующее:

● Параметр DataExchangePoint – должен содержать канонический URL сущности треуемого элемента плана обмена;
● Параметр MessageNo – должен содержать номер сообщения обмена данными, который будет сформирован в результате данного вызова.

В результате, полный URL для формирования сообщения обмена, будет выглядеть следующим образом:http://host/base/odata/standard.odata/SelectChanges?DataExchangePoint='http://host/base/odata/standard.odata/ExchangePlan_ОбменДанными(guid'value')'&MessageNo=34.

Сразу появился вопрос: что указывать в качестве GUID. Попробовал 00000000-0000-0000-0000-000000000000.
Соответственно пытаюсь отправить POST запрос:

URL: http://localhost/Demo/odata/standard.odata/SelectChanges?
DataExchangePoint: 'http://localhost/Demo/odata/standard.odata/ExchangePlan_ОбменСВебСервисом(guid'00000000-0000-0000-0000-000000000000')';
MessageNo: 34

В итоге сервер обрабатывает запрос длительное время и возвращает TIMEOUT. После этого другие запросы также не работают до перезагрузки Агента Сервера 1С

Если не указывать один параметр, сервер пишет: Не указан обязательный параметр DataExchangePoint.
Думаю, проблема скорее всего в том, что я не до конца понимаю как работает принцип сообщений обмена. К примеру, за что отвечает параметр GUID в данном случае. При использовании фильтрации через OData я использую GUID в качестве Ref_Key. Здесь же по идее используется весь справочник Номенклатура, и требуется получить только список изменений.

Возможно я некорректно создал план обмена.
Буду рад услышать любые советы и критику.

Dethmontt

gridmaniac, после того как ты добавил новый план обмена в конфигураторе, ты добавил возможность программе регистрировать изменения объектов с системе (тех что указаны в составе плана обмена)
План обмена регистрирует изменения на УЗЛЕ (узлы создаются в режиме предприятия) по умолчанию один узел уже есть, предопределенный... Таких узлов может быть много.
Так вот ГУИД нужно указывать именно того узла по которому ты хочешь получить изменения.

И еще один нюанс, на будущее, после удачного обмена ты должен будешь самостоятельно почистить изменения на узле (иначе они будут там копиться и смысла в плане обмена никакого не будет...)
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

gridmaniac

Цитата: Dethmontt от 28 мая 2017, 02:24
gridmaniac, после того как ты добавил новый план обмена в конфигураторе, ты добавил возможность программе регистрировать изменения объектов с системе (тех что указаны в составе плана обмена)
План обмена регистрирует изменения на УЗЛЕ (узлы создаются в режиме предприятия) по умолчанию один узел уже есть, предопределенный... Таких узлов может быть много.
Так вот ГУИД нужно указывать именно того узла по которому ты хочешь получить изменения.

И еще один нюанс, на будущее, после удачного обмена ты должен будешь самостоятельно почистить изменения на узле (иначе они будут там копиться и смысла в плане обмена никакого не будет...)

Большое спасибо за подробный ответ!

Насчет очистки изменений в узле спасибо за совет, по документации как раз идет следующей операцией после успешного обмена.
Если я правильно понял, отдельные узлы необходимы в том случае, когда требуется независимость при обмене с различными системами (чтобы изменения очищались только для определенного узла).

Небольшой вопрос: ГУИД узла можно получить только программным способом?

Dethmontt

Цитата: gridmaniac от 30 мая 2017, 00:41ГУИД узла можно получить только программным способом?
да
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск