Как получить записи складского журнала (ЗСЖ) из системы Меркурий через Vetis.API и связать их по номеру партии

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

При интеграции 1С с системой «Меркурий» (ВетИС) часто возникает задача сопоставления данных, когда документы оформляются сторонними организациями (например, складами ответственного хранения — СОХ). Основная сложность заключается в том, что записи складского журнала (ЗСЖ) на стороне СОХ и в вашей базе 1С имеют разные идентификаторы, а единственным связующим звеном выступает номер партии. В этой статье мы разберем, как правильно организовать получение данных из «Меркурия» через Vetis.API, почему прямой поиск по номеру партии невозможен и как обойти это ограничение.

Анализ проблемы: почему нельзя найти запись по номеру партии напрямую

Рассмотрим техническую сторону вопроса. Многие разработчики ожидают найти в веб-сервисе операцию типа "НайтиПоПартии", однако в текущей версии Vetis.API (включая v2.1) такой возможности нет. Это обусловлено архитектурой центральной базы данных ВетИС. Номера партий хранятся как массивы неформализованных строк. Организация полнотекстового поиска по таким полям для миллионов записей создала бы колоссальную нагрузку на сервера «Меркурия».

Позиция разработчиков системы ВетИС однозначна: внешние системы должны выкачивать необходимые срезы данных (или изменения) к себе в локальную базу, индексировать их нужным образом и выполнять поиск уже внутри своей инфраструктуры (1С, SQL и т.д.).

Реализация стратегии получения данных

Для решения задачи нам потребуется реализовать механизм синхронизации складского журнала. Мы разберем по шагам, какие операции использовать и на что обратить внимание.

1. Выбор правильной операции API

Для работы со складским журналом существуют две основные операции:

  1. GetStockEntryListOperation — получение полного списка текущих записей.
  2. GetStockEntryChangesListOperation — получение списка изменений за определенный период.

Для первичного наполнения базы 1С мы используем первую операцию, а для последующей актуализации — вторую. Проанализируем параметры фильтрации, которые помогут нам сократить объем передаваемого трафика:

2. Использование пагинации (постраничного вывода)

Система ВетИС никогда не отдаст вам миллион записей одним пакетом. Ответ всегда ограничен (обычно до 100 или 1000 записей). Чтобы получить весь журнал, необходимо реализовать цикл с использованием структуры listOptions.

Рассмотрим пример логики на стороне 1С (псевдокод):


ТекущийОфсет = 0;
ЛимитЗаписей = 100;
Цикл
    Запрос = СоздатьЗапросКВетИС(ЛимитЗаписей, ТекущийОфсет);
    Ответ = ОтправитьЗапрос(Запрос);
    
    Если Ответ.Записи.Количество() = 0 Тогда
        Прервать;
    КонецЕсли;
    
    Для Каждого ЗаписьЖурнала Из Ответ.Записи Цикл
        ОбработатьИСохранитьВРегистр(ЗаписьЖурнала);
    КонецЦикла;
    
    ТекущийОфсет = ТекущийОфсет + ЛимитЗаписей;
КонецЦикла;

Структура данных и поиск по номеру партии

Когда данные попадают в 1С, их необходимо правильно сохранить. В структуре StockEntry (Запись складского журнала) номер партии находится внутри блока batch. Важно помнить, что там может быть массив номеров, если продукция объединялась.

Рекомендуемая структура хранения в 1С:

Создадим регистр сведений ВетИС_СкладскойЖурнал со следующими полями:

Важный нюанс: Если СОХ (склад ответственного хранения) указывает номер партии в текстовом описании продукции, а не в специальном поле batchNumber, автоматизировать связку будет крайне сложно. Перед началом разработки убедитесь, что ваши контрагенты заполняют поле «Номер партии» в Меркурии корректно.

Дополнительные критерии связки (помимо партии)

Если номера партий часто дублируются или заполняются некорректно, проанализируем альтернативные способы сопоставления данных, которые предоставляет Vetis.API:

  1. Связь через входящий ВСД (sourceVsdGuid): Каждая запись складского журнала в Меркурии «знает», на основании какого ВСД она была создана. Если у вас есть GUID входящего электронного ветеринарного сертификата, вы можете однозначно найти соответствующую ему запись в журнале.
  2. Производственная транзакция: Если продукция только что произведена, в записи журнала будет ссылка на производственную транзакцию (GUID).
  3. Глобальный идентификатор продукции (GTIN): Если вы и СОХ работаете с маркированным товаром, GTIN в паре с номером партии дает почти 100% точность сопоставления.

Особенности реализации на платформе 1С

При реализации вызова веб-сервисов Меркурия в 1С следует придерживаться объектной модели работы с XML. Выясним, какие объекты 1С нам понадобятся:

Ниже приведен пример формирования простейшего фильтра для запроса списка изменений (концептуально):


Фильтр = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2", "StockEntryListFilter"));
Фильтр.entryStatus = "ACTIVE";
Фильтр.lastUpdateDate = ТекущаяДата() - 86400; // За последние сутки

СписокОпций = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://api.vetrf.ru/schema/cdm/base", "ListOptions"));
СписокОпций.count = 100;
СписокОпций.offset = 0;

Подведение итогов и рекомендации

Подводя итог, можно сказать, что задача «найти ЗСЖ по номеру партии» решается не одним запросом к API, а созданием промежуточного звена в вашей системе. Проанализируем ключевые моменты:

Такой архитектурный подход обеспечит стабильную работу системы даже при больших объемах документооборота и позволит бесшовно связывать ваши складские операции с действиями сторонних складов в системе «Меркурий».

← На главную