Интеграция учетных систем 1С с государственной информационной системой в области ветеринарии ФГИС «Меркурий» (ВетИС) — одна из ключевых задач для предприятий, работающих с подконтрольной продукцией (производство, оптовая и розничная торговля). Разберем доступные варианты интеграции, архитектурные особенности взаимодействия по протоколу ВетИС.API 2.0, а также методы решения типовых проблем с производительностью и блокировками записей складского журнала.
Проанализируем основные подходы к организации обмена данными между 1С и шлюзом ВетИС:
Рассмотрим, как устроена работа со шлюзом ВетИС на низком уровне. Протокол взаимодействия построен на базе SOAP с асинхронной обработкой запросов:
submitApplicationRequest, передавая XML-пакет с телом операции (например, оформление производственной партии, списание, инвентаризация или оформление транспортного ВСД).applicationId).receiveApplicationResultRequest. До момента завершения обработки шлюз возвращает статус IN_PROCESS. По завершении статус меняется на COMPLETED (с результатом операции) или REJECTED (с описанием ошибки).Посмотрим на пример структуры заголовка и тела SOAP-запроса для получения списка ветеринарных документов:
<soapenv:Envelope xmlns:dt="http://api.vetrf.ru/schema/cdm/dictionary/v2"
xmlns:merc="http://api.vetrf.ru/schema/cdm/mercury/g2b/applications/v2"
xmlns:apldef="http://api.vetrf.ru/schema/cdm/application/ws-definitions"
xmlns:apl="http://api.vetrf.ru/schema/cdm/application"
xmlns:vd="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2"
xmlns:bs="http://api.vetrf.ru/schema/cdm/base"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<apldef:submitApplicationRequest>
<apldef:apiKey>КлючДоступаAPI</apldef:apiKey>
<apl:application>
<apl:serviceId>mercury-g2b.service:2.0</apl:serviceId>
<apl:issuerId>ИдентификаторИнициатораGUID</apl:issuerId>
<apl:issueDate>2024-01-15T10:00:00</apl:issueDate>
<apl:data>
<merc:getVetDocumentListRequest>
<merc:localTransactionId>TR-000101</merc:localTransactionId>
<merc:initiator>
<vd:login>ЛогинПользователяВетис</vd:login>
</merc:initiator>
<bs:listOptions>
<bs:count>100</bs:count>
<bs:offset>0</bs:offset>
</bs:listOptions>
<vd:vetDocumentType>TRANSPORT</vd:vetDocumentType>
<vd:vetDocumentStatus>CONFIRMED</vd:vetDocumentStatus>
<dt:enterpriseGuid>GUIDПлощадки</dt:enterpriseGuid>
</merc:getVetDocumentListRequest>
</apl:data>
</apl:application>
</apldef:submitApplicationRequest>
</soapenv:Body>
</soapenv:Envelope>
Важное правило адресации пространств имен: Обратите внимание, что поля типа документа и статуса (vetDocumentType, vetDocumentStatus) должны находиться в пространстве имен http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2 (префикс vd), иначе парсер Oracle Service Bus шлюза вернет ошибку разбора XML BEA-382513: expected exactly one item, got 0 items.
При массовых отгрузках часто возникает критическая ошибка: MERC02462: «В запросе был указан идентификатор записи журнала, которая была обновлена одновременно с попыткой выполнения данной операции».
Выясним причину: система ВетИС версионирует каждую запись складского журнала. При списании части объема создается новая версия записи с новым UUID. Если отправить параллельно несколько запросов на списание объемов из одной и той же исходной партии (например, одна производственная партия разлита по десяткам расходных накладных), все запросы, кроме первого, завершатся ошибкой.
Разберем проверенные алгоритмы устранения этой проблемы:
Реализуем в 1С буферную таблицу (регистр сведений) неотправленных накладных. Фоновое задание анализирует список документов к отправке. Если в очереди есть несколько накладных, списывающих остаток с одной и той же записи складского журнала, система отправляет первую накладную, блокирует отправку остальных документов с этой записью до получения ответа COMPLETED, обновляет актуальный остаток/версию записи в 1С и только затем отправляет следующую накладную.
Перед массовой выпиской рейса можно средствами производственной транзакции или инвентаризации объединить разнородные остатки в одну сводную запись либо, наоборот, сформировать отдельные дочерние записи складского журнала под каждую планируемую ТТН. Это исключает пересечение записей между параллельными потоками отправки.
В структурах данных ВетИС GUID идентифицирует сам объект (партию) на протяжении всего жизненного цикла, а UUID — конкретную ревизию (версию) записи. В операциях оформления транспортных партий по возможности передавайте глобальный GUID партии, что снижает риск рассинхронизации ревизий.
Для корректной работы обмена необходимо настроить структуры данных в учетной системе 1С:
СерииНоменклатуры (или механизм партий) должен хранить:
GUID);Учитывайте уровень полномочий пользователя, под логином которого подписывается транзакция:
Проверить и настроить эти права можно в личном кабинете системы Ветис.Паспорт.
Для стабильной обработки больших объемов документов (более 1000 накладных в сутки) придерживайтесь следующих правил: