Как отправить данные методом POST в формате JSON из 1С в API МойСклад 1.2

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

При интеграции 1С с внешними сервисами, такими как МойСклад, разработчики часто сталкиваются с необходимостью перевода примеров из документации (обычно написанных на языке cURL) в программный код 1С. Одной из наиболее частых задач является отправка данных методом POST с передачей тела запроса в формате JSON. Разберем подробно, как правильно настроить соединение, сформировать тело запроса и обработать ответ от сервера.

Анализ исходной задачи и синтаксиса cURL

Рассмотрим типичный пример запроса к API МойСклад для печати документа по шаблону:

curl -X POST "URL" -H "Authorization: Basic Base64" -H "Content-Type: application/json" -d '{"template": {...}, "extension": "xls"}'

В этой команде параметр -d (или --data) отвечает за передачу данных, которые должны быть помещены в тело HTTP-запроса. В контексте 1С это означает, что нам недостаточно просто создать объект HTTPЗапрос, нам нужно наполнить его содержимым с помощью специальных методов работы с телом запроса.

Шаг 1. Создание HTTP-соединения и инициализация запроса

Для начала установим защищенное соединение с сервером. Поскольку МойСклад работает по протоколу HTTPS, нам обязательно потребуется использование объекта ЗащищенноеСоединениеOpenSSL. Проанализируем базовый код подготовки соединения:


Хост = "online.moysklad.ru";
Порт = 443; // Стандартный порт для HTTPS
Соединение = Новый HTTPСоединение(Хост, Порт, , , , , Новый ЗащищенноеСоединениеOpenSSL);

Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Не забываем про авторизацию. Рекомендуется использовать Bearer токен или Basic
Заголовки.Вставить("Authorization", "Basic " + СтрокаBase64Авторизации);

ПутьНаСервере = "/api/remap/1.2/entity/customerorder/..." + "/export/";
Запрос = Новый HTTPЗапрос(ПутьНаСервере, Заголовки);

Шаг 2. Формирование тела запроса (аналог параметра -d)

Самый важный этап — подготовка JSON-данных. Хотя 1С позволяет собрать строку вручную, мы настоятельно рекомендуем использовать штатные средства сериализации. Это поможет избежать ошибок с кавычками, спецсимволами и кодировкой. Выясним, как правильно сформировать структуру для печати документа.


// Создаем структуру, соответствующую требованиям API
ДанныеШаблона = Новый Структура;
Метаданные = Новый Структура;
Метаданные.Вставить("href", "https://online.moysklad.ru/api/remap/1.2/entity/customerorder/metadata/customtemplate/...");
Метаданные.Вставить("type", "customtemplate");
Метаданные.Вставить("mediaType", "application/json");

Шаблон = Новый Структура;
Шаблон.Вставить("meta", Метаданные);

ТелоЗапроса = Новый Структура;
ТелоЗапроса.Вставить("template", Шаблон);
ТелоЗапроса.Вставить("extension", "xls");

// Преобразуем структуру в JSON-строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТелоЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();

// Устанавливаем тело запроса
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Важный нюанс: Обратите внимание на параметр ИспользованиеByteOrderMark.НеИспользовать. Некоторые веб-сервисы, включая старые или специфические реализации API, могут выдавать ошибку 400 (Bad Request), если в начале строки JSON присутствует BOM-маркер, который 1С добавляет по умолчанию.

Шаг 3. Выполнение запроса и получение файла (печатной формы)

После отправки запроса методом POST для печати, сервер МойСклад возвращает не текст, а двоичные данные файла (PDF или Excel). Рассмотрим процесс сохранения этого файла на диск.


Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    // Получаем двоичные данные файла
    ДанныеФайла = Ответ.ПолучитьТелоКакДвоичныеДанные();
    ИмяФайла = "C:\Temp\Document.xls";
    ДанныеФайла.Записать(ИмяФайла);
    Сообщить("Файл успешно сохранен: " + ИмяФайла);
Иначе
    Сообщить("Ошибка при запросе: " + Ответ.КодСостояния);
    Сообщить(Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;

Шаг 4. Решение проблемы отсутствующих данных (ГТД и expand)

Как упоминалось в обсуждении, иногда при обычном GET или POST запросе в данных документа отсутствуют вложенные сущности, например, номера ГТД или страны происхождения. В API МойСклад это решается с помощью параметра expand. Если нам нужно получить детальную информацию по позициям заказа или отгрузки, включая данные о ГТД, нам следует модифицировать URL запроса.

Пример использования expand в пути запроса:

ПутьНаСервере = "/api/remap/1.2/entity/demand/ID_ДОКУМЕНТА?expand=positions,positions.assortment";

Проанализируем ситуацию: добавление этого параметра заставляет сервер "развернуть" вложенные объекты. Если ГТД привязан к конкретной партии товара, может потребоваться расширение до уровня positions.trackingCodes или обращение к связанным документам приемки. Всегда проверяйте структуру JSON, которую возвращает сервер при использовании различных уровней expand.

Дополнительные рекомендации по работе с API

  1. Лимиты (Rate Limits): МойСклад ограничивает количество запросов (обычно до 45 в секунду). При пакетной обработке документов (например, печать 100 накладных в цикле) обязательно делайте паузы с помощью Приостановить(1) или проверяйте код ответа 429.
  2. Типы шаблонов: В теле запроса важно правильно указывать type. Для системных шаблонов это embeddedtemplate, для созданных пользователем — customtemplate. Ошибка в этом поле приведет к тому, что шаблон не будет найден.
  3. Безопасность: Старайтесь не хранить пароли в открытом виде. Используйте механизм БезопасноеХранилищеДанных или хотя бы храните логин и пароль в константах с ограниченным доступом.

Таким образом, мы выяснили, что передача параметра -d из cURL в 1С реализуется через метод УстановитьТелоИзСтроки объекта HTTPЗапрос. Правильное формирование JSON и корректная обработка двоичного ответа позволяют автоматизировать получение любых печатных форм из облачного сервиса напрямую в вашу информационную базу.

← На главную