Как исправить ошибку «Отсутствует обязательный параметр: values» при POST-запросе в маркировку «Честный Знак»

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

При интеграции систем 1С с государственной информационной системой маркировки товаров (ГИС МТ «Честный Знак») разработчики часто сталкиваются со специфическим поведением API. Одним из наиболее популярных и важных методов является получение информации о кодах маркировки (КИ/КМ) через метод /api/v3/true-api/cises/list. При попытке отправить этот запрос стандартным способом разработчики нередко получают ошибку 400 Bad Request со следующим содержанием:

{"error_message": "Отсутствует обязательный параметр: values"}

В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем особенности проектирования True API и приведем готовый, протестированный шаблон кода на языке 1С для успешного выполнения запроса.

В чем причина ошибки? Выясняем суть проблемы

Классическая логика веб-служб предполагает, что HTTP-запросы разделяются по своему назначению. Запросы типа GET передают параметры непосредственно в адресной строке (URL), а запросы типа POST — внутри тела запроса (Request Body). Метод True API /api/v3/true-api/cises/list является гибридным и нарушает этот стандартный паттерн. Он имеет метод отправки POST, но все целевые коды маркировки ожидает получить исключительно в качестве параметров строки запроса (Query Parameters), то есть в самом URL. Для интерактивного тестирования и проверки отправки подобных запросов подойдёт консоль HTTP-запросов для управляемых форм.

Посмотрим на пример ошибочной логики, которую часто используют на начальном этапе:


// ОШИБОЧНЫЙ ВАРИАНТ
запрос = Новый HTTPЗапрос("/api/v3/true-api/cises/list");
запрос.УстановитьТелоИзСтроки("?values=" + ИдентификаторКода);

При таком подходе веб-сервер «Честного Знака» не находит обязательный параметр values в адресе URL и возвращает ошибку 400, игнорируя переданное тело запроса.

Кроме того, распространенной ошибкой является ручная установка HTTP-заголовка Content-Length. В платформе 1С этот заголовок вычисляется и устанавливается автоматически при отправке запроса. Ручное указание длины содержимого часто приводит к расхождениям (особенно при работе с кодировкой UTF-8, где один символ может занимать более одного байта), что также ломает структуру пакета.

Пошаговое решение проблемы в 1С

Разберем по шагам, как правильно спроектировать HTTP-запрос в 1С для работы с методом /cises/list.

Шаг 1. Формирование строки запроса с параметрами. Нам необходимо собрать адрес ресурса, содержащий все проверяемые коды маркировки в качестве параметров. Параметры должны следовать после вопросительного знака и разделяться амперсандом (&). Например: /api/v3/true-api/cises/list?values=Код1&values=Код2.

Шаг 2. Исключение ручного заполнения тела запроса. Метод должен отправляться как POST (с использованием метода ОтправитьДляОбработки() объекта HTTPСоединение), но тело запроса мы оставляем пустым.

Шаг 3. Отказ от ручной установки длины контента. Удалим из кода строки, устанавливающие заголовок Content-Length, и доверим это платформе 1С.

Рассмотрим правильный пример реализации функции отправки запроса на сервер маркировки:


&НаСервере
Функция ЗапроситьИнформациюОКодахНаСервере(МассивКодовМаркировки) Экспорт
    
    // Адрес тестового или промышленного контура ГИС МТ
    СерверМаркировки = "int01.gismt.crpt.tech"; 
    
    // Формируем параметры запроса из массива кодов
    МассивПараметров = Новый Массив;
    Для Каждого ТекущийКод Из МассивКодовМаркировки Цикл
        // Добавляем каждый код как отдельный параметр "values"
        МассивПараметров.Добавить(СтрШаблон("values=%1", ТекущийКод));
    КонецЦикла;
    
    // Объединяем параметры через символ "&"
    СтрокаПараметров = СтрСоединить(МассивПараметров, "&");
    АдресРесурса = СтрШаблон("/api/v3/true-api/cises/list?%1", СтрокаПараметров);
    
    // Создаем защищенное соединение SSL
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
    Соединение = Новый HTTPСоединение(СерверМаркировки, , , , , , ЗащищенноеСоединение); 
    
    // Создаем HTTP-запрос
    Запрос = Новый HTTPЗапрос(АдресРесурса);
    
    // Устанавливаем необходимые заголовки авторизации и типов данных
    ТокенАвторизации = ПараметрыСеанса.мрТекущийТокенПодписи; // Получите актуальный токен авторизации
    Запрос.Заголовки.Вставить("Authorization", СтрШаблон("Bearer %1", ТокенАвторизации));
    Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");    
    Запрос.Заголовки.Вставить("Accept", "application/json");
    
    Попытка
        ИмяФайлаОтвета = ПолучитьИмяВременногоФайла("json");
        // Отправляем POST запрос (ОтправитьДляОбработки выполняет POST-запрос)
        Ответ = Соединение.ОтправитьДляОбработки(Запрос, ИмяФайлаОтвета);
        
        Если Ответ.КодСостояния = 200 Тогда
            Возврат ИмяФайлаОтвета;
        Иначе
            ВызватьИсключение СтрШаблон("Ошибка сервера ГИС МТ. Код ответа: %1", Ответ.КодСостояния);
        КонецЕсли;
        
    Исключение
        ЗаписатьЛогОшибки(ОписаниеОшибки());
        Возврат "";
    КонецПопытки;
    
КонецФункции

Важные технические нюансы и ограничения API

Для того чтобы ваше решение работало стабильно в реальных условиях эксплуатации (на «боевой» базе), необходимо учесть несколько важных архитектурных ограничений ГИС МТ.

1. Обязательное кодирование спецсимволов (URL Encoding). Коды маркировки (особенно для табачной и альтернативной продукции) содержат служебные символы, скобки идентификаторов применения (01), (21), а также скрытый символ разделителя групп GS1 (Group Separator, ASCII 29). Если передать их в строку URL «как есть», веб-сервер не сможет корректно распознать строку. Перед добавлением кода в параметры его необходимо обязательно заэкранировать:


КодированныйКод = КодироватьСтроку(ТекущийКод, СпособКодированияСтроки.КодироватьИменаПровайдеров);
МассивПараметров.Добавить(СтрШаблон("values=%1", КодированныйКод));

2. Ограничение на количество запрашиваемых кодов (Лимиты пакетов). Вы не можете передать неограниченное количество параметров в одном URL-запросе. Сервер «Честного Знака» накладывает жесткие лимиты на максимальное число кодов в одном запросе к методу /cises/list:

Если вам требуется проверить большее количество кодов, обязательно реализуйте в коде 1С алгоритм «порционирования» (разбиения исходного массива кодов на пакеты по 35-50 штук) и отправляйте их последовательными запросами.

3. Права доступа и согласия на просмотр сведений. Помните, что актуальные версии True API ограничивают получение информации по чужим кодам маркировки. Если вы запрашиваете информацию по кодам, владельцем которых вы еще не являетесь (например, до подписания УПД от поставщика), сервер может вернуть пустой результат. Для обхода этого ограничения у вас с контрагентом должно быть настроено «Согласие на предоставление сведений» в личном кабинете участника оборота товаров ГИС МТ.

Применяя данные рекомендации и используя правильное позиционирование параметров в URL-строке HTTP-запроса, вы полностью избавитесь от ошибки 400 и обеспечите быструю и надежную проверку кодов маркировки непосредственно из вашей конфигурации 1С. Для получения сведений без ручной реализации HTTP-запросов можно использовать обработку для запроса информации о кодах в Честном Знаке.

← На главную