Как исправить ошибки проверки подписи при выгрузке документов в «Честный Знак» из 1С 7.7?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

Интеграция системы «Честный Знак» (ГИС МТ) с платформой 1С 7.7 является сложной технической задачей из-за несовместимости современных стандартов шифрования и веб-протоколов с возможностями устаревшей платформы. Ошибки «33: Проверка электронной подписи не пройдена» и «02: ИНН не соответствует данным текущего участника» являются наиболее распространенными при попытке отправить документ «Вывод из оборота». Разберем подробно, почему возникают эти ошибки и как реализовать корректную подпись и передачу данных.

Причина ошибки 33: Особенности кодировки UTF-8 и BOM

Одной из самых неочевидных причин отказа в проверке подписи является наличие маркера последовательности байтов (BOM) в JSON-файле. Большинство современных текстовых редакторов и стандартные методы сохранения в 1С 7.7 при выборе кодировки UTF-8 добавляют в начало файла три служебных байта (EF BB BF). Система «Честный Знак» воспринимает их как часть данных, из-за чего хеш-сумма документа при проверке на сервере не совпадает с хешем, зашифрованным в подписи.

Для решения этой проблемы проанализируем способ сохранения файла. Нам необходимо использовать объект ADODB.Stream, который позволяет записывать данные без BOM. Рассмотрим пример реализации на языке 1С 7.7 с использованием COM-объекта:


// Пример функции для сохранения текста в UTF-8 без BOM
Процедура СохранитьВUTF8БезBOM(Текст, ИмяФайла)
    Stream = СоздатьОбъект("ADODB.Stream");
    Stream.Type = 2; // adTypeText
    Stream.Charset = "utf-8";
    Stream.Open();
    Stream.WriteText(Текст);
    
    // Переходим в начало, чтобы пропустить BOM
    Stream.Position = 0;
    Stream.Type = 1; // adTypeBinary
    Stream.Position = 3; // Пропускаем первые 3 байта (BOM)
    
    БинарныеДанные = Stream.Read();
    
    Stream.Close();
    Stream.Open();
    Stream.Write(БинарныеДанные);
    Stream.SaveToFile(ИмяФайла, 2); // adSaveCreateOverWrite
    Stream.Close();
КонецПроцедуры

Именно такой подход гарантирует, что «Честный Знак» получит «чистый» JSON, который пройдет сверку контрольной суммы.

Корректная подготовка Base64 и удаление переносов строк

Согласно стандартам передачи данных в JSON-формате для ГИС МТ, и сам документ, и его подпись должны быть закодированы в Base64. Однако здесь кроется еще одна ловушка. Стандартные функции кодирования (особенно в утилите cryptcp или старых библиотеках) могут добавлять символы переноса строки (CR/LF) через каждые 64 или 76 символов для удобства чтения человеком.

Важный момент: API «Честного Знака» требует, чтобы строка Base64 передавалась как единый непрерывный блок. Любой лишний символ переноса внутри строки подписи приведет к ошибке 33. Проанализируем, как очистить строку перед отправкой:


// Очистка строки Base64 от переносов строк
Функция ОчиститьBase64(СтрBase64)
    Результат = СтрЗаменить(СтрBase64, Симв(10), ""); // LF
    Результат = СтрЗаменить(Результат, Симв(13), ""); // CR
    Возврат Результат;
КонецФункции

Использование консольной утилиты cryptcp для формирования подписи

Если работа через CAPICOM или CAdESCOM в 1С 7.7 вызывает сложности или ошибки регистрации библиотек, наиболее надежным способом остается использование консольной утилиты cryptcp от КриптоПро. Однако важно использовать правильные флаги. Для ГИС МТ требуется отсоединенная (detached) подпись в формате CAdES-BES.

Рассмотрим структуру команды для корректного подписания файла:

cryptcp.exe -sign -cadessign -detached -thumbprint [ОТПЕЧАТК_СЕРТИФИКАТА] -der [ПУТЬ_К_JSON] [ПУТЬ_К_ФАЙЛУ_ПОДПИСИ]

Разберем параметры подробнее:

  1. -sign: команда на подписание.
  2. -cadessign: создание подписи формата CAdES (обязательно для Честного Знака).
  3. -detached: создание открепленной подписи (файл подписи отдельно от данных).
  4. -der: сохранение в бинарном формате. Это предотвращает искажение подписи из-за неверной интерпретации текстовых кодировок консолью.

Ошибка 02: ИНН не соответствует данным участника

Если вы уверены, что подпись технически верна, но получаете ошибку 02, причина может заключаться в логических несоответствиях:

Особенности объемно-сортового учета (ОСУ) в 1С 7.7

При выводе из оборота продукции, подлежащей ОСУ (например, молочная продукция или упакованная вода), структура документа отличается от поэкземплярного учета. Вместо списка кодов маркировки (ki) необходимо заполнять блок товаров с указанием gtin и count.

Поскольку интерактивная загрузка таких файлов через личный кабинет может быть ограничена, использование API становится единственным выходом. Выясним структуру товарной позиции для ОСУ:


// Пример структуры позиции в JSON для ОСУ
"products_list": [
    {
        "gtin": "04601234567890",
        "count": 10,
        "is_not_labeled": false
    }
]

Важно следить за актуальностью схем ГИС МТ, так как формат vvod_out (вывод из оборота) периодически обновляется. Использование WinHTTP.WinHTTPRequest.5.1 для отправки запроса позволяет гибко управлять заголовками, что необходимо для передачи токена авторизации и корректного Content-Type: application/json.

Заключение и рекомендации

Для успешной работы в 1С 7.7 с Честным Знаком мы рекомендуем придерживаться следующего алгоритма:

  1. Формируйте тело JSON строго в соответствии со схемой ГИС МТ.
  2. Сохраняйте файл в UTF-8 без BOM через ADODB.Stream.
  3. Подписывайте файл утилитой cryptcp с флагом -cadessign.
  4. Считывайте полученный файл подписи (.sig или .p7s) как бинарный поток, переводите в Base64 и обязательно удаляйте символы переноса строки.
  5. Отправляйте данные через WinHTTP, проверяя код ответа сервера (201 — успех).

Если быстро реализовать подпись на стороне 7.7 не получается, рассмотрите вариант использования промежуточного звена — небольшой внешней компоненты или скрипта на VBScript/PowerShell, который будет принимать файл и возвращать готовую строку подписи в нужном формате.

← На главную