В процессе автоматизации печати счетов на оплату в 1С:Управление торговлей 11 многие разработчики сталкиваются с тем, что сгенерированные QR-коды по стандарту ГОСТ Р 56042-2014 ведут себя непредсказуемо. В одних случаях банковское приложение «подхватывает» все данные, включая сумму, а в других — поля остаются пустыми, заставляя клиента вводить данные вручную. Давайте разберем, почему это происходит и как минимизировать риск возникновения таких ошибок.
Первое, что необходимо понять: парсинг QR-кода происходит на стороне банковского приложения, а не на стороне 1С. Разные банки используют разные библиотеки для распознавания кодов. Сбербанк, например, применяет достаточно строгую логику валидации, которая может отклонять данные или требовать дополнительные поля в зависимости от региона, типа счета или даже внутренних антифрод-фильтров.
На основе анализа проблемных ситуаций выделим несколько ключевых факторов, которые вызывают сбои при считывании кода:
LastName и FirstName. Хотя эти поля не являются обязательными согласно стандарту ГОСТ, логика приложения может требовать их для идентификации плательщика.Purpose (назначение платежа), может приводить к ошибке парсинга всей строки.SomeNewReq, может стабилизировать чтение кода, а их отсутствие — приводить к ошибке на стороне специфических версий приложений.Чтобы привести ваши QR-коды к «читабельному» стандарту, пройдем по следующим этапам оптимизации.
Если сумма не подставляется, попробуйте дополнить структуру вашего QR-кода данными о покупателе. Даже если они не заполнены в явном виде, наличие пустых или формальных тегов может изменить поведение парсера:
// Пример структуры QR-кода с добавлением параметров плательщика
СтрQR = "ST00012|Name=ИП Иванов|PersonalAcc=40802810655160000000|BankName=СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК|BIC=044030653|CorrespAcc=30101810500000000653|Sum=15000|Purpose=Оплата по заказу|PayeeINN=781100730000|LastName=Покупатель|FirstName=Клиент";
Попробуйте добавить параметр SomeNewReq, если используете специфические настройки интеграции, это иногда помогает «сбросить» ошибки валидации в некоторых версиях ПО.
Очистим строку Purpose от всех «лишних» символов. Проанализируем пример: если в 1С формируется текст «Оплата по заказу клиента №КО-4745», попробуйте программно заменить «№» и кириллицу, если это допустимо. Используйте простой алгоритм для подготовки строки перед конкатенацией в общую строку QR-кода:
Функция ПодготовитьНазначениеПлатежа(ТекстНазначения)
// Удаляем спецсимволы, которые могут сбить парсер
Результат = СтрЗаменить(ТекстНазначения, "№", "N");
Результат = СтрЗаменить(Результат, "«", "");
Результат = СтрЗаменить(Результат, "»", "");
Возврат Результат;
КонецФункции
Всегда проверяйте итоговый код через валидаторы, предоставляемые банками. Сбербанк предоставляет страницу для проверки структуры QR-кода, где можно увидеть, какие именно поля распознаются как «ОК», а какие вызывают ошибку. Если сервис выдает ошибку, значит, структура строки нарушена или кодировка UTF-8 содержит недопустимые символы или BOM (Byte Order Mark).
ST00012 -> реквизиты получателя -> сумма -> назначение -> прочие данные.Purpose лишней информацией. Банковскому приложению достаточно знать номер заказа и факт оплаты.Альфа-Банке, но «ломаться» в Сбербанке. Если проблема возникает только в одном приложении, это подтверждает гипотезу о специфической логике парсинга на их стороне.Используя эти методы, мы сможем добиться максимальной совместимости ваших QR-кодов с большинством банковских приложений, обеспечив комфортную оплату для ваших клиентов.