Как настроить интеграцию 1С с ГИС Меркурий через ВетИС.API и отправлять SOAP-запросы?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

Интеграция учетной системы 1С с Федеральной государственной информационной системой «Меркурий» (компонент ВетИС) необходима всем организациям, участвующим в обороте подконтрольной госветнадзору продукции. Разберем по шагам архитектуру взаимодействия, структуру SOAP-пакетов, практическую отправку запросов из 1С и способы решения распространенных технических проблем.

Архитектура взаимодействия с сервисом ВетИС.API

Взаимодействие с государственной системой строится на асинхронном протоколе обмена сообщениями. Процесс выполнения любой бизнес-операции (получение списка входящих ВСД, оформление транспортной партии, гашение, инвентаризация) состоит из двух этапов:

  1. Отправка заявки на выполнение операции: клиентское приложение формирует SOAP-пакет submitApplicationRequest с телом конкретной команды и отправляет его на шлюз ApplicationManagementService. В ответ сервис возвращает уникальный идентификатор заявки applicationId со статусом приема.
  2. Получение результата обработки: через определенный интервал времени система отправляет запрос receiveApplicationResultRequest с переданным ранее applicationId. В ответ возвращаются сформированные сущности (эВСД, записи складского журнала) либо список ошибок валидации.

Формирование и отправка HTTP-запроса из 1С

Хотя ВетИС.API использует формат SOAP, импорт WSDL-описания через стандартные WS-ссылки в платформе 1С:Предприятие часто завершается ошибкой «Набор схем не может содержать схемы с одинаковыми целевыми пространствами». Это связано с наличием циклических импортов во внешних XSD-схемах сервиса. Оптимальным и стабильным решением является использование объекта HTTPСоединение с прямой передачей XML-тела.

Рассмотрим пример кода на платформе 1С:Предприятие 8.3 для отправки подготовленного XML-пакета на сервер шлюза:


ПараметрыПодключения = Новый Структура;
ПараметрыПодключения.Вставить("Логин", "login_user");
ПараметрыПодключения.Вставить("Пароль", "password_user");

// Настройка защищенного соединения HTTPS
SSL = Новый ЗащищенноеСоединениеOpenSSL;
Соединение = Новый HTTPСоединение("api2.vetrf.ru", 8002, ПараметрыПодключения.Логин, ПараметрыПодключения.Пароль, , , SSL);

Запрос = Новый HTTPЗапрос("/platform/services/2.0/ApplicationManagementService");
Запрос.Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
Запрос.Заголовки.Вставить("SOAPAction", "submitApplication");

// Устанавливаем сформированное тело SOAP-конверта
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    КодСостояния = Ответ.КодСостояния;
    СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
Исключение
    ВызватьИсключение "Ошибка отправки запроса к ВетИС: " + ОписаниеОшибки();
КонецПопытки;

Пример структуры SOAP-запроса на получение списка ВСД

Проанализируем структуру пакета для операции getVetDocumentListRequest (версия API 2.0). Обратите особое внимание на явное указание пространств имен для каждого узла:


<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Body>
        <submitApplicationRequest xmlns="http://api.vetrf.ru/schema/cdm/application/ws-definitions">
            <apiKey>ВАШ_API_KEY</apiKey>
            <application xmlns="http://api.vetrf.ru/schema/cdm/application">
                <serviceId>mercury-g2b.service:2.0</serviceId>
                <issuerId>1ef8e97f-23f5-4496-a7c0-76a775a4147d</issuerId>
                <issueDate>2024-01-15T12:00:00</issueDate>
                <data>
                    <getVetDocumentListRequest xmlns="http://api.vetrf.ru/schema/cdm/mercury/g2b/applications/v2">
                        <localTransactionId>a9046578-7c02-44d6-93cf-26ca4d5c6b6b</localTransactionId>
                        <initiator xmlns:d7p1="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2">
                            <d7p1:login>login_initiator</d7p1:login>
                        </initiator>
                        <listOptions xmlns="http://api.vetrf.ru/schema/cdm/base"/>
                        <vetDocumentType xmlns="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2">INCOMING</vetDocumentType>
                        <vetDocumentStatus xmlns="http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2">CONFIRMED</vetDocumentStatus>
                        <enterpriseGuid xmlns="http://api.vetrf.ru/schema/cdm/dictionary/v2">452ff3be-bdda-44f5-853e-35cc0f5e03c8</enterpriseGuid>
                    </getVetDocumentListRequest>
                </data>
            </application>
        </submitApplicationRequest>
    </Body>
</Envelope>

Разбор частых ошибок и способов их решения

В процессе разработки интеграции разработчики регулярно сталкиваются с типовыми ошибками валидации сервиса:

  1. Ошибка APLM0002: Unsupported application data format. Возникает, когда структура внутри блока <data> не соответствует целевой схеме операции либо пространство имен узлов указано с ошибкой. Проверьте правильность атрибута serviceId (например, mercury-g2b.service:2.0) и соответствие префиксов вложенных элементов. При отправке через HTTPЗапрос убедитесь, что в начало файла не попадает BOM (Byte Order Mark).
  2. Ошибка MERC02469: Указаны не все обязательные условия перевозки в соответствии с регионализацией. При перемещении товаров между регионами или зонами с различным эпизоотическим статусом требуется обязательное подтверждение условий транспортировки. Перед оформлением операции PrepareOutgoingConsignmentOperation необходимо запросить правила перемещения для пары «площадка отправителя — площадка получателя» и указать в блоке условий (regionalizationCondition) их GUID и признак подтверждения выполнения (applied/fulfilled).
  3. Блокировка остатков при параллельной отгрузке. Если одновременно несколькими потоками отправлять запросы на оформление исходящих ВСД по одной и той же входящей партии (sourceStockEntry), шлюз ВетИС заблокирует запись и вернет ошибку нехватки остатка. Все транзакции списания по конкретной партии должны обрабатываться строго последовательно.

Организация учета партий и сопоставления НСИ

Для корректной работы с ГИС Меркурий в учетной системе 1С необходимо организовать партионный учет продукции:

  1. Хранение идентификаторов: Для каждого хозяйствующего субъекта (ХС), поднадзорной площадки (предприятия) и позиции номенклатуры необходимо хранить их глобальные идентификаторы GUID и версии сущностей UUID. Рекомендуется записывать строковые представления GUID в отдельные реквизиты или регистры сведений с включенным индексированием, так как поиск по внутреннему идентификатору ссылки 1С напрямую в текстах запросов не поддерживается.
  2. Складской журнал и актуализация остатков: Запись складского журнала (Stock Entry) представляет собой неделимый остаток конкретной партии продукции. Для получения актуальных остатков используется операция GetStockEntryListOperation. Для отслеживания изменений и минимизации объемов сетевого трафика целесообразно использовать метод GetStockEntryListChangesOperation, возвращающий только дельту движений за указанный период.
  3. Сопоставление номенклатуры: В системе ВетИС используется 4-уровневый классификатор продукции. Связь собственной номенклатуры предприятия с 4-м уровнем продукции ВетИС («наименование продукции производителя») реализуется по схеме «многие-ко-многим», так как в учетной системе одна номенклатурная позиция может соответствовать разным записям в федеральном реестре.
← На главную