При интеграции 1С с системой «Меркурий» (ВетИС) часто возникает задача сопоставления данных, когда документы оформляются сторонними организациями (например, складами ответственного хранения — СОХ). Основная сложность заключается в том, что записи складского журнала (ЗСЖ) на стороне СОХ и в вашей базе 1С имеют разные идентификаторы, а единственным связующим звеном выступает номер партии. В этой статье мы разберем, как правильно организовать получение данных из «Меркурия» через Vetis.API, почему прямой поиск по номеру партии невозможен и как обойти это ограничение.
Рассмотрим техническую сторону вопроса. Многие разработчики ожидают найти в веб-сервисе операцию типа "НайтиПоПартии", однако в текущей версии Vetis.API (включая v2.1) такой возможности нет. Это обусловлено архитектурой центральной базы данных ВетИС. Номера партий хранятся как массивы неформализованных строк. Организация полнотекстового поиска по таким полям для миллионов записей создала бы колоссальную нагрузку на сервера «Меркурия».
Позиция разработчиков системы ВетИС однозначна: внешние системы должны выкачивать необходимые срезы данных (или изменения) к себе в локальную базу, индексировать их нужным образом и выполнять поиск уже внутри своей инфраструктуры (1С, SQL и т.д.).
Для решения задачи нам потребуется реализовать механизм синхронизации складского журнала. Мы разберем по шагам, какие операции использовать и на что обратить внимание.
1. Выбор правильной операции API
Для работы со складским журналом существуют две основные операции:
GetStockEntryListOperation — получение полного списка текущих записей.GetStockEntryChangesListOperation — получение списка изменений за определенный период.Для первичного наполнения базы 1С мы используем первую операцию, а для последующей актуализации — вторую. Проанализируем параметры фильтрации, которые помогут нам сократить объем передаваемого трафика:
ACTIVE. Это позволит не загружать аннулированные и полностью списанные записи, которые нам не интересны для текущего учета.2. Использование пагинации (постраничного вывода)
Система ВетИС никогда не отдаст вам миллион записей одним пакетом. Ответ всегда ограничен (обычно до 100 или 1000 записей). Чтобы получить весь журнал, необходимо реализовать цикл с использованием структуры listOptions.
Рассмотрим пример логики на стороне 1С (псевдокод):
ТекущийОфсет = 0;
ЛимитЗаписей = 100;
Цикл
Запрос = СоздатьЗапросКВетИС(ЛимитЗаписей, ТекущийОфсет);
Ответ = ОтправитьЗапрос(Запрос);
Если Ответ.Записи.Количество() = 0 Тогда
Прервать;
КонецЕсли;
Для Каждого ЗаписьЖурнала Из Ответ.Записи Цикл
ОбработатьИСохранитьВРегистр(ЗаписьЖурнала);
КонецЦикла;
ТекущийОфсет = ТекущийОфсет + ЛимитЗаписей;
КонецЦикла;
Когда данные попадают в 1С, их необходимо правильно сохранить. В структуре StockEntry (Запись складского журнала) номер партии находится внутри блока batch. Важно помнить, что там может быть массив номеров, если продукция объединялась.
Рекомендуемая структура хранения в 1С:
Создадим регистр сведений ВетИС_СкладскойЖурнал со следующими полями:
batchNumber.Важный нюанс: Если СОХ (склад ответственного хранения) указывает номер партии в текстовом описании продукции, а не в специальном поле batchNumber, автоматизировать связку будет крайне сложно. Перед началом разработки убедитесь, что ваши контрагенты заполняют поле «Номер партии» в Меркурии корректно.
Если номера партий часто дублируются или заполняются некорректно, проанализируем альтернативные способы сопоставления данных, которые предоставляет Vetis.API:
При реализации вызова веб-сервисов Меркурия в 1С следует придерживаться объектной модели работы с XML. Выясним, какие объекты 1С нам понадобятся:
HTTPСоединение или WSПрокси: для непосредственного обращения к шлюзу ВетИС.ФабрикаXDTO: для разбора сложных вложенных структур ответа Меркурия.ЧтениеXML: для эффективной обработки больших объемов данных (использование ЧтениеXML предпочтительнее загрузки всего ответа в память в виде ОбъектXDTO, если записей очень много).Ниже приведен пример формирования простейшего фильтра для запроса списка изменений (концептуально):
Фильтр = Фабрика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, а созданием промежуточного звена в вашей системе. Проанализируем ключевые моменты:
GetStockEntryChangesList — ваш главный инструмент. Настройте регламентное задание в 1С, которое каждые 15-30 минут будет подтягивать изменения.Такой архитектурный подход обеспечит стабильную работу системы даже при больших объемах документооборота и позволит бесшовно связывать ваши складские операции с действиями сторонних складов в системе «Меркурий».