Создание XML‑файлов для интеграции с Честным Знаком: пошаговый гайд для IT‑отделов

Подробный пошаговый гайд по созданию XML‑файлов для интеграции с сервисом Честный Знак: от выбора формата до отправки запросов через True API и отладки.

Когда и зачем использовать XML вместо CSV

Внутренние системы, такие как 1С, MyWarehouse и другие ERP‑решения, часто работают с иерархическими данными: товары, их характеристики, склады, цены, налоги. CSV‑формат ограничивается плоской таблицей, где каждое поле – простая строка. При попытке перенести такие структуры в CSV приходится «раскладывать» их по нескольким файлам или использовать сложные конкатенации, что приводит к ошибкам и потере семантики.

Создание XML‑файлов для интеграции с Честным Знаком: пошаговый гайд для IT‑отделов

XML решает эти проблемы благодаря:

КритерийCSVXML
Иерархия данныхОтсутствуетПоддерживается вложенными элементами
Явные типы и атрибутыТолько строкиМожно задавать типы, атрибуты, схемы
Валидация по схемеНетXSD/Schematron позволяют проверять структуру заранее
Поддержка электронных подписейТолько в виде отдельного файлаВстроенные элементы для УКЭП

Для интеграции с сервисом «Честный Знак» это особенно важно: система требует строгой структуры, проверяемой по XSD, а также возможность подписать документ цифровой подписью. XML‑файлы позволяют выполнить обе задачи без дополнительных преобразований.

Полноценная автоматизация через API

API «Честного Знака» принимает запросы в виде XML‑сообщений. Когда данные уже находятся в XML‑формате, их можно отправлять напрямую, минуя промежуточные конвертации. Это снижает нагрузку на серверы, ускоряет обработку и упрощает логирование. Автоматический генератор XML в вашей системе может формировать документ за пару секунд, после чего скрипт отправляет его через HTTPS‑запрос.

Пример типовой структуры запроса:

<Request> <Header> <SenderID>1234567890</SenderID> <Timestamp>2025-03-15T10:20:30Z</Timestamp> </Header> <Body> <ProductList> <Product> <SKU>ABC-001</SKU> <Name>Товар 1</Name> <Price>1999.99</Price> </Product> </ProductList> </Body> </Request>

Сгенерированный файл сразу готов к отправке, а при возникновении ошибки система получит полностью валидный ответ с указанием причины.

Поддержка электронных подписей (УКЭП)

Электронная подпись в XML реализуется с помощью стандарта XML Signature (XAdES). Это позволяет подписать отдельный элемент (обычно ) без изменения остального документа. При встраивании подписи система «Честный Знак» проверяет её целостность и подлинность, что упрощает аудит и соблюдение требований законодательства о работе с электронными документами.

Процесс подписи выглядит так:

  1. Генерируется исходный XML-файл.
  2. С помощью криптографии создаётся хэш нужного узла.
  3. Хэш подписывается закрытым ключом вашей организации.
  4. Подпись добавляется в элемент согласно XAdES.

После этого файл считается юридически значимым и может быть отправлен без дополнительных действий.

Совместимость с 1С, МойСклад, ERP

Большинство популярных бухгалтерских и складских систем поддерживают экспорт в XML, часто с готовыми шаблонами, соответствующими требованиям ФЗ о маркировке. При построении интеграции стоит использовать:

  • Типовые XSD‑схемы, предоставляемые «Честным Знаком», чтобы гарантировать корректность структуры.
  • Маппинг полей из 1С (например, объект → ) через встроенный механизм обработки данных.
  • Автоматическую проверку подписей и валидности через встроенные в ERP‑модули валидаторы XML.

Таким образом, внедрение XML‑обмена упрощает процесс согласования данных, уменьшает количество ручных операций и повышает надёжность передачи информации между вашими системами и сервисом «Честный Знак».

Структура XML‑запроса для заказа кодов

Элементы &lt;Order&gt; и &lt;Product&gt;

В запросе на присвоение GTIN‑кодов основной контейнер — &lt;Order&gt;. Он задает метаданные всей заявки: идентификатор заказа, дату создания, контактные данные организации‑продавца. Каждый товар, для которого требуется код, описывается отдельным элементом &lt;Product&gt; внутри &lt;Order&gt;. Такая иерархия позволяет системе Честного Знаком быстро сопоставить запросы и сформировать ответы по каждому товару.

Пример минимального шаблона:

<Order id=“ORD-2025-001” date=“2025-03-15”> <Seller> <Name>ООО “Пример"1234567890 <Name>Товар A</Name> <Quantity>100</Quantity> <Price>199.99</Price> </Product> </Products> </Order>

Указание GTIN, количества, цены

Для каждого &lt;Product&gt; необходимо предоставить три обязательных атрибута:

  • Quantity — общее количество единиц, подлежащих маркировке. Система учитывает этот параметр при распределении диапазонов GTIN.
  • Price — рекомендованная розничная цена. Она используется в аналитических отчётах и при проверке корректности маркировки.
  • GTIN — поле оставляется пустым в запросе; после обработки он будет заполнен присвоенным кодом.

Если у товара есть несколько вариантов (размер, цвет), каждый вариант оформляется отдельным элементом &lt;Product&gt; с собственным набором параметров.

Подпись заявки с помощью УКЭП

Для гарантии подлинности и целостности XML‑запроса требуется цифровая подпись, получаемая посредством Устройства Криптографической Элементной Подписи (УКЭП). Процесс выглядит так:

  1. Сформировать XML‑документ согласно структуре, описанной выше.
  2. Подписать документ с помощью программного обеспечения УКЭП, которое добавит элемент &lt;Signature&gt; в корневой узел &lt;Order&gt;.
  3. Проверить корректность подписи с помощью встроенного валидатора, предоставляемого сервисом Честного Знаком.

Подпись подтверждает, что запрос исходит от уполномоченного представителя организации и не был изменён после отправки.

ЭлементОбязательностьНазначение
<Order>ДаКонтейнер всей заявки, содержит метаданные и подпись.
<Product>ДаОписывает отдельный товар, для которого требуется GTIN.
<Quantity>ДаКол‑во единиц товара в заявке.
<Price>ДаРекомендованная розничная цена.
<Signature>ДаЦифровая подпись УКЭП, подтверждающая аутентичность.

Визуальный пример готовой структуры запроса показан на изображении ниже.

Отправка XML через True API и обработка ответа

Аутентификация OAuth2

Для работы с True API требуется получить токен доступа по протоколу OAuth2. На этапе интеграции обычно используется «Client Credentials Grant», при котором ваш клиент (приложение) передаёт client_id и client_secret в специальный endpoint авторизации.

Иллюстрация

Пример запроса (cURL):

curl -X POST https://api.chestnyznakom.ru/oauth2/token \ -d “grant_type=client_credentials” \ -d “client_id=ВАШ_CLIENT_ID” \ -d “client_secret=ВАШ_CLIENT_SECRET”

Ответ – JSON‑объект, в котором находится поле access_token. Токен действителен ограниченный период, после истечения срока его необходимо обновлять тем же запросом.

POST‑запрос к endpoint /orders

После получения токена вы можете отправлять сформированный XML‑файл в метод /orders. Тело запроса – сам XML, а в заголовках указываются:

  • Authorization: Bearer &lt;access_token&gt;
  • Content-Type: application/xml

Пример кода на Python с использованием requests:

 import requests

url = “https://api.chestnyznakom.ru/orders" headers = { “Authorization”: f"Bearer {access_token}”, “Content-Type”: “application/xml” } with open(“order.xml”, “rb”) as f: xml_data = f.read()

response = requests.post(url, headers=headers, data=xml_data) print(response.status_code) print(response.text)

Если запрос прошёл успешно, сервер вернёт XML‑ответ, в котором будет информация о статусе обработки заказа.

Разбор XML‑ответа и запись статусов в БД

Полученный от API XML содержит один или несколько элементов &lt;order&gt; с атрибутами order_id и status. Для дальнейшей работы их следует распарсить и записать в базу данных, чтобы система могла отслеживать состояние каждой заявки.

Ниже представлена простая таблица сопоставления кодов статуса из API с внутренними статусами вашего проекта:

Код из APIОписаниеВнутренний статус
ACCEPTEDЗаказ принят в обработкуВ обработке
REJECTEDЗаказ отклонён (нарушение формата, отсутствие обязательных полей)Ошибка
COMPLETEDЗаказ успешно интегрирован в Честный ЗнакомГотов

Пример кода на PHP, использующего SimpleXML и PDO для записи статусов:

$xml = simplexml_load_string($responseBody); $db = new PDO(‘pgsql:host=localhost;dbname=integration’, ‘user’, ‘pass’);

foreach ($xml->order as $order) { $stmt = $db->prepare(” INSERT INTO orders_status (order_id, api_status, internal_status, updated_at) VALUES (:order_id, :api_status, :internal_status, NOW()) ON CONFLICT (order_id) DO UPDATE SET api_status = EXCLUDED.api_status, internal_status = EXCLUDED.internal_status, updated_at = EXCLUDED.updated_at “);

$statusMap = \[
    'ACCEPTED'   => 'В обработке',
    'REJECTED'   => 'Ошибка',
    'COMPLETED'  => 'Готов'
\];

$apiStatus = (string)$order\['status'\];
$internalStatus = $statusMap\[$apiStatus\] ?? 'Неизвестно';

$stmt->execute(\[
    ':order\_id'       => (string)$order\['order\_id'\],
    ':api\_status'     => $apiStatus,
    ':internal\_status'=> $internalStatus
\]);

}

После выполнения этих шагов ваш сервис будет получать статус каждого заказа в реальном времени и обновлять его в базе, что избавит бизнес‑пользователей от ручного контроля и ускорит обработку заявок.

Тестирование и отладка XML‑интеграции

Валидация схемы XSD

Первый шаг в проверке готового XML‑файла – убедиться, что он полностью соответствует XSD‑схеме, предоставленной Честным Знаком. На практике достаточно использовать любой онлайн‑валидатор или встроенный в IDE плагин. При валидации важно обратить внимание на:

Пример

  • корректность пространств имён (namespace)
  • соответствие типов данных (например, xs:date — YYYY‑MM‑DD)
  • наличие обязательных атрибутов и элементов

Пример минимального валидного фрагмента:

<Customer xmlns=“http://www.chestnymznak.ru/schema"> <LegalName>ООО “Пример”</LegalName> <INN>7701234567</INN> <RegistrationDate>2025-01-15</RegistrationDate> </Customer>

Если валидатор возвращает ошибки, их следует исправлять сразу, иначе система Честного Знаком отклонит файл на этапе приёма.

Тестовые запросы в sandbox‑окружении

После успешной валидации файл отправляют в тестовую (sandbox) среду. Здесь проверяется не только синтаксис, но и бизнес‑логика: согласованность данных, уникальность идентификаторов и корректность расчётов.

Типичный сценарий тестовой отправки выглядит так:

  1. Сгенерировать XML‑файл согласно XSD.
  2. Отправить запрос через HTTP POST на эндпоинт https://sandbox.cheznakaz.ru/api/xml (адрес указывается в технической документации).
  3. Получить ответ‑сообщение в формате XML, где в элементе &lt;Status&gt; указано SUCCESS или ERROR, а в &lt;Message&gt; – детальное пояснение.

Пример ответа при ошибке:

<Response> <Status>ERROR</Status> <Message>Элемент <INN> не соответствует формату 10‑12 цифр</Message> </Response>

В sandbox‑режиме можно свободно экспериментировать, менять структуру и проверять реакцию системы без риска блокировки реального аккаунта.

Логирование ошибок и автоматический retry

Надёжный процесс интеграции подразумевает автоматическое сохранение всех запросов и ответов. Это помогает быстро находить причину отклонения и устранять её без повторного ручного ввода.

ПолеОписаниеПример значения
TimestampДата и время отправки запроса (UTC)2025-03-12T14:27:36Z
RequestIDУникальный идентификатор запроса (UUID)e8f1c2d9‑3a4b‑4c6d‑a9f5‑b2c1d3e4f567
StatusРезультат обработкиERROR
ErrorCodeКод ошибки, описанный в справочнике Честного Знаком1003
MessageТекстовое описание проблемыОтсутствует обязательный элемент <LegalName>

Для автоматического повторного выполнения (retry) рекомендуется внедрить простую стратегию:

  • Повторить запрос не более 3 раз;
  • Увеличивать интервал ожидания между попытками экспоненциально (например, 5 сек → 15 сек → 45 сек);
  • Логировать каждый retry с указанием причины (тайм‑аут, 5xx‑ошибка сервера и т.п.).

Таким образом, даже если в момент отправки возникнет временная недоступность сервиса, система сама справится с восстановлением обмена без вмешательства оператора.

Вопросы и ответы

Почему XML предпочтительнее CSV для обмена данными с сервисом «Честный Знак»?

XML поддерживает вложенную иерархию, типизацию и встроенные подписи, что требуются сервисом для проверки структуры и юридической силы документа, тогда как CSV ограничивается плоской таблицей строк.

Как добавить электронную подпись (УКЭП) в XML‑запрос?

После генерации XML‑файла необходимо использовать программное обеспечение УКЭП, которое вычислит хэш выбранного узла (обычно &lt;Body&gt;) и вставит элемент &lt;Signature&gt; согласно стандарту XML Signature (XAdES).

Какие обязательные элементы должны присутствовать в запросе &lt;Order&gt;?

Обязательны элементы &lt;Order&gt;, &lt;Seller&gt;, &lt;Products&gt; с вложенными &lt;Product&gt;, а внутри каждого продукта – &lt;Quantity&gt;, &lt;Price&gt; и пустой &lt;GTIN&gt;. Также требуется элемент &lt;Signature&gt; для подписи.

Как получить токен доступа OAuth2 для работы с True API?

Отправьте POST‑запрос на https://api.chestnyznakom.ru/oauth2/token с параметрами grant_type=client_credentials, client_id и client_secret. В ответе будет поле access_token, которым следует авторизоваться при последующих запросах.

Что делать, если сервер возвращает статус 500 при отправке XML‑запроса?

Включите механизм автоматического повторения (retry) – до 3 попыток с экспоненциальным увеличением задержки (5 сек → 15 сек → 45 сек) и логируйте каждую попытку. При повторных ошибках обратитесь в техподдержку сервиса.

Как проверить соответствие сформированного XML XSD‑схеме?

Используйте онлайн‑валидатор или встроенный в IDE плагин, указывая путь к XSD, предоставленному «Честным Знаком». Обратите внимание на namespace, типы данных и наличие всех обязательных элементов.

Какие коды статуса возвращает API и как их интерпретировать?

API может вернуть ACCEPTED (заказ принят – внутренний статус «В обработке»), REJECTED (ошибка формата – внутренний статус «Ошибка») и COMPLETED (успешная интеграция – внутренний статус «Готов»). Эти значения сохраняются в базе для отслеживания.

Где хранить лог запросов и ответов для последующего аудита?

Создайте таблицу логов с полями Timestamp, RequestID, Status, ErrorCode, Message и сохраняйте туда полностью XML‑запросы и ответы. Это упрощает поиск причин отклонения и отвечает требованиям контроля.

Статьи по схожей тематике