Выполнение HTTP-запросов из 1С:Предприятие — одна из ключевых задач при интеграции с внешними сервисами, API банков, маркетплейсов или собственными бэкенд-системами. GET-запросы используются для получения данных: курсов валют, статусов заказов, справочной информации или списков товаров. В отличие от POST, они не изменяют состояние сервера, что делает их безопасными для повторных вызовов.
В этой статье разберём все способы отправки GET-запросов в 1С 8.3 — от простейшего кода на встроенном языке до работы с HTTPСервис, HTTPСоединение и внешними компонентами. Особое внимание уделим обработке ошибок и тайм-аутам, которые часто становятся причиной падения обменов. Материал актуален для всех актуальных релизов платформы, включая облачные и локальные версии.
1. Базовые способы выполнения GET-запроса в 1С
Начнём с самого простого варианта — использования объекта HTTPСоединение. Этот метод подходит для разовых запросов и не требует подключения дополнительных библиотек. Основные шаги:
- 🔹 Создать объект
HTTPСоединениеи указать адрес сервера - 🔹 Установить заголовки (при необходимости)
- 🔹 Выполнить метод
Получить()с передачей параметров в URL - 🔹 Обработать ответ или ошибку
Пример минимального кода для запроса курса доллара от ЦБ РФ:
Попытка
Соединение = Новый HTTPСоединение("www.cbr.ru");
Ответ = Соединение.Получить("/scripts/XML_daily.asp?date_req=01/01/2026");
Сообщить(Ответ.ПолучитьТекст());
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
Этот код работает без авторизации, но для большинства API потребуется добавить заголовки (например, Authorization или Content-Type). Обратите внимание: параметры запроса передаются прямо в URL после знака ?, разделённые символом &.
2. Использование HTTPСервис для сложных запросов
Объект HTTPСервис появился в 1С 8.3.14 и стал более гибкой альтернативой HTTPСоединение. Он поддерживает:
- 🔧 Настройку тайм-аутов (отдельно на соединение и чтение)
- 🔧 Работу с прокси-серверами
- 🔧 Удобное управление заголовками через коллекцию
Заголовки - 🔧 Поддержку HTTPS с проверкой сертификатов
Пример запроса к API OpenWeatherMap с передачей ключа API и параметров:
HTTPСервис = Новый HTTPСервис();
Заголовки = HTTPСервис.Заголовки;
Заголовки.Вставить("Accept", "application/json");
// Устанавливаем тайм-аут 30 секунд
HTTPСервис.ТаймАут = 30000;
URL = "https://api.openweathermap.org/data/2.5/weather?q=Moscow&appid=ВАШ_КЛЮЧ_API&units=metric";
Ответ = HTTPСервис.Получить(URL);
Если Ответ.КодСостояния = 200 Тогда
ДанныеПогоды = JSON.Прочитать(Ответ.ПолучитьТекст());
Сообщить("Температура: " + ДанныеПогоды.main.temp + "°C");
Иначе
Сообщить("Ошибка: " + Ответ.КодСостояния + " - " + Ответ.ПолучитьТекст());
КонецЕсли;
Всегда проверяйте код состояния ответа (200 — успех, 401 — нет авторизации, 404 — не найдено). Не полагайтесь только на отсутствие исключений!
Для работы с JSON в примере используется встроенный парсер 1С, доступный с версии 8.3.10. Если ваша конфигурация старше, потребуется внешняя компонента или обработка строки вручную.
3. Передача параметров в GET-запросе
Параметры в GET-запросах передаются через строку запроса (query string) после символа ?. Правила формирования:
- 📌 Параметры разделяются символом
& - 📌 Значения кодируются с помощью
СтрЗначениеВURL()(например, пробел становится%20) - 📌 Кириллические символы автоматически преобразуются в
UTF-8
Пример формирования URL с параметрами:
БазовыйURL = "https://api.example.com/orders";
Параметры = Новый Структура();
Параметры.Вставить("date_from", "2026-01-01");
Параметры.Вставить("date_to", "2026-01-31");
Параметры.Вставить("status", "completed");
СтрокаПараметров = "";
Для Каждого Параметр Из Параметры Цикл
Если СтрокаПараметров <> "" Тогда
СтрокаПараметров = СтрокаПараметров + "&";
КонецЕсли;
СтрокаПараметров = СтрокаПараметров + СтрЗначениеВURL(Параметр.Ключ) + "=" + СтрЗначениеВURL(Параметр.Значение);
КонецЦикла;
ПолныйURL = БазовыйURL + "?" + СтрокаПараметров;
| Символ | Кодировка в URL | Пример |
|---|---|---|
| Пробел | %20 или + |
Москва%20город |
| = | %3D |
filter%3Dactive |
| & | %26 |
param1%26param2 |
| ? | %3F |
query%3Fsearch |
Что будет если не кодировать параметры?
Если не использовать СтрЗначениеВURL(), сервер может неправильно интерпретировать пробелы, кириллицу или специальные символы.
Например, запрос с параметром city=Нью Йорк без кодировки прервётся на пробеле, и сервер получит только city=Нью,
что приведёт к ошибке 400 (Bad Request).
4. Обработка ответа: JSON, XML и бинарные данные
Ответ от сервера может приходить в разных форматах. В 1С их обрабатывают так:
- 📄 JSON: используйте встроенный парсер
JSON.Прочитать()(доступен с 8.3.10) - 📄 XML: загружайте в
ЧтениеXMLили парсите черезDOM - 📄 Бинарные данные (PDF, изображения): сохраняйте в
ДвоичныеДанныеили файл - 📄 Простой текст: используйте
ПолучитьТекст()илиПолучитьПоток()
Пример разбора JSON-ответа с погодой:
ОтветJSON = JSON.Прочитать(Ответ.ПолучитьТекст());
Температура = ОтветJSON.main.temp;
Влажность = ОтветJSON.main.humidity;
Сообщить(СтрШаблон("Температура: %1°C, Влажность: %2%",
Температура, Влажность));
Для XML подходит следующий подход:
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(Ответ.ПолучитьТекст());
// Пример чтения курса валюты из XML ЦБ РФ
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.Имя = "Valute" Тогда
КодВалюты = ЧтениеXML.ПолучитьАтрибут("ID");
ИначеЕсли ЧтениеXML.Имя = "Value" Тогда
Курс = ЧтениеXML.ПолучитьТекстовоеСодержимое();
Сообщить(СтрШаблон("Курс %1: %2", КодВалюты, Курс));
КонецЕсли;
КонецЕсли;
КонецЦикла;
🔹 Код состояния = 200 (успех)
🔹 Длина ответа > 0 байт
🔹 Формат данных соответствует ожидаемому (JSON/XML)
🔹 Отсутствуют ошибки парсинга-->
5. Типичные ошибки и их решение
При работе с GET-запросами в 1С чаще всего возникают следующие проблемы:
⚠️ Внимание: Если сервер требуетHTTPS, но у вас самоподписанный сертификат, добавьте строкуHTTPСервис.ИгнорироватьОшибкиСертификата = Истина;перед выполнением запроса. Это отключит проверку подлинности сертификата (небезопасно для продакшена!).
| Ошибка | Причина | Решение |
|---|---|---|
Ошибка соединения (12029) |
Неверный URL или сервер недоступен | Проверьте адрес, прокси, интернет-соединение |
401 Unauthorized |
Отсутствует или неверный токен авторизации | Добавьте заголовок Authorization: Bearer ТОКЕН |
403 Forbidden |
IP-адрес заблокирован или нет прав | Проверьте белый список IP в настройках API |
Тайм-аут соединения |
Сервер долго отвечает | Увеличьте HTTPСервис.ТаймАут (по умолчанию 60 сек) |
Ещё одна распространённая ошибка — некорректная кодировка параметров. Например, если в параметре передаётся дата в формате DD.MM.YYYY, а API ожидает YYYY-MM-DD, сервер вернёт 400 Bad Request. Всегда уточняйте требования к формату данных в документации API.
Для отладки полезно выводить полный URL запроса и заголовки:
Сообщить("URL: " + URL);
Сообщить("Заголовки: " + HTTPСервис.Заголовки.ПолучитьКлючиИЗначения());
6. Альтернативные методы: внешние компоненты и REST-расширения
Если встроенных средств 1С недостаточно (например, нужна поддержка gzip, OAuth 2.0 или сложная обработка ошибок), используйте:
- 🛠️ Внешние компоненты: CURL, HTTPClient (например, от Infostart)
- 🛠️ REST-расширения: готовые обработки для работы с API (доступны на Infostart, 1С-Галлерея)
- 🛠️ Web-сервисы: если API поддерживает SOAP, можно использовать
WS-ссылки
Пример вызова внешней компоненты HTTPClient:
Попытка
HTTPClient = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
HTTPClient.Open("GET", "https://api.example.com/data", Ложь);
HTTPClient.SetRequestHeader("Authorization", "Bearer ТОКЕН");
HTTPClient.Send();
Если HTTPClient.Status = 200 Тогда
Ответ = HTTPClient.ResponseText;
// Обработка ответа
Иначе
Сообщить("Ошибка: " + HTTPClient.Status + " - " + HTTPClient.StatusText);
КонецЕсли;
Исключение
Сообщить("Ошибка COM: " + ОписаниеОшибки());
КонецПопытки;
⚠️ Внимание: Внешние компоненты требуют регистрации на клиентских машинах и могут не работать в 1С:Предприятие для Linux или веб-клиенте. Перед использованием проверьте совместимость с вашей версией платформы.
Для облачных решений (например, 1С:Fresh) внешние компоненты недоступны — в этом случае используйте встроенный HTTPСервис или организуйте промежуточный сервер (proxy) на стороне вашего бэкенда.
7. Оптимизация и безопасность GET-запросов
При регулярных запросах к API следует учитывать:
- 🔒 Кэширование: сохраняйте ответы в
РегистрСведенийили файл, чтобы не отправлять повторные запросы - 🔒 Ограничение частоты: многие API имеют лимиты (например, 60 запросов в минуту)
- 🔒 Логирование: ведите журнал запросов и ошибок для отладки
- 🔒 Безопасность: не храните токены и пароли в коде — используйте
ХранилищеОбщихНастроек
Пример кэширования курса валюты:
Функция ПолучитьКурсВалюты(КодВалюты, Дата)
// Проверяем кэш
Запись = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(КодВалюты, Дата);
Если Не Запись.Пустая() Тогда
Возврат Запись.Курс;
КонецЕсли;
// Если в кэше нет — запрашиваем API
HTTPСервис = Новый HTTPСервис();
URL = "https://api.example.com/rates?code=" + КодВалюты + "&date=" + Формат(Дата, "ДЛФ=YYYY-MM-DD");
Ответ = HTTPСервис.Получить(URL);
Если Ответ.КодСостояния = 200 Тогда
Данные = JSON.Прочитать(Ответ.ПолучитьТекст());
Курс = Данные.rate;
// Сохраняем в кэш
Запись = РегистрыСведений.КурсыВалют.СоздатьЗапись();
Запись.КодВалюты = КодВалюты;
Запись.Дата = Дата;
Запись.Курс = Курс;
Запись.Записать();
Возврат Курс;
Иначе
ВызватьИсключение "Не удалось получить курс валюты: " + Ответ.ПолучитьТекст();
КонецЕсли;
КонецФункции
Всегда ограничивайте количество повторных попыток при ошибках соединения (например, 3 попытки с интервалом 5 секунд). Бесконечные ретраи могут заблокировать ваш IP в API.
Для защиты токенов API используйте ХранилищеОбщихНастроек:
// Сохранение токена
Хранилище = ХранилищеОбщихНастроек.Получить();
Хранилище.Вставить("API_Токен", "ваш_секретный_токен");
Хранилище.Записать();
// Чтение токена
Хранилище = ХранилищеОбщихНастроек.Получить();
Токен = Хранилище.Получить("API_Токен");
8. Примеры реальных интеграций
Рассмотрим несколько практических сценариев использования GET-запросов в 1С:
- 📦 Обновление справочника номенклатуры: запрос списка товаров с маркетплейса (например, Wildberries или Ozon)
- 💰 Загрузка банковских выписок: получение транзакций по API банка (Сбер, Тинькофф, Точка)
- 📊 Аналитика продаж: запрос данных из Google Analytics или Яндекс.Метрики
- 🚚 Отслеживание доставки: получение статусов заказов от транспортных компаний (СДЭК, Boxberry)
Пример интеграции с API СДЭК для отслеживания посылки:
Функция ПолучитьСтатусДоставки(НомерЗаказа)
HTTPСервис = Новый HTTPСервис();
HTTPСервис.Заголовки.Вставить("Authorization", "Token ВАШ_ТОКЕН_SDEK");
URL = "https://api.cdek.ru/v2/orders/" + НомерЗаказа + "/statuses";
Ответ = HTTPСервис.Получить(URL);
Если Ответ.КодСостояния = 200 Тогда
Данные = JSON.Прочитать(Ответ.ПолучитьТекст());
Возврат Данные.statuses[0].code; // Например, "Delivered"
Иначе
ВызватьИсключение "Ошибка получения статуса: " + Ответ.ПолучитьТекст();
КонецЕсли;
КонецФункции
Для работы с OAuth 2.0 (например, API МойСклад или Bitrix24) потребуется сначала получить токен доступа, а затем использовать его в заголовках. Этот процесс обычно включает:
- Формирование URL авторизации с
client_idиredirect_uri - Обмен временного кода на токен (POST-запрос)
- Использование токена в последующих GET-запросах
Как обновить истёкший OAuth-токен?
Для обновления токена отправьте POST-запрос на эндпоинт /oauth/token с параметрами:
grant_type=refresh_token, refresh_token=ВАШ_REFRESH_TOKEN и client_id/secret.
Пример для МойСклад:
HTTPСервис.ОтправитьPOST("https://online.moysklad.ru/oauth/token",
"grant_type=refresh_token&refresh_token=XXX&client_id=YYY&client_secret=ZZZ");
Новый access_token будет в ответе в поле access_token.
Для сложных интеграций рекомендуем использовать готовые решения от партнёров 1С, такие как:
- 🔗 1С-Рарус: Интеграция с маркетплейсами
- 🔗 Клеверенс: Мобильная интеграция
- 🔗 Атлант: Обмен с банками
FAQ: Частые вопросы по GET-запросам в 1С
1. Можно ли отправить GET-запрос без HTTPS?
Да, но это небезопасно. Для тестовых целей можно использовать HTTP, но в продакшене всегда применяйте HTTPS.
2. Как передать массив параметров в GET?
В GET-запросах массивы передаются через повторяющиеся параметры, например:
?id=1&id=2&id=3. Некоторые API ожидают формат ?id[]=1&id[]=2.
3. Почему 1С ругается на сертификат при HTTPS-запросе?
Это происходит, если сервер использует самоподписанный сертификат. Решения:
- Добавьте сертификат в доверенные на сервере 1С.
- Отключите проверку (небезопасно):
HTTPСервис.ИгнорироватьОшибкиСертификата = Истина.
4. Как увеличить лимит времени на запрос?
По умолчанию тайм-аут — 60 секунд. Увеличьте его через свойство:
HTTPСервис.ТаймАут = 120000; // 2 минуты.
5. Можно ли отправить GET-запрос из отчёта или обработки?
Да, но учитывайте, что в тонком клиенте и веб-клиенте некоторые методы могут быть ограничены. Для надёжности выполняйте запросы на сервере (в модуле объекта или общем модуле с флагом Сервер).