Интеграция с государственными информационными системами, такими как ФГИС УТКО (федеральная государственная информационная система учета твердых коммунальных отходов, курируемая ППК РЭО), часто вызывает сложности у разработчиков 1С. Основная проблема заключается в специфических требованиях к формированию HTTP-запроса: сервер ожидает данные в формате multipart/form-data, внутри которого должен находиться файл JSON с определенной структурой. В этой статье мы подробно разберем, как правильно сформировать структуру данных, настроить защищенное соединение и отправить запрос, чтобы получить успешный ответ с кодом 200.
Прежде всего, нам необходимо подготовить данные в соответствии с техническим заданием ФГИС УТКО. Обратим внимание на критически важный момент: идентификаторы (objectId, accessKey, id) должны быть представлены в нижнем регистре и без фигурных скобок. Формат даты также строго регламентирован.
Рассмотрим пример формирования структуры данных в 1С:
// Создаем основную структуру запроса
Данные = Новый Структура;
Данные.Вставить("objectId", НРег(СтрЗаменить(Строка(ОбъектID), "{", ""))); // Убираем скобки и в нижний регистр
Данные.Вставить("accessKey", НРег(СтрЗаменить(Строка(КлючДоступа), "}", "")));
МассивВесы = Новый Массив;
Для Каждого СтрокаТЗ из ТаблицаВзвешиваний Цикл
ДанныеВН = Новый Структура;
ДанныеВН.Вставить("id", НРег(Строка(СтрокаТЗ.Ссылка.УникальныйИдентификатор())));
// Дата должна быть в формате YYYY-MM-DD HH:MM:SS
ДанныеВН.Вставить("dateBefore", Формат(СтрокаТЗ.ДатаПриезда, "ДФ='yyyy-MM-dd HH:mm:ss'"));
ДанныеВН.Вставить("registrationNumber", СокрЛП(СтрокаТЗ.НомерАвто));
ДанныеВН.Вставить("weightBefore", ЦелоеЧисло(СтрокаТЗ.ВесБрутто)); // Вес передаем как число
ДанныеВН.Вставить("weightAfter", ЦелоеЧисло(СтрокаТЗ.ВесТара));
ДанныеВН.Вставить("garbageWeight", ЦелоеЧисло(СтрокаТЗ.ВесНетто));
// Остальные обязательные поля по API
ДанныеВН.Вставить("coefficient", "1");
МассивВесы.Добавить(ДанныеВН);
КонецЦикла;
Данные.Вставить("weightControls", МассивВесы);
После формирования структуры мы должны преобразовать ее в строку JSON. Для этого используем объект ЗаписьJSON. Проанализируем ситуацию: если мы просто запишем JSON в строку, нам все равно придется преобразовывать ее в двоичные данные для корректной отправки в потоке.
Запись = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
Запись.УстановитьСтроку(ПараметрыЗаписи);
ЗаписатьJSON(Запись, Данные);
СтрокаJSON = Запись.Закрыть();
ДвоичныеДанныеJSON = ПолучитьДвоичныеДанныеИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Это самая сложная часть задачи. Сервис ФГИС УТКО требует отправки данных как файла через форму. Разберем по шагам, как вручную собрать тело запроса, используя ПотокВПамяти. Это позволит избежать проблем с кодировками и символами переноса строк.
Выясним причину частых ошибок: сервер часто возвращает «422 Unprocessable Entity» или «Failed to read the request form», если разделители (boundary) или заголовки внутри тела сформированы неверно. Важно использовать комбинацию Символы.ВК + Символы.ПС (CRLF) после каждой строки заголовка.
// Генерируем уникальный разделитель
Разделитель = "----" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
ПотокТела = Новый ПотокВПамяти;
ЗаписьДанных = Новый ЗаписьДанных(ПотокТела, КодировкаТекста.UTF8, , Символы.ВК + Символы.ПС, "");
// Начало блока файла
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
// Поле name должно быть строго "file"
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""data.json""");
ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/json");
ЗаписьДанных.ЗаписатьСтроку(""); // Пустая строка перед данными
// Записываем сам JSON
ЗаписьДанных.Записать(ДвоичныеДанныеJSON);
// Завершение блока и запроса
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
ЗаписьДанных.ЗаписатьСтроку("");
ДанныеТела = ПотокТела.ЗакрытьИПолучитьДвоичныеДанные();
Система ФГИС УТКО работает только по защищенному протоколу HTTPS. Посмотрим на пример настройки объекта HTTPСоединение. Обратите внимание, что с декабря 2024 года адрес API изменился. Актуальный домен на текущий момент: api.utko.mnr.gov.ru.
// Настройка SSL
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Указываем актуальный адрес сервера
Сервер = "api.utko.mnr.gov.ru";
Ресурс = "reo-weight-control-api/api/v1/weight-controls/import";
Соединение = Новый HTTPСоединение(Сервер, , , , , 60, ЗащищенноеСоединение);
// Формируем заголовки запроса
Заголовки = Новый Соответствие;
Заголовки.Вставить("accept", "*/*");
Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Разделитель);
Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
Запрос.УстановитьТелоИзДвоичныхДанных(ДанныеТела);
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
КодСостояния = Ответ.КодСостояния;
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
Если КодСостояния = 200 Тогда
Сообщить("Данные успешно приняты ФГИС УТКО!");
Иначе
Сообщить("Ошибка отправки! Код: " + КодСостояния + ". Ответ: " + ТекстОтвета);
КонецЕсли;
Исключение
Сообщить("Ошибка связи с сервером: " + ОписаниеОшибки());
КонецПопытки;
Рассмотрим подробнее, с чем могут столкнуться разработчики при отладке:
api.reo.ru без HTTPS или старый путь). Проверьте актуальность домена и наличие ЗащищенноеСоединениеOpenSSL.coefficient) были заполнены, даже если они всегда равны "1".Content-Type не указан boundary или он не совпадает с тем, что используется в теле сообщения.objectId. Если вы отправили данные на чужой или несуществующий ID объекта, система может принять их технически, но не отобразить в вашем интерфейсе.Важный совет по эксплуатации: Во ФГИС УТКО отсутствует полноценный тестовый контур для API. Разработчики рекомендуют проводить тестирование на реальных данных за прошлые (уже закрытые) периоды или отправлять по одной записи. Помните, что удаление данных, загруженных через API, часто невозможно через обычный интерфейс личного кабинета, поэтому перед массовой выгрузкой тщательно проверяйте валидность JSON. Для такой проверки подойдёт инструмент для валидации и форматирования JSON в 1С.
Используя данный подход с ручным формированием тела запроса через ЗаписьДанных и ПотокВПамяти, вы обеспечите максимальную совместимость с требованиями государственных сервисов и стабильную работу интеграции.