Перейти к содержимому

Интеграция с 1С

Чаще всего у клиентов: 1С:Управление торговлей 11, 1С:ERP, 1С:Комплексная автоматизация, 1С:Бухгалтерия для Казахстана, 1С:УНФ. Есть три пути — от простого к полному.

Путь Что нужно Когда подходит
Файл из 1С ничего, кроме выгрузки в Excel начало работы, пилот — см. Без программиста
Расширение Orda TMS Connector (.cfe) установить расширение, ввести адрес и ключ типовые конфигурации, постоянная работа
Свой обмен через HTTP программист 1С доработанные конфигурации, особые правила

Статус: в разработке (Этап 3). Описание ниже — как оно будет работать.

Расширение ставится без изменения типовой конфигурации (Администрирование → Расширения → Добавить из файла) и не мешает обновлениям 1С.

Что делает:

  1. Настройки: адрес API, API-ключ (хранится в безопасном хранилище 1С), режим «Тест / Бой», склады 1С ↔ склады Orda, какие документы выгружать (Реализация товаров и услуг, Заказ клиента, Расходный ордер на товары).
  2. Справочники: партнёры/контрагенты с адресами доставки → точки доставки Orda (/customers, ключ — externalId = уникальный идентификатор ссылки 1С).
  3. Выгрузка заказов по расписанию (регламентное задание, например каждые 10 минут) и по кнопке «Отправить в Orda» в списке документов: POST /orders/bulk, externalId = идентификатор документа, number = номер документа, вес и объём — из характеристик номенклатуры, сумма к оплате — если оплата при получении.
  4. Обратно: статусы доставки, причины недоставки и номер маршрута — в реквизиты/дополнительные сведения документа; по plan.approved — маршрутный лист с порядком точек.
  5. Журнал обмена в 1С: что ушло, что вернулось, строки с ошибками и их коды.
  • Вебхуки на HTTP-сервис 1С — мгновенно. В 1С создаётся HTTP-сервис (метод POST), база публикуется на веб-сервере (Apache/IIS) по https с доступом из интернета. Orda отправляет события, 1С проверяет подпись и обновляет документ.
  • Опрос — если публиковать базу наружу нельзя: регламентное задание раз в 1–5 минут вызывает GET /orders?date=… (или GET /orders/external/{код}) и обновляет изменившиеся документы.
Функция ОтправитьВOrda(Заказы, КлючПакета) Экспорт
// Заказы — Массив структур с полями externalId, number, deliveryDate, customerExternalId, weightKg ...
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Новый Структура("orders", Заказы));
Тело = Запись.Закрыть();
Соединение = Новый HTTPСоединение("api.ordatms.kz", 443, , , , 60, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/api/v1/orders/bulk");
Запрос.Заголовки.Вставить("X-Api-Key", ПолучитьКлючOrda()); // из безопасного хранилища
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("Idempotency-Key", КлючПакета);
Запрос.УстановитьТелоИзСтроки(Тело, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение СтрШаблон("Orda: %1 %2", Ответ.КодСостояния, Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Возврат ПрочитатьJSON(Чтение); // created, updated, failed, results — записать ошибки в журнал
КонецФункции

В платформе нет готовой функции HMAC — она собирается из ХешированиеДанных (пример для платформы 8.3.11+):

Функция HMAC_SHA256_Hex(Секрет, ТелоДвоичные)
Ключ = ПолучитьДвоичныеДанныеИзСтроки(Секрет, КодировкаТекста.UTF8, Ложь);
Блок = 64;
Если Ключ.Размер() > Блок Тогда
Х = Новый ХешированиеДанных(ХешФункция.SHA256);
Х.Добавить(Ключ);
Ключ = Х.ХешСумма;
КонецЕсли;
БуферКлюча = Новый БуферДвоичныхДанных(Блок);
БуферКлюча.Записать(0, ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Ключ));
Внутр = Новый БуферДвоичныхДанных(Блок);
Внешн = Новый БуферДвоичныхДанных(Блок);
Для i = 0 По Блок - 1 Цикл
Внутр.Установить(i, ПобитовоеИсключительноеИли(БуферКлюча.Получить(i), 54)); // 0x36
Внешн.Установить(i, ПобитовоеИсключительноеИли(БуферКлюча.Получить(i), 92)); // 0x5C
КонецЦикла;
Х = Новый ХешированиеДанных(ХешФункция.SHA256);
Х.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Внутр));
Х.Добавить(ТелоДвоичные);
Промежуточный = Х.ХешСумма;
Х = Новый ХешированиеДанных(ХешФункция.SHA256);
Х.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Внешн));
Х.Добавить(Промежуточный);
Возврат НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Х.ХешСумма));
КонецФункции
// В обработчике POST HTTP-сервиса:
// Подпись = Запрос.Заголовки.Получить("Orda-Signature") → t=...,v1=...
// Данные = ПолучитьДвоичныеДанныеИзСтроки(t + ".") + Запрос.ПолучитьТелоКакДвоичныеДанные()
// (склеить через ПотокВПамяти или СоединитьДвоичныеДанные)
// Сравнить HMAC_SHA256_Hex(Секрет, Данные) с v1, проверить, что t не старше 5 минут,
// ответить 200 и обработать событие (лучше — фоновым заданием).
Orda 1С
externalId Документ.Ссылка.УникальныйИдентификатор()
number Документ.Номер
deliveryDate ДатаОтгрузки / ЖелаемаяДатаОтгрузки
customerExternalId идентификатор партнёра или адреса доставки
address адрес доставки из документа (если точки нет в справочнике)
weightKg, volumeM3 сумма веса/объёма номенклатуры по строкам
amount, paymentType сумма к оплате при получении, форма оплаты
windowFrom, windowTo «Время доставки с/по» из документа

Точное сопоставление настраивается под конфигурацию клиента — это входит в услугу подключения.