Интеграция 1С-Битрикс с системой ЭДО СБИС
СБИС (Тензор) — второй по распространённости ЭДО-оператор в России после Диадока. Ряд крупных поставщиков и госструктур работают именно через СБИС, поэтому интеграция с ним для B2B-площадок часто становится обязательным требованием от конкретных контрагентов. Технически СБИС предоставляет собственное JSON API, отличное от REST-концепции Диадока — с сессионной авторизацией и специфичной структурой запросов.
СБИС API: ключевые особенности
СБИС использует JSONRPC-подобный протокол. Все вызовы идут на единый endpoint:
POST https://online.sbis.ru/service/
С телом в формате:
{
"jsonrpc": "2.0",
"method": "СБИС.АутентифицироватьПоПаролю",
"params": {
"Логин": "[email protected]",
"Пароль": "***"
},
"id": 1
}
Методы называются по-русски. Это нетипично, но стабильно работает — Тензор поддерживает эту нотацию с 2014 года.
Авторизация и сессия
class SbisClient
{
private string $baseUrl = 'https://online.sbis.ru/service/';
private ?string $sid = null; // session id
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']['Документ']['Состояние'] ?? 'Неизвестно';
}
// Варианты статусов СБИС:
// 'Отправлен', 'Доставлен', 'Подписан', 'Отказано', 'Аннулирован'
Кейс: интеграция для поставщика продуктов питания
Оптовый поставщик, работает через несколько ЭДО-операторов одновременно (часть контрагентов — через Диадок, часть — через СБИС, часть — через ЭДО Лайт ФНС). Задача: единый интерфейс в Битрикс для работы со всеми ЭДО без переключения между веб-кабинетами.
Архитектура:
Создан абстрактный класс 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% |
Роуминг между операторами
СБИС поддерживает роуминг с Диадоком и другими операторами. Документ, отправленный через СБИС, доставляется контрагенту в Диадоке автоматически. Это снимает проблему «у нас СБИС, у них Диадок» в большинстве случаев. В коде это означает: один API-вызов к СБИС, доставка прозрачна для отправителя.
Электронные подписи на сервере
СБИС поддерживает облачную подпись через сервис «СБИС Облачная подпись» — сертификат хранится на серверах Тензора, подпись происходит через API без необходимости устанавливать КриптоПро на продакшн-сервере. Это существенно упрощает деплой:
public function signWithCloudCert(string $xmlContent, string $certId): string
{
$result = $this->call('СБИС.ПодписатьОблачнойПодписью', [
'Сертификат' => $certId,
'ДвоичныеДанные' => base64_encode($xmlContent),
]);
return base64_decode($result['result']['ПодписанныеДанные']);
}
Состав работ
- Регистрация в СБИС, получение API-доступа
- Настройка облачной подписи или КриптоПро CSP
- Разработка PHP-клиента СБИС API
- Генерация XML-документов в формате ФНС
- Обработчики событий Битрикс: отправка при смене статуса заказа
- Синхронизация статусов через polling (cron)
- Отображение статуса в карточке заказа
Сроки: базовая интеграция — 3–4 недели. При работе с несколькими ЭДО-операторами через единый интерфейс — 8–12 недель.







