В мире современной автоматизации бизнеса и интеграции систем, обмен данными с внешними веб-сервисами становится повседневной задачей. Часто эти данные передаются в формате JSON (JavaScript Object Notation), благодаря его легкой читаемости и компактности. В 1С:Предприятии существует мощный инструментарий для осуществления HTTP-запросов, получения ответов и парсинга JSON-данных. Рассмотрим, как мы можем реализовать внешнюю обработку, которая будет отправлять запрос на веб-ресурс, получать JSON-ответ и выводить его элементы пользователю.
Перед нами стоит задача: создать в 1С внешнюю обработку, которая по нажатию кнопки отправит запрос на указанный адрес, получит JSON-данные и выведет их содержимое. Разберем этот процесс пошагово.
Прежде всего, нам необходимо установить соединение с удаленным сервером. Для работы с HTTP и HTTPS в 1С используются объекты HTTPСоединение. Поскольку целевой адрес начинается с https://, мы должны использовать защищенное соединение.
Для создания защищенного соединения мы воспользуемся объектом ЗащищенноеСоединение. В 1С есть несколько вариантов его создания: Новый ЗащищенноеСоединениеOpenSSL(), Новый СертификатКлиентаWindows() и Новый СертификатыУдостоверяющихЦентровWindows(). В большинстве случаев достаточно использовать универсальный конструктор Новый ЗащищенноеСоединениеOpenSSL(), который эффективно обрабатывает SSL/TLS сертификаты.
При создании объекта HTTPСоединение нам потребуются следующие параметры:
ИнтернетПрокси.Давайте посмотрим на пример создания соединения:
&НаКлиенте
Процедура ОтправитьЗапросИПолучитьJSON(Команда)
// Определяем параметры для соединения
ИмяСервера = "kremlinstore.ru";
Ресурс = "/phpscripts/1c_test.php";
Порт = 443; // Для HTTPS
// Создаем защищенное соединение
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Попытка
// Создаем HTTP-соединение
Соединение = Новый HTTPСоединение(ИмяСервера, Порт, , , , 10, ЗащищенноеСоединение);
// Далее переходим к формированию запроса
// ...
Исключение
Сообщить("Ошибка при установке HTTP-соединения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецПроцедуры
Важный момент: Мы оборачиваем создание соединения в блок Попытка-Исключение, чтобы перехватить возможные ошибки на этапе установки связи. Это позволяет сделать код более устойчивым к сетевым проблемам.
После того как соединение установлено (или объект соединения создан), нам необходимо сформировать сам HTTP-запрос. Для этого в 1С предназначен объект HTTPЗапрос.
При формировании запроса нам понадобятся следующие параметры:
Content-Type, например, "application/json", чтобы сервер понимал тип отправляемых данных. Для запросов GET заголовки могут быть необязательными, но для POST и других методов они критичны. Также здесь могут передаваться токены авторизации или другие специфические параметры.GET, POST, PUT, PATCH, DELETE). В нашем случае, как правило, это будет GET, поскольку мы просто запрашиваем данные.POST или PUT тело запроса может содержать данные, которые мы отправляем на сервер, часто в формате JSON. Это устанавливается методом УстановитьТело().Рассмотрим пример создания HTTP-запроса:
&НаКлиенте
Процедура ОтправитьЗапросИПолучитьJSON(Команда)
// ... (код из Шага 1)
// Создаем HTTP-запрос
Запрос = Новый HTTPЗапрос(Ресурс);
// Возможно, потребуется указать заголовки
// Например, если мы ожидаем JSON в ответ или отправляем JSON
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.Заголовки.Вставить("Accept", "application/json"); // Указываем, что принимаем JSON
// Если запрос является POST и нужно отправить данные,
// используем Запрос.УстановитьТело(СтрокаJSON, Кодировка);
// Но для GET-запроса тело не требуется.
// Далее переходим к выполнению запроса
// ...
КонецПроцедуры
Убедитесь, что заголовки соответствуют требованиям удаленного сервиса. Некоторые API могут требовать специфические заголовки для аутентификации или указания версии API.
После подготовки соединения и запроса, мы готовы к его выполнению. Для этого у объекта HTTPСоединение есть методы, такие как Получить() (для GET-запросов) или Отправить() (для POST, PUT и других, где есть тело запроса). В нашем случае, наиболее вероятно, мы будем использовать метод Получить(), так как нам нужно получить данные.
Результатом выполнения запроса будет объект HTTPОтвет, который содержит информацию о статусе ответа, заголовках и теле ответа.
Критически важно проверить код состояния HTTP-ответа, чтобы убедиться, что запрос был успешно обработан сервером. Код 200 (OK) обычно означает успех. Другие коды, такие как 404 (Not Found), 500 (Internal Server Error) или 401 (Unauthorized), указывают на различные проблемы.
Давайте добавим выполнение запроса к нашему примеру:
&НаКлиенте
Процедура ОтправитьЗапросИПолучитьJSON(Команда)
// ... (код из Шага 1 и Шага 2)
Попытка
// Выполняем запрос
Ответ = Соединение.Получить(Запрос);
// Проверяем код состояния ответа
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Запрос успешно выполнен. Получены данные.");
// Далее переходим к обработке JSON
// ...
Иначе
Сообщить("Ошибка при выполнении запроса. Код состояния: " + Ответ.КодСостояния);
Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку());
Возврат;
КонецЕсли;
Исключение
Сообщить("Ошибка при выполнении HTTP-запроса: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецПроцедуры
Мы снова используем блок Попытка-Исключение для перехвата возможных сетевых ошибок или проблем, возникающих на этапе выполнения запроса. Это позволяет graceful завершить выполнение функции и сообщить пользователю о проблеме, не прерывая работу программы.
После успешного получения ответа, тело которого содержит JSON-строку, нам необходимо извлечь эти данные и преобразовать их в объекты 1С (Соответствия, Массивы и т.д.). Для этого в 1С предусмотрены объекты ЧтениеJSON и функция ПрочитатьJSON().
ПолучитьТелоКакПоток(). Это предотвращает загрузку всего ответа в память в виде строки, что может быть критично для больших файлов.ЧтениеJSON и открываем его для чтения из полученного потока.ПрочитатьJSON() для десериализации JSON-данных в объекты 1С. В зависимости от корневой структуры JSON, она может вернуть Соответствие (если JSON начинается с '{') или Массив (если JSON начинается с '[').Пример обработки JSON-данных:
&НаКлиенте
Процедура ОтправитьЗапросИПолучитьJSON(Команда)
// ... (код из Шага 1, Шага 2, Шага 3)
Если Ответ.КодСостояния = 200 Тогда
Попытка
// Получаем тело ответа как поток
Поток = Ответ.ПолучитьТелоКакПоток();
// Создаем объект для чтения JSON
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.ОткрытьПоток(Поток);
// Читаем JSON в структуру 1С (Соответствие или Массив)
// Если JSON начинается с '{...}', получим Соответствие.
// Если JSON начинается с '[...]', получим Массив.
ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Поток.Закрыть();
// Выводим элементы массива/соответствия
Если ТипЗнч(ДанныеJSON) = Тип("Массив") Тогда
Сообщить("Получен массив из " + ДанныеJSON.Количество() + " элементов:");
Для Каждого Элемент Из ДанныеJSON Цикл
// Пример: Если элемент сам является соответствием
Если ТипЗнч(Элемент) = Тип("Соответствие") Тогда
Для Каждого КлючЗначение Из Элемент Цикл
Сообщить(" " + КлючЗначение.Ключ + ": " + КлючЗначение.Значение);
КонецЦикла;
Иначе
Сообщить("Элемент: " + Элемент);
КонецЕсли;
КонецЦикла;
ИначеЕсли ТипЗнч(ДанныеJSON) = Тип("Соответствие") Тогда
Сообщить("Получен объект (Соответствие). Ключи:");
Для Каждого КлючЗначение Из ДанныеJSON Цикл
Сообщить(КлючЗначение.Ключ + ": " + КлючЗначение.Значение);
КонецЦикла;
Иначе
Сообщить("Неизвестный тип JSON-данных: " + ТипЗнч(ДанныеJSON));
КонецЕсли;
Исключение
Сообщить("Ошибка при чтении JSON: " + ОписаниеОшибки());
КонецПопытки;
Иначе
// ... (обработка ошибки HTTP-запроса)
КонецЕсли;
КонецПроцедуры
Функция ПрочитатьJSON() достаточно универсальна, чтобы понять корневой элемент JSON и автоматически преобразовать его в подходящий тип 1С. Если вы заранее знаете структуру, можете использовать более специфичные методы, такие как ПрочитатьОбъект(), ПрочитатьСоответствие() или ПрочитатьМассив() для более контролируемого чтения.
Как мы уже выяснили, для работы с HTTPS необходимо использовать объект ЗащищенноеСоединение. Однако, иногда этого оказывается недостаточно, и могут возникнуть ошибки, такие как "Удаленный узел не прошел проверку" или "problem with the SSL CA cert". Выясним причины и рассмотрим решения этих проблем.
Рассмотрим подробнее возможные причины и решения:
cacert.pem для проверки SSL-сертификатов. Этот файл обычно находится в каталоге установки 1С. Вы можете:
cacert.pem в каталоге 1С. Будьте осторожны при модификации системных файлов. Всегда делайте резервную копию перед изменениями.p12, защищенный паролем. Для использования такого сертификата необходимо создать объект ЗащищенноеСоединениеOpenSSL, указав путь к файлу и пароль:
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
ПутьКФайлуСертификатаP12, // Например, "C:\MyCerts\client.p12"
ПарольКСертификату
);
При возникновении проблем с сертификатами, внимательно изучайте текст ошибки. Он часто содержит подсказки о том, какой сертификат вызывает недоверие или какой компонент не может быть проверен.
Помимо базового алгоритма, описанного выше, существуют дополнительные возможности и лучшие практики, которые мы можем применять при работе с HTTP-запросами и JSON в 1С. Они помогут нам создавать более надежные, гибкие и безопасные интеграции.
GET-запрос. Для отправки данных на сервер (например, создания нового ресурса или обновления существующего) часто используются методы POST и PUT. Для них необходимо использовать метод Соединение.Отправить() и установить тело запроса:
// Пример POST-запроса с JSON-телом
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
// Предполагаем, что СтрокаJSONДляОтправки содержит ваш JSON-объект в виде строки
Запрос.УстановитьТело(СтрокаJSONДляОтправки, КодировкаТекста.UTF8); // Тело запроса в формате JSON
Ответ = Соединение.Отправить(Запрос);
PATCH и DELETE также поддерживаются для более специализированных операций (частичное обновление ресурса или его удаление соответственно).
ЗаписьJSON. Это позволяет удобно обмениваться сложными структурами данных 1С с внешними системами.ЧтениеJSON и ЗаписьJSON имеют настройки, которые позволяют тонко управлять процессом парсинга и генерации. Например, можно задать кодировку, псевдонимы для свойств (если имена полей в JSON отличаются от желаемых в 1С), или игнорировать неизвестные поля. Это делает процесс работы с JSON более гибким и адаптируемым к различным API.Дата 1С, особенно если формат нестандартный.HTTPСоединение для работы через него. Для этого создается объект ИнтернетПрокси и передается в конструктор HTTPСоединение:
Прокси = Новый ИнтернетПрокси();
Прокси.Установить("адрес_прокси", порт_прокси); // Пример: "proxy.mycompany.com", 8080
// Если прокси требует аутентификации
Прокси.УстановитьПользователя("логин_прокси", "пароль_прокси");
Соединение = Новый HTTPСоединение(ИмяСервера, Порт, Прокси, , , 10, ЗащищенноеСоединение);
Попытка-Исключение для обработки сетевых сбоев, ошибок сервера и других непредвиденных ситуаций. Помимо этого, рекомендуется внедрить логирование, которое будет записывать детали запросов (URL, метод, заголовки, параметры, тело запроса) и ответов (код состояния, тело ответа), а также метрики времени их выполнения. Это значительно упрощает отладку, мониторинг работы интеграций и анализ проблем в производственной среде.GET или PUT должен давать тот же результат без дополнительных побочных эффектов) поможет в разработке надежных и устойчивых к ошибкам систем, особенно при возникновении сетевых сбоев и необходимости повторных попыток запросов.Таким образом, получение и обработка JSON-данных из внешних HTTP-сервисов в 1С – это вполне реализуемая задача, требующая последовательного выполнения шагов по установлению соединения, формированию и отправке запроса, а также правильному парсингу полученного JSON. Соблюдая эти рекомендации, мы сможем успешно интегрировать 1С с различными внешними системами, обеспечивая надежный и безопасный обмен данными.