Интеграция 1С-Битрикс с системой ЭДО СБИС
Компания теряет до 80% времени сотрудников на ручной ввод документов в веб-кабинет СБИС. Один наш клиент — оптовый поставщик продуктов — тратил 15 минут на создание каждого документа. При 500 заказах в месяц это 125 часов работы одного менеджера. После интеграции с Битрикс документы уходят автоматически при смене статуса заказа. Технически СБИС (Тензор) предоставляет собственный JSONRPC-протокол, отличный от REST-концепции Диадока. Для интеграции потребуется PHP-клиент с сессионной авторизацией, поддержкой облачной подписи и обработкой роуминга. Ниже — как это реализовать и избежать типовых ошибок.
Выбор СБИС часто вынужденный — если контрагент использует только этого оператора. Но интеграция окупается: снижается время обработки заказов, исчезают ошибки ручного ввода. Мы провели более 50 интеграций с ЭДО и накопили типовые решения. Средняя экономия за год составляет 1,8 млн руб., а при объёме от 1000 документов в месяц — до 3 млн руб. на операционных расходах.
Как работает API СБИС?
СБИС использует JSONRPC-подобный протокол. Все вызовы идут на единый endpoint POST https://online.sbis.ru/service/ с телом в формате:
{
"jsonrpc": "2.0",
"method": "СБИС.АутентифицироватьПоПаролю",
"params": {
"Логин": "[email protected]",
"Пароль": "***"
},
"id": 1
}
Методы называются по-русски. Это нетипично, но стабильно работает — Тензор поддерживает эту нотацию много лет.
Работа с API: авторизация, отправка и статусы
Авторизация и сессия
class SbisClient
{
private string $baseUrl = 'https://online.sbis.ru/service/';
private ?string $sid = null;
public function __construct(
private string $login,
private string $password,
private string $inn
) {}
public function authenticate(): void
{
$response = $this->call('СБИС.АутентифицироватьПоПаролю', [
'Логин' => $this->login,
'Пароль' => $this->password,
]);
$this->sid = $response['result'];
}
public function call(string $method, array $params): array
{
$payload = [
'jsonrpc' => '2.0',
'method' => $method,
'params' => $params,
'id' => uniqid(),
];
$headers = ['Content-Type: application/json; charset=utf-8'];
if ($this->sid) {
$headers[] = 'X-SBISSessionID: ' . $this->sid;
}
$ch = curl_init($this->baseUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
]);
$body = curl_exec($ch);
return json_decode($body, true);
}
}
Сессия хранится в Redis/APC и переиспользуется. При истечении (обычно 24 часа) — автоматическая реавторизация.
Отправка документа
public function sendDocument(\Bitrix\Sale\Order $order): string
{
$document = [
'Документ' => [
'Тип' => 'ДокОтгрВх',
'Дата' => date('d.m.Y'),
'Номер' => (string)$order->getId(),
'Сумма' => $order->getPrice(),
'НДС' => $this->calculateVat($order),
'Контрагент' => [
'ИНН' => $this->getOrderInn($order),
'КПП' => $this->getOrderKpp($order),
],
'Вложение' => [[
'Имя' => "UPD_{$order->getId()}.xml",
'ДвоичныеДанные' => base64_encode($this->generateXml($order)),
]],
],
];
$result = $this->call('СБИС.ОтправитьДокумент', ['Документ' => $document]);
return $result['result']['Идентификатор'] ?? '';
}
Структура документа в СБИС отличается от Диадока — названия полей по-русски, но логика та же: XML с подписью КЭП + метаданные.
Получение статусов
public function getDocumentStatus(string $documentId): string
{
$result = $this->call('СБИС.ПолучитьДокумент', [
'Идентификатор' => $documentId,
]);
return $result['result']['Документ']['Состояние'] ?? 'Неизвестно';
}
Возможные статусы: 'Отправлен', 'Доставлен', 'Подписан', 'Отказано', 'Аннулирован'. Для наглядности сведём их в таблицу.
| Статус | Описание |
|---|---|
| Отправлен | Документ передан в СБИС, ожидает обработки |
| Доставлен | Документ получен контрагентом |
| Подписан | Контрагент подписал документ (ЭДО завершён) |
| Отказано | Контрагент отказался от подписания |
| Аннулирован | Отправка отменена (до подписания) |
Облачная подпись и роуминг
СБИС поддерживает облачную подпись через сервис «СБИС Облачная подпись» — сертификат хранится на серверах Тензора, подпись происходит через API без необходимости устанавливать КриптоПро на продакшн-сервере. Это существенно упрощает деплой. Облачная подпись выполняется вызовом метода СБИС.ПодписатьОблачнойПодписью, куда передаются идентификатор сертификата и xml-содержимое. Облачная подпись сокращает время развёртывания интеграции в 2 раза по сравнению с настройкой КриптоПро CSP.
СБИС поддерживает роуминг с Диадоком и другими операторами. Документ, отправленный через СБИС, доставляется контрагенту в Диадоке автоматически. Это снимает проблему «у нас СБИС, у них Диадок» в большинстве случаев. В коде это означает: один API-вызов к СБИС, доставка прозрачна для отправителя.
Как настроить интеграцию за 3 шага?
- Получить доступ к API СБИС. Убедитесь, что тариф включает ЭДО, и получите логин/пароль от аккаунта.
-
Реализовать PHP-клиент. Используйте приведённый выше класс
SbisClient— он покрывает аутентификацию, отправку и статусы. -
Привязать к событиям Битрикс. Навесьте обработчик на смену статуса заказа (например,
OnSaleOrderSaved) для автоматической отправки.
Этот базовый сценарий занимает 3–4 недели с учётом отладки. При необходимости добавьте обработку облачной подписи и роуминга.
Кейс из практики: интеграция для поставщика продуктов питания
Наш клиент — оптовый поставщик продуктов — работал через несколько ЭДО-операторов одновременно (часть контрагентов — через Диадок, часть — через СБИС, часть — через ЭДО Лайт ФНС). Задача: единый интерфейс в Битрикс для работы со всеми ЭДО без переключения между веб-кабинетами.
Архитектура:
Создан абстрактный класс EdoProvider с методами send(), getStatus(), getList(). Реализации: DiadokProvider, SbisProvider, FnsEdoProvider. Выбор провайдера — через реестр, ключ — BoxId контрагента.
interface EdoProviderInterface
{
public function send(\Bitrix\Sale\Order $order, string $recipientId): string;
public function getStatus(string $documentId): EdoStatus;
public function cancel(string $documentId, string $reason): bool;
}
При создании заказа система автоматически определяет ЭДО-оператора контрагента через общий справочник. Менеджер видит в карточке заказа Битрикс единый блок «Документы ЭДО» независимо от того, через какого оператора работает контрагент.
Результаты:
| Показатель | До | После |
|---|---|---|
| Операторов ЭДО в работе | 3 (переключение вручную) | 3 (единый интерфейс) |
| Время создания документа | 15 мин/заказ | Автоматически при смене статуса |
| Ошибки маршрутизации | ~8%/мес | 0% |
| Затраты на документооборот | 120 000 руб./мес | 30 000 руб./мес |
Для каждого провайдера реализован свой формат XML-документа. СБИС требует русскоязычные названия тегов, Диадок — английские. Преобразование выполняется в адаптере. Статусы синхронизируются по расписанию cron каждые 10 минут.
Что входит в работу?
- Регистрация в СБИС, получение API-доступа
- Настройка облачной подписи или КриптоПро CSP
- Разработка PHP-клиента СБИС API
- Генерация XML-документов в формате ФНС
- Обработчики событий Битрикс: отправка при смене статуса заказа
- Синхронизация статусов через polling (cron)
- Отображение статуса в карточке заказа
- Документация и обучение менеджеров
- Поддержка после запуска (2 недели)
Сроки ориентировочно
Базовая интеграция с одним оператором — 3–4 недели. При работе с несколькими ЭДО-операторами через единый интерфейс — 8–12 недель. Стоимость рассчитывается индивидуально после анализа ваших процессов.
Какие ошибки возникают при интеграции?
- Неправильный выбор оператора. Если контрагент использует другой ЭДО, необходимо настроить роуминг. СБИС поддерживает его с большинством операторов, но список нужно проверять.
- Отсутствие повторных попыток. API может временно не отвечать — добавляйте retry с экспоненциальной задержкой.
- Истечение сессии. Сессия СБИС живёт 24 часа — реализуйте автоматическую реавторизацию.
Преимущества интеграции под ключ
Мы выполнили более 50 интеграций с различными ЭДО, работаем с Битрикс более 10 лет. Ваш проект получит готовое решение с гарантией стабильности и поддержкой. Свяжитесь с нами для оценки вашего проекта. Закажите интеграцию под ключ — получите единый интерфейс для всех ЭДО без головной боли.







