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

Если вы только начинаете разбираться в теме, важно понимать: HTTP-запросы в 1С — это не просто "отправка данных в интернет". Это инструмент для автоматизации рутинных операций, синхронизации баз, получения актуальной информации из внешних источников (например, курсов валют или статусов заказов) и даже для создания собственных API. В этой статье мы разберём внутреннюю кухню HTTP-взаимодействий в 1С: от базовых понятий до нюансов работы с заголовками, авторизацией и обработкой ответов.

Что такое HTTP-запрос и как он работает в контексте 1С

HTTP-запрос — это стандартный способ обмена данными между клиентом (в нашем случае — 1С:Предприятие) и сервером по протоколу HTTP/HTTPS. В упрощённом виде механизм выглядит так:

  1. Формирование запроса: 1С собирает данные (параметры, тело запроса, заголовки) и отправляет их на указанный URL.
  2. Передача по сети: запрос уходит на сервер через интернет или локальную сеть.
  3. Обработка на сервере: внешняя система (например, API банка или маркетплейса) анализирует запрос и возвращает ответ.
  4. Получение ответа: 1С принимает данные и может их обработать (например, записать в базу или показать пользователю).

В 1С:Предприятие 8 для работы с HTTP используется встроенный объект HTTPСоединение (или HTTPЗапрос в новых версиях платформы). Этот объект инкапсулирует логику отправки запросов разных типов: GET, POST, PUT и других. Например, чтобы получить курс доллара с сайта ЦБ, достаточно отправить GET-запрос на соответствующий endpoint, а для отправки данных о заказе на маркетплейс — использовать POST.

Ключевая особенность HTTP в 1С — поддержка как синхронных, так и асинхронных запросов. Синхронные блокируют выполнение кода до получения ответа, а асинхронные позволяют продолжать работу программы параллельно. Это критично для производительности, если вам нужно отправить десятки запросов подряд (например, при массовой выгрузке товаров).

📊 Как часто вы используете HTTP-запросы в 1С?
Ежедневно
Несколько раз в неделю
Редко, по необходимости
Никогда не пробовал

Типы HTTP-запросов в 1С и их назначение

В зависимости от задачи, в 1С применяются разные типы HTTP-запросов. Каждый из них имеет своё назначение и особенности использования:

  • 📥 GET: используется для получения данных с сервера. Например, запрос курсов валют, списка заказов или информации о контрагенте. В теле запроса данные не отправляются — параметры передаются в URL.
  • 📤 POST: предназначен для создания новых записей на сервере. Через него отправляют данные о новых заказах, платежах или документах. Тело запроса может содержать JSON, XML или форму x-www-form-urlencoded.
  • 🔄 PUT: применяется для полного обновления существующей записи. Например, изменение статуса заказа или адреса доставки.
  • 🖊️ PATCH: аналогичен PUT, но используется для частичного обновления данных (не все поля объекта).
  • 🗑️ DELETE: удаляет запись на сервере. В 1С используется реже, так как бизнес-логика обычно требует "мягкого" удаления (помечение на удаление).

В реальных интеграциях чаще всего встречаются GET и POST. Например, при работе с API Wildberries или Озон для получения списка заказов используется GET, а для отправки информации о статусах — POST.

Тип запроса Назначение Пример использования в 1С Особенности
GET Получение данных Запрос курса валют с сайта ЦБ Параметры передаются в URL, тело запроса пустое
POST Создание записи Отправка данных о новом заказе на маркетплейс Тело запроса содержит данные (JSON/XML)
PUT Полное обновление Изменение адреса доставки в заказе Требует указания ID обновляемой записи
DELETE Удаление записи Удаление дублирующегося товара из каталога Используется редко из-за бизнес-логики

При выборе типа запроса ориентируйтесь на документацию API, с которым интегрируетесь. Например, некоторые сервисы требуют использовать POST даже для получения данных, если нужно передать сложные параметры фильтрации.

💡

Всегда проверяйте, какой тип запроса поддерживает endpoint, прежде чем писать код. Некоторые API возвращают ошибку 405 (Method Not Allowed), если использовать неподходящий метод.

Как отправить HTTP-запрос в 1С: пошаговая инструкция

Рассмотрим базовый алгоритм отправки HTTP-запроса на примере получения курса доллара с сайта Центрального банка. Этот пример актуален для 1С:Предприятие 8.3 и выше.

Шаг 1. Создайте объект HTTPСоединение и настройте его:


// Создаём соединение

Соединение = Новый HTTPСоединение("www.cbr.ru", 443, Истина); // Последний параметр - использовать HTTPS

// Устанавливаем таймаут (в секундах)

Соединение.Таймаут = 30;

Шаг 2. Формируем запрос. Для GET-запроса укажите путь к ресурсу и параметры (если нужны):

Запрос = Новый HTTPЗапрос("/scripts/XML_daily.asp?date_req=" + ТекущаяДата());

Запрос.УстановитьЗаголовок("Accept", "text/xml");

Шаг 3. Отправляем запрос и получаем ответ:

Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда

// Обрабатываем ответ (например, парсим XML)

ТекстОтвета = Ответ.ПолучитьТекст();

// Далее можно записать данные в справочник "Валюты"

КонецЕсли;

Для POST-запроса логика аналогична, но нужно добавить тело запроса. Например, для отправки JSON:

Запрос = Новый HTTPЗапрос("/api/orders");

Запрос.УстановитьЗаголовок("Content-Type", "application/json");

Запрос.УстановитьЗаголовок("Authorization", "Bearer " + ТокенДоступа);

ТелоЗапроса = Новый ЗаписьJSON;

ТелоЗапроса.УстановитьСтроку("order_id", "12345");

ТелоЗапроса.УстановитьЧисло("amount", 1000);

Запрос.УстановитьТелоИзСтроки(ТелоЗапроса.Записать());

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

Проверьте доступность сервера (ping или telnet)

Убедитесь, что порт открыт (443 для HTTPS, 80 для HTTP)

Получите актуальные данные для авторизации (токен, логин/пароль)

Сформируйте корректное тело запроса (JSON/XML)

Настройте обработку возможных ошибок (таймаут, 404, 500)-->

Обратите внимание: в новых версиях платформы (8.3.20+) рекомендуется использовать объект HTTPЗапрос вместо HTTPСоединение, так как он предоставляет более гибкие настройки (например, работу с куками или редиректами).

⚠️ Внимание: При работе с HTTPS убедитесь, что на сервере 1С установлены актуальные корневые сертификаты. В противном случае запросы к некоторым сайтам (например, государственным) будут блокироваться с ошибкой "Не удалось установить доверие к сертификату".

Обработка ответов и типичные ошибки

После отправки запроса важно корректно обработать ответ сервера. В 1С ответ представлен объектом HTTPОтвет, который содержит:

  • 📌 Код состояния (200 — успех, 404 — не найдено, 500 — ошибка сервера и т.д.).
  • 📜 Заголовки ответа (например, Content-Type, Set-Cookie).
  • 📄 Тело ответа — собственно данные (JSON, XML, текст).

Пример обработки ответа:

Если Ответ.КодСостояния = 200 Тогда

ТекстОтвета = Ответ.ПолучитьТекст();

Попытка

Данные = Новый ЧтениеJSON;

Данные.УстановитьСтроку(ТекстОтвета);

Результат = Данные.Прочитать();

// Обрабатываем результат

Исключение

ЗаписатьЖурналРегистрации(НСтр("ru = 'Ошибка парсинга JSON: '") + ОписаниеОшибки(), УровеньЖурналаОшибка);

КонецПопытки;

Иначе

Сообщить(НСтр("ru = 'Ошибка запроса: '") + Ответ.КодСостояния + " - " + Ответ.ПолучитьТекст());

КонецЕсли;

Распространённые ошибки и их причины:

  • 🚫 401 Unauthorized: неверные данные авторизации (токен, логин/пароль). Проверьте заголовок Authorization.
  • 🚫 403 Forbidden: у учётной записи нет прав на доступ к ресурсу. Обратитесь к администратору API.
  • 🚫 404 Not Found: неверный URL или endpoint. Сверьтесь с документацией.
  • 🚫 500 Internal Server Error: ошибка на стороне сервера. Возможно, некорректные данные в теле запроса.
  • ⏱️ Таймаут: сервер не ответил за отведённое время. Проверьте сеть или увеличьте таймаут в настройках соединения.

Для отладки полезно логировать не только код состояния, но и полный текст ответа (включая заголовки). Это поможет быстрее найти причину проблемы. Например, некоторые API возвращают детальное описание ошибки в теле ответа даже при коде 4xx/5xx.

⚠️ Внимание: Если вы работаете с API, который требует OAuth 2.0, убедитесь, что токен доступа не просрочен. Многие сервисы (например, Яндекс.Касса или Тинькофф Банк) выдают токены с ограниченным сроком действия (обычно 1 час). В таком случае нужно реализовать механизм автоматического обновления токена.

Практические примеры использования HTTP-запросов в 1С

Разберём несколько реальных сценариев, где HTTP-запросы в 1С решают бизнес-задачи.

1. Интеграция с маркетплейсами (Wildberries, Ozon, Яндекс.Маркет)

Задача: автоматически получать список новых заказов с маркетплейса и создавать на их основе документы Заказ покупателя в 1С.

Решение:

  1. Настроить GET-запрос к API маркетплейса (например, /api/v1/orders) с параметрами даты.
  2. Обработать ответ (обычно JSON) и создать документы в 1С.
  3. Отправить POST-запрос с подтверждением статуса ("Принят в работу").

Пример кода для получения заказов:

Функция ПолучитьЗаказыСWildberries(ДатаНачала, ДатаОкончания)

Соединение = Новый HTTPСоединение("suppliers-api.wildberries.ru", 443, Истина);

Запрос = Новый HTTPЗапрос("/api/v1/orders?dateFrom=" + Формат(ДатаНачала, "ДФ=yyyy-MM-dd") + "&dateTo=" + Формат(ДатаОкончания, "ДФ=yyyy-MM-dd"));

Запрос.УстановитьЗаголовок("Authorization", "Bearer " + ТокенWB);

Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда

Возврат ЧтениеJSON.Прочитать(Ответ.ПолучитьТекст());

Иначе

Возврат Неопределено;

КонецЕсли;

КонецФункции

2. Обновление курсов валют из ЦБ РФ

Задача: ежедневно актуализировать курсы валют в справочнике Валюты.

Решение: отправить GET-запрос на сайт ЦБ (www.cbr.ru/scripts/XML_daily.asp), спарсить XML-ответ и обновить данные в 1С.

3. Отправка SMS-уведомлений через сервис (SMS.ru, SMSAero)

Задача: отправлять клиентам SMS о статусе заказа.

Решение: использовать POST-запрос к API SMS-сервиса с параметрами номера телефона и текста сообщения.

Функция ОтправитьSMS(НомерТелефона, Текст)

Соединение = Новый HTTPСоединение("sms.ru", 443, Истина);

Запрос = Новый HTTPЗапрос("/sms/send");

Тело = Новый Структура();

Тело.Вставить("api_id", "ВАШ_API_ID");

Тело.Вставить("to", НомерТелефона);

Тело.Вставить("text", Текст);

Тело.Вставить("json", 1);

Запрос.УстановитьТело(Новый ЗаписьJSON(Тело).Записать());

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

Возврат Ответ.КодСостояния = 200;

КонецФункции

4. Работа с API банков (Тинькофф, Сбербанк, Альфа-Банк)

Задача: получать выписки по счёту или отправлять платежные поручения.

Решение: использовать GET для выписок и POST для платежей. Банковские API обычно требуют сложную авторизацию (OAuth 2.0, электронная подпись).

Во всех этих сценариях HTTP-запросы позволяют автоматизировать рутинные операции, сократить ошибки и ускорить обработку данных. Главное — правильно обработать возможные ошибки и обеспечить идempotentность (повторная отправка того же запроса не должна дублировать данные).

Как обеспечить idempotentность запросов?

Idempotentность означает, что повторный запрос с теми же параметрами не приведёт к дублированию действий. Для этого используйте:

1. Уникальные идентификаторы транзакций (например, UUID).

2. Проверку на существование записи перед созданием.

3. Заголовок Idempotency-Key (поддерживается некоторыми API, например Stripe).

В 1С можно реализовать журнал отправленных запросов, чтобы отслеживать дубли.

Безопасность и оптимизация HTTP-запросов в 1С

При работе с HTTP-запросами в 1С нельзя игнорировать вопросы безопасности и производительности. Вот ключевые моменты:

1. Безопасность

  • 🔒 Используйте HTTPS: никогда не отправляйте чувствительные данные (токены, пароли) по незащищённому протоколу HTTP.
  • 🔑 Храните токены безопасно: не жестко прописывайте их в коде. Используйте ХранилищеЗначений или внешние конфигурационные файлы с ограниченным доступом.
  • 🛡️ Проверяйте сертификаты: отключение проверки сертификатов (Соединение.ИгнорироватьОшибкиСертификата = Истина) уязвимо для MITM-атак. Используйте только в тестовых средах.
  • 🧹 Очищайте заголовки: не передавайте лишние заголовки (например, User-Agent по умолчанию может выдавать версию 1С).

2. Оптимизация

  • Кэшируйте ответы: если данные редко меняются (например, курсы валют), сохраняйте их в кэш на несколько часов.
  • ⏱️ Настройте таймауты: слишком большие таймауты блокируют выполнение, слишком маленькие приводят к ошибкам. Оптимальное значение — 30-60 секунд.
  • 🔄 Используйте пулы соединений: в 1С 8.3.20+ поддерживается повторное использование соединений для уменьшения накладных расходов.
  • 📦 Сжимайте данные: для больших запросов используйте сжатие (Content-Encoding: gzip).

Пример оптимизированного кода с кэшированием:

Функция ПолучитьКурсВалюты(КодВалюты, ПринудительноеОбновление = Ложь) Экспорт

Кэш = Новый Структура();

Если НЕ ПринудительноеОбновление И ХранилищеЗначений.Существует("КурсыВалют_Кэш") Тогда

Кэш = ХранилищеЗначений.Получить("КурсыВалют_Кэш");

Если Кэш.ВремяАктуальности > ТекущаяДата() Тогда

Возврат Кэш.Данные[КодВалюты];

КонецЕсли;

КонецЕсли;

// Логика запроса к API ЦБ

Курсы = ПолучитьКурсыСЦБ();

Кэш.Вставить("Данные", Курсы);

Кэш.Вставить("ВремяАктуальности", ТекущаяДата() + 3600); // Кэш на 1 час

ХранилищеЗначений.Сохранить("КурсыВалют_Кэш", Кэш);

Возврат Курсы[КодВалюты];

КонецФункции

Для критических интеграций (например, с банками) рекомендуется реализовать логирование всех запросов и ответов в отдельный регистр сведений. Это поможет быстро найти причину сбоя и восстановить данные.

⚠️ Внимание: При работе с API, которые требуют электронной подписи (например, Диадок, Контур), убедитесь, что на сервере 1С установлены все необходимые криптопровайдеры (например, КриптоПро CSP). Без этого подпись запросов будет невозможна.

Альтернативные способы обмена данными в 1С

HTTP-запросы — не единственный способ интеграции 1С с внешними системами. В зависимости от задачи могут быть более подходящие варианты:

Способ обмена Когда использовать Плюсы Минусы
HTTP/API Обмен с веб-сервисами, облачными системами Универсальность, поддержка JSON/XML, гибкость Требует стабильного интернета, возможны задержки
Web-сервисы (SOAP) Интеграция с устаревшими системами (например, госуслуги) Стандартизированный протокол, поддержка WSDL Сложнее в настройке, менее гибкий, чем REST
Файловый обмен Обмен с системами без API (например, 1С → 1С) Не требует интернета, простая отладка Низкая скорость, нужны дополнительные скрипты
Прямое подключение к БД Обмен данными между 1С и SQL-базой Высокая скорость, нет ограничений по объёму Риски безопасности, сложность поддержки
Очереди сообщений (RabbitMQ, Kafka) Высоконагруженные системы с асинхронной обработкой Масштабируемость, отказоустойчивость Сложность настройки, требует инфраструктуры

Выбор способа обмена зависит от:

  • 📡 Наличия API у внешней системы.
  • 📦 Объёма данных: для больших выгрузок (миллионы записей) HTTP может быть неэффективен.
  • ⏱️ Требований к скорости: синхронные HTTP-запросы блокируют выполнение, а файlovый обмен — нет.
  • 🔒 Уровня безопасности: прямая работа с БД рискованна, а HTTP с TLS — надёжнее.

Например, для интеграции 1С с Bitrix24 или amoCRM удобнее использовать HTTP/API, а для обмена между двумя базами 1С в локальной сети — файловый обмен или прямое подключение через COMСоединение.

💡

HTTP-запросы в 1С оптимальны для интеграции с современными облачными сервисами, но для внутренних задач (например, обмен между базами 1С) часто эффективнее использовать альтернативные методы.

FAQ: Частые вопросы по HTTP-запросам в 1С

Как отправить файл через HTTP-запрос в 1С?

Для отправки файла (например, изображения или PDF) используйте POST-запрос с типом multipart/form-data. Пример:

Запрос = Новый HTTPЗапрос("https://example.com/upload");

Запрос.УстановитьЗаголовок("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");

Тело = "------WebKitFormBoundary7MA4YWxkTrZu0gW" + Символы.ПС +

"Content-Disposition: form-data; name=""file""; filename=""document.pdf""" + Символы.ПС +

"Content-Type: application/pdf" + Символы.ПС + Символы.ПС;

// Чтение файла в двоичном формате

ДвоичныеДанные = Новый ДвоичныеДанные("C:\document.pdf");

Тело = Тело + ДвоичныеДанные.ПолучитьПоток().Прочитать() + Символы.ПС +

"------WebKitFormBoundary7MA4YWxkTrZu0gW--";

Запрос.УстановитьТелоИзСтроки(Тело);

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

Для больших файлов лучше использовать потоковую передачу, чтобы не грузить память.

Почему 1С не может подключиться к HTTPS-сайту?

Чаще всего это связано с проблемами сертификатов. Проверьте:

  1. Установлены ли корневые сертификаты на сервере 1С (например, DigiCert или Let's Encrypt).
  2. Не просрочен ли сертификат на целевом сайте (можно проверить через браузер).
  3. Не блокирует ли фаервол или антивирус исходящие соединения.

Временное решение для тестов (НЕ для продакшена!):

Соединение.ИгнорироватьОшибкиСертификата = Истина;
Как обработать ответ в формате JSON?

Используйте объект ЧтениеJSON:

Чтение = Новый ЧтениеJSON;

Чтение.УстановитьСтроку(Ответ.ПолучитьТекст());

Данные = Чтение.Прочитать();

Если JSON содержит массивы, используйте цикл:

Для Каждого Элемент Из Данные.orders Цикл

Сообщить(Элемент.id);

КонецЦикла;

Для сложных структур удобно использовать валидаторы JSON, чтобы понять формат данных.

Как отправить запрос с авторизацией по OAuth 2.0?

Обычно требуется:

  1. Получить токен доступа (через POST-запрос на endpoint /oauth/token).
  2. Передать токен в заголовке Authorization: Bearer {токен}.
  3. Обновлять токен по истечении срока действия (параметр expires_in в ответе).

Пример получения токена:

Запрос = Новый HTTPЗапрос("https://api.example.com/oauth/token");

Запрос.УстановитьЗаголовок("Content-Type", "application/x-www-form-urlencoded");

Тело = "grant_type=client_credentials" +

"&client_id=" + КодироватьСтроку(ИдентификаторКлиента) +

"&client_secret=" + КодироватьСтроку(СекретКлиента);

Запрос.УстановитьТелоИзСтроки(Тело);

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

Токен = ЧтениеJSON.Прочитать(Ответ.ПолучитьТекст()).access_token;

Можно ли отправить HTTP-запрос из тонкого клиента 1С?

Да, но