Портал разработчиков

API и интеграции WMS-Bridge: быстрое подключение к 1С:Предприятие 8.3, МойСклад и кастомным WMS

Базовый адрес локального контура — http://127.0.0.1:8501. Идентификатор пространства в примерах — vash_sklad. Каталог этого пространства не смешивается с другими.

Интеграция с 1С через внешнюю обработку .epf

Внешний отчёт или обработка (.epf) подключается за 15 минут. Конфигурация не снимается с типовой поддержки, и обновление вендора не затирает модуль: файл лежит рядом с базой. Команда формы вызывает заполнение табличной части документа «Поступление товаров и услуг».

  1. Шаг 1

    Модуль объекта

    Вставьте текст шаблона в модуль новой внешней обработки и сохраните её как .epf в Конфигураторе.

  2. Шаг 2

    Регистрация

    Администрирование, затем «Печатные формы, отчеты и обработки», затем «Дополнительные отчеты и обработки». Добавьте файл и назначьте его документу поступления.

  3. Шаг 3

    Заполнение строк

    Обработка ищет номенклатуру по штрихкоду или артикулу. Количество, цена и сумма строки документа остаются как в накладной.

Скачать шаблон обработки .epf

Пример вызова из BSL 1C

Фрагмент ниже повторяет рабочий шаблон: JSON со списком наименований уходит на POST /api/preview-normalize. Рабочий контур с файлом .xls или .xlsx использует POST /api/orders/upload и затем GET /api/orders/items.

BSL 1C
// BSL 1C — внешняя обработка .epf для документа «Поступление товаров и услуг».
// Количество, цена и сумма строк не меняются.
// Полный модуль: /integrations/1c/wms_bridge_loader_template.epf.txt

Процедура ИнициализироватьПодключение()
	АдресСервера = "127.0.0.1";
	ПортСервера = 8501;
	ИдентификаторСклада = "vash_sklad";
КонецПроцедуры

Функция ЗаполнитьПоступление(ДокументОбъект) Экспорт
	ИнициализироватьПодключение();
	Ответ = ОтправитьСтрокиНаПроверку(ДокументОбъект.Товары);
	// Применить items[].barcode и items[].article к строкам Товары.
	Возврат Ответ;
КонецФункции

Функция ОтправитьСтрокиНаПроверку(Товары)
	Строки = Новый Массив;
	Для Каждого СтрокаТовара Из Товары Цикл
		Если Строки.Количество() >= 10 Тогда
			Прервать;
		КонецЕсли;
		Наименование = СокрЛП(Строка(СтрокаТовара.Номенклатура));
		Если Не ПустаяСтрока(Наименование) Тогда
			Строки.Добавить(Наименование);
		КонецЕсли;
	КонецЦикла;

	Запись = Новый ЗаписьJSON;
	Запись.УстановитьСтроку();
	Запись.ЗаписатьНачалоОбъекта();
	Запись.ЗаписатьИмяСвойства("lines");
	ЗаписатьJSON(Запись, Строки);
	Запись.ЗаписатьИмяСвойства("domain");
	Запись.ЗаписатьЗначение("furniture");
	Запись.ЗаписатьКонецОбъекта();

	Запрос = Новый HTTPЗапрос("/api/preview-normalize");
	Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
	Запрос.Заголовки.Вставить("X-Tenant-ID", ИдентификаторСклада);
	Запрос.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

	Соединение = Новый HTTPСоединение(АдресСервера, ПортСервера, , , , 30);
	Возврат Соединение.ВызватьHTTPМетод("POST", Запрос);
КонецФункции

Спецификация Headless REST API

POST

/api/orders/upload

Загрузка накладной в сессию

Один файл Excel: .xls или .xlsx, до 50 МБ. Заголовок X-Tenant-ID выбирает пространство. Нужна сессия оператора: Authorization: Bearer либо кука wms_session / session_token. Ответ — сводка total_rows, matched_auto, needs_llm, quarantined, is_anomaly, checksum_ok, tenant_id. CSV и XML этот метод не принимает. Несколько файлов отправляются отдельно на POST /api/orders/process-batch, потолок 50 файлов и 200 МБ.

POST

/api/preview-normalize

Синхронный предпросмотр

JSON {"lines": [...], "domain": "furniture"} либо multipart-поле file. До 10 строк и 2 МБ. Отрасли: furniture, auto, sanitary, electrical, general. Сессия не требуется. В ответе items (source_line, name_1c, article, barcode, level, confidence, cell, quarantined), elapsed_ms и telemetry.catalog = open_demo. Цен и остатков нет. Rate Limiter (P60): 3 запроса в минуту с одного IP.

GET

/api/ready

Зонд готовности ядра

Чистое чтение флага прогрева, без сборки каталога внутри запроса. 200 ready — каталог и векторный индекс построены. 503 warming_up — прогрев ещё идёт. 503 failed — прогрев завершился ошибкой, причина в detail. Поля ответа: status, detail, sku_count, vector_count, version, engine = onnx.

Коды ответов

401, 403, 429 и 503
КодИмяКогда приходит
401UnauthorizedДействительная сессия отсутствует. Возвращается на POST /api/orders/upload без Bearer и без куки сессии. Заголовок WWW-Authenticate: Bearer.
403Tenant ForbiddenBOLA Defense: пространство есть, но принадлежит другому оператору, либо клиент без прав запрашивает системный склад. Мутация каталога Челябинска закрыта тем же кодом.
429Rate Limit ExceededСкользящее окно P60. Для предпросмотра — 3 запроса в минуту, заголовок Retry-After: 60. Повторять запрос до истечения окна не нужно.
503Service UnavailableGET /api/ready в состояниях warming_up и failed. Тот же код у загрузки, если каталог или векторный индекс ядра не подняты: файл накладной при этом не считается повреждённым.

Примеры cURL и Python

Отдельного установочного пакета SDK нет: вызов собирается средствами cURL и стандартной библиотеки Python. Подсветка синтаксиса встроена в разметку страницы.

cURL — POST /api/preview-normalize
curl -sS -X POST "http://127.0.0.1:8501/api/preview-normalize" \
  -H "Content-Type: application/json" \
  -H "X-Tenant-ID: vash_sklad" \
  -d '{"lines":["Петля накладная Boyard"],"domain":"furniture"}'
cURL — POST /api/orders/upload
curl -sS -X POST "http://127.0.0.1:8501/api/orders/upload" \
  -H "X-Tenant-ID: vash_sklad" \
  -H "Authorization: Bearer <session>" \
  -F "file=@invoice.xlsx"
cURL — GET /api/ready
curl -sS "http://127.0.0.1:8501/api/ready"
Python — urllib.request
import json
import urllib.request

payload = {
    "lines": ["Петля накладная Boyard"],
    "domain": "furniture",
}
data = json.dumps(payload, ensure_ascii=False).encode("utf-8")
request = urllib.request.Request(
    "http://127.0.0.1:8501/api/preview-normalize",
    data=data,
    headers={
        "Content-Type": "application/json",
        "X-Tenant-ID": "vash_sklad",
    },
    method="POST",
)
with urllib.request.urlopen(request, timeout=30) as response:
    print(response.read().decode("utf-8"))

Вебхуки

Исходящего вебхука в этом контуре нет. Результат загрузки приходит синхронным телом POST /api/orders/upload. Строки документа читаются последующим GET /api/orders/items в той же сессии.

Тестовый доступ

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

Получить тестовый API-ключ и SDK