Настройка работы с маркировкой Честный Знак на 1С-Битрикс
Обязательная маркировка товаров в системе «Честный Знак» затрагивает интернет-магазины на Битриксе, торгующие лекарствами, табаком, обувью, одеждой, молочной продукцией и рядом других категорий. Техническая сторона задачи: получать коды маркировки от поставщиков, хранить их в системе и передавать в ГИС МТ (ИС «Честный Знак») при продаже.
Интеграция через модуль 1С + Битрикс
Стандартный путь для большинства интернет-магазинов: учёт маркированных товаров ведётся в 1С, Битрикс выступает витриной. Синхронизация через штатный модуль обмена bitrix:catalog.import.1c (CommerceML).
При таком подходе коды маркировки (Data Matrix) хранятся в 1С, передаются в Битрикс вместе с остатками через XML-выгрузку. В XML CommerceML поля для кодов маркировки не стандартизированы — их передают как дополнительные реквизиты товара:
<ЗначениеРеквизита>
<Наименование>КодМаркировки</Наименование>
<Значение>010460406000600021N4N57RSCBUZTJZ</Значение>
</ЗначениеРеквизита>
В Битриксе настраиваете свойство каталога MARKING_CODE и маппинг реквизита в настройках обмена.
Прямая интеграция с API Честного Знака
Для интернет-магазинов, работающих напрямую с ГИС МТ без 1С, нужна прямая интеграция через API markirovka.nalog.ru. API использует OAuth2 авторизацию с УКЭП (квалифицированная электронная подпись).
Основные методы API, которые затрагивает e-commerce:
-
POST /api/v3/facade/identifyDocument— проверка кода маркировки -
POST /api/v3/facade/send— уведомление о выводе товара из оборота при продаже
В Битриксе реализуете сервисный класс для работы с API:
namespace Local\MarkingCode;
class ChestnyZnakClient {
private string $apiUrl = 'https://markirovka.nalog.ru/api/v3';
private \Bitrix\Main\Web\HttpClient $http;
public function verifyCode(string $code): array {
$this->http->setHeader('Authorization', 'Bearer ' . $this->getToken());
$response = $this->http->post($this->apiUrl . '/facade/identifyDocument', ['code' => $code]);
return json_decode($response, true);
}
}
Токен получаете через УКЭП — это требует криптографической библиотеки (КриптоПро CSP) на сервере.
Хранение кодов маркировки в Битриксе
Каждый экземпляр товара имеет уникальный код маркировки. Хранение в свойстве элемента каталога (b_iblock_element_prop_m*) не подходит — у одного товара сотни экземпляров с разными кодами.
Создаёте отдельную таблицу через ORM D7:
class MarkingCodeTable extends \Bitrix\Main\Entity\DataManager {
public static function getTableName() { return 'b_local_marking_code'; }
public static function getMap() {
return [
new \Bitrix\Main\Entity\IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new \Bitrix\Main\Entity\IntegerField('PRODUCT_ID'),
new \Bitrix\Main\Entity\StringField('CODE', ['size' => 200]),
new \Bitrix\Main\Entity\StringField('STATUS'), // 'active', 'sold', 'returned'
new \Bitrix\Main\Entity\DatetimeField('CREATED_AT'),
];
}
}
При продаже товара (событие OnSaleOrderPaid) меняете статус кода с active на sold и отправляете уведомление в ГИС МТ.
Вывод из оборота при продаже
При успешной оплате заказа нужно уведомить систему маркировки о выводе товара из оборота. Это асинхронная операция — не блокируйте процесс оформления заказа ожиданием ответа от API.
Реализуйте через агент или очередь: при OnSaleOrderPaid записываете задачу в собственную таблицу b_local_marking_queue, агент с интервалом 1 минута обрабатывает очередь и отправляет запросы в ГИС МТ.







