При интеграции 1С с внешними сервисами, такими как МойСклад, разработчики часто сталкиваются с необходимостью перевода примеров из документации (обычно написанных на языке cURL) в программный код 1С. Одной из наиболее частых задач является отправка данных методом POST с передачей тела запроса в формате JSON. Разберем подробно, как правильно настроить соединение, сформировать тело запроса и обработать ответ от сервера.
Рассмотрим типичный пример запроса к API МойСклад для печати документа по шаблону:
curl -X POST "URL" -H "Authorization: Basic Base64" -H "Content-Type: application/json" -d '{"template": {...}, "extension": "xls"}'
В этой команде параметр -d (или --data) отвечает за передачу данных, которые должны быть помещены в тело 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Запрос(ПутьНаСервере, Заголовки);
Самый важный этап — подготовка 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С добавляет по умолчанию.
После отправки запроса методом POST для печати, сервер МойСклад возвращает не текст, а двоичные данные файла (PDF или Excel). Рассмотрим процесс сохранения этого файла на диск.
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Получаем двоичные данные файла
ДанныеФайла = Ответ.ПолучитьТелоКакДвоичныеДанные();
ИмяФайла = "C:\Temp\Document.xls";
ДанныеФайла.Записать(ИмяФайла);
Сообщить("Файл успешно сохранен: " + ИмяФайла);
Иначе
Сообщить("Ошибка при запросе: " + Ответ.КодСостояния);
Сообщить(Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Как упоминалось в обсуждении, иногда при обычном GET или POST запросе в данных документа отсутствуют вложенные сущности, например, номера ГТД или страны происхождения. В API МойСклад это решается с помощью параметра expand. Если нам нужно получить детальную информацию по позициям заказа или отгрузки, включая данные о ГТД, нам следует модифицировать URL запроса.
Пример использования expand в пути запроса:
ПутьНаСервере = "/api/remap/1.2/entity/demand/ID_ДОКУМЕНТА?expand=positions,positions.assortment";
Проанализируем ситуацию: добавление этого параметра заставляет сервер "развернуть" вложенные объекты. Если ГТД привязан к конкретной партии товара, может потребоваться расширение до уровня positions.trackingCodes или обращение к связанным документам приемки. Всегда проверяйте структуру JSON, которую возвращает сервер при использовании различных уровней expand.
Приостановить(1) или проверяйте код ответа 429.type. Для системных шаблонов это embeddedtemplate, для созданных пользователем — customtemplate. Ошибка в этом поле приведет к тому, что шаблон не будет найден.БезопасноеХранилищеДанных или хотя бы храните логин и пароль в константах с ограниченным доступом.Таким образом, мы выяснили, что передача параметра -d из cURL в 1С реализуется через метод УстановитьТелоИзСтроки объекта HTTPЗапрос. Правильное формирование JSON и корректная обработка двоичного ответа позволяют автоматизировать получение любых печатных форм из облачного сервиса напрямую в вашу информационную базу.