Переход на асинхронную модель взаимодействия с системой «Меркурий» (ВетИС.API) является необходимым шагом при больших объемах отгрузок. Однако разработчики часто сталкиваются с непредсказуемым поведением шлюза: зависанием заявок, дублями документов и непонятными системными ошибками. В этой статье мы подробно разберем, как построить надежный механизм обмена, проанализируем причины возникновения ошибок 504 Gateway Timeout и APLM12, а также выработаем оптимальную стратегию обработки ответов.
Рассмотрим ситуацию: ваша система отправляет запрос на оформление транспортного ВСД и получает в ответ HTTP-статус 504 Gateway Timeout. Ошибка 504 означает, что прокси-сервер (шлюз ВетИС) не дождался ответа от внутреннего прикладного сервера системы за отведенное время.
Важный нюанс: статус 504 не является подтверждением того, что запрос отклонен. В архитектуре ВетИС это «неопределенное состояние». Если запрос успел дойти до прикладного сервера и попасть в очередь, он будет обработан, даже если клиент получил тайм-аут. Если в этот момент отправить повторный запрос с новым локальным идентификатором, система создаст второй (дублирующий) ВСД.
Проанализируем правильный алгоритм действий при получении 504 ошибки:
applicationId.getServiceDecision или getProcessChanges, передав туда тот же applicationId.Ошибка с кодом APLM12 часто ставит разработчиков в тупик, так как описание в документации обычно сводится к фразе «Системная ошибка». На практике она возникает в следующих случаях:
Выясним причину появления этой ошибки в вашем коде. Если вы используете многопоточную отправку, попробуйте временно перевести систему в однопоточный режим по конкретной площадке (Enterprise Service GUID). Как показывает опыт, ВетИС стабильнее работает, когда запросы от одного отправителя идут последовательно, а не параллельно.
Длительное нахождение тикета в статусе IN_PROCESS — это нормальная ситуация для периодов пиковой нагрузки (утренние часы пик). Посмотрим на пример эффективной настройки таймингов, которая позволяет избежать лишней нагрузки на шлюз и исключить ошибки:
IN_PROCESS, используйте экспоненциальную задержку. Например: 5 секунд, 15 секунд, 30 секунд, затем раз в минуту.Главным инструментом идемпотентности в ВетИС является applicationId. Рассмотрим, как правильно его использовать в коде 1С. При формировании XML-запроса вы генерируете уникальный GUID для каждой транзакции. Этот GUID должен быть жестко привязан к документу-основанию (например, к РеализацияТоваровУслуг) в вашей базе данных.
Если в процессе обмена произошел сбой (сетевая ошибка, 504, падение сеанса 1С), при повторной попытке отправки обязательно используйте тот же самый applicationId, который был сгенерирован в первый раз. В этом случае ВетИС поймет, что это повтор старой заявки, и просто вернет уже существующий результат, не создавая новый документ.
Пример логики обработки (псевдокод):
Если НЕ ЗначениеЗаполнено(Объект.ИдентификаторЗаявкиВетИС) Тогда
Объект.ИдентификаторЗаявкиВетИС = Новый УникальныйИдентификатор();
КонецЕсли;
ЗапросXML = СформироватьЗапросОформленияВСД(Объект, Объект.ИдентификаторЗаявкиВетИС);
РезультатОтправки = ОтправитьЗапросНаШлюз(ЗапросXML);
Если РезультатОтправки.СтатусКод = 504 Тогда
// Запускаем механизм проверки по ИдентификаторЗаявкиВетИС через некоторое время
РегистрироватьНеобходимостьПроверкиСтатуса(Объект);
КонецЕсли;
Бывают ситуации, когда 1С отправила запрос, шлюз его принял, но в момент записи ответа произошел критический сбой базы данных. В итоге в 1С нет GUID тикета, а ВСД в «Меркурии» уже создан. Рассмотрим, как найти «потеряшку»:
Используйте метод getUnitShipmentList. Сформируйте запрос по следующим фильтрам:
reference.Проанализировав список полученных документов, вы сможете найти нужный ВСД, получить его GUID и привязать к документу в 1С, восстановив целостность данных.
Для стабильной работы асинхронного обмена придерживайтесь следующих правил:
applicationId до момента получения финального ответа (успех или логическая ошибка).APLM12 делайте паузу в 10–15 минут перед повторным опросом этого конкретного тикета.Следуя этим рекомендациям, вы сможете построить отказоустойчивую систему взаимодействия с ВетИС, которая будет корректно обрабатывать даже самые сложные ситуации на стороне шлюза.