Интеграция системы «Честный Знак» (ГИС МТ) с платформой 1С 7.7 является сложной технической задачей из-за несовместимости современных стандартов шифрования и веб-протоколов с возможностями устаревшей платформы. Ошибки «33: Проверка электронной подписи не пройдена» и «02: ИНН не соответствует данным текущего участника» являются наиболее распространенными при попытке отправить документ «Вывод из оборота». Разберем подробно, почему возникают эти ошибки и как реализовать корректную подпись и передачу данных.
Одной из самых неочевидных причин отказа в проверке подписи является наличие маркера последовательности байтов (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, который пройдет сверку контрольной суммы.
Согласно стандартам передачи данных в JSON-формате для ГИС МТ, и сам документ, и его подпись должны быть закодированы в Base64. Однако здесь кроется еще одна ловушка. Стандартные функции кодирования (особенно в утилите cryptcp или старых библиотеках) могут добавлять символы переноса строки (CR/LF) через каждые 64 или 76 символов для удобства чтения человеком.
Важный момент: API «Честного Знака» требует, чтобы строка Base64 передавалась как единый непрерывный блок. Любой лишний символ переноса внутри строки подписи приведет к ошибке 33. Проанализируем, как очистить строку перед отправкой:
// Очистка строки Base64 от переносов строк
Функция ОчиститьBase64(СтрBase64)
Результат = СтрЗаменить(СтрBase64, Симв(10), ""); // LF
Результат = СтрЗаменить(Результат, Симв(13), ""); // CR
Возврат Результат;
КонецФункции
Если работа через CAPICOM или CAdESCOM в 1С 7.7 вызывает сложности или ошибки регистрации библиотек, наиболее надежным способом остается использование консольной утилиты cryptcp от КриптоПро. Однако важно использовать правильные флаги. Для ГИС МТ требуется отсоединенная (detached) подпись в формате CAdES-BES.
Рассмотрим структуру команды для корректного подписания файла:
cryptcp.exe -sign -cadessign -detached -thumbprint [ОТПЕЧАТК_СЕРТИФИКАТА] -der [ПУТЬ_К_JSON] [ПУТЬ_К_ФАЙЛУ_ПОДПИСИ]
Разберем параметры подробнее:
-sign: команда на подписание.-cadessign: создание подписи формата CAdES (обязательно для Честного Знака).-detached: создание открепленной подписи (файл подписи отдельно от данных).-der: сохранение в бинарном формате. Это предотвращает искажение подписи из-за неверной интерпретации текстовых кодировок консолью.Если вы уверены, что подпись технически верна, но получаете ошибку 02, причина может заключаться в логических несоответствиях:
"inn": "1234567890"), а не как число. 1С 7.7 при формировании текста JSON может автоматически убирать ведущие нули или форматировать число как 1.23E+9, что недопустимо.При выводе из оборота продукции, подлежащей ОСУ (например, молочная продукция или упакованная вода), структура документа отличается от поэкземплярного учета. Вместо списка кодов маркировки (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 с Честным Знаком мы рекомендуем придерживаться следующего алгоритма:
ADODB.Stream.cryptcp с флагом -cadessign..sig или .p7s) как бинарный поток, переводите в Base64 и обязательно удаляйте символы переноса строки.WinHTTP, проверяя код ответа сервера (201 — успех).Если быстро реализовать подпись на стороне 7.7 не получается, рассмотрите вариант использования промежуточного звена — небольшой внешней компоненты или скрипта на VBScript/PowerShell, который будет принимать файл и возвращать готовую строку подписи в нужном формате.