Многие разработчики, начиная работу с HTTP-сервисами в 1С, сталкиваются с ситуацией, когда примеры в документации ограничиваются лишь «выдачей» данных наружу: списки номенклатуры, остатки на складах или статусы заказов. Однако современная интеграция требует двустороннего обмена. В этой статье мы подробно разберем, как заставить 1С не просто показывать информацию, но и активно принимать её из внешних систем, таких как CRM (Bitrix24, amoCRM) или маркетплейсы.
Для начала проанализируем механику протокола HTTP. Большинство простых примеров используют метод GET. Он предназначен исключительно для получения информации. Чтобы внешняя система (например, ваша CRM) могла передать в 1С данные о новом заказе, нам необходимо использовать метод POST. Именно этот метод позволяет передать «тело запроса», в котором будет содержаться вся необходимая структура данных в формате JSON или XML.
Рассмотрим стандартный сценарий: в CRM появился заказ. Вместо того чтобы 1С постоянно «опрашивала» CRM с помощью регламентных заданий (что создает лишнюю нагрузку), CRM сама выступает инициатором. Она отправляет POST запрос на опубликованный адрес вашего HTTP-сервиса в 1С, передавая данные заказа. 1С принимает этот запрос, обрабатывает его и мгновенно создает документ в базе.
Разберем по шагам, как создать такой сервис в конфигураторе. Нам потребуется объект HTTPСервис. При создании важно правильно настроить «Шаблон URL». Например, шаблон вида /создать_заказ/* позволит обращаться к сервису по понятному адресу.
Внутри шаблона мы создаем «Метод». В поле «HTTP метод» выбираем POST. Это критически важный момент: если внешняя система пришлет данные методом POST на метод 1С, настроенный как GET, сервер вернет ошибку 405 (Method Not Allowed).
Теперь перейдем к самому главному — написанию кода в модуле HTTP-сервиса. Нам нужно прочитать данные, которые прислала CRM. В 1С для этого используется объект HTTPСервисЗапрос. Разберем типичный пример обработки входящего JSON-пакета:
Функция СоздатьЗаказНаСервере(Запрос)
// Получаем тело запроса в виде строки
СтрокаJSON = Запрос.ПолучитьТелоКакСтроку("UTF-8");
// Подготавливаем чтение JSON
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
// Десериализуем данные в структуру 1С
ДанныеЗаказа = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Начинаем транзакцию для создания документа
НачатьТранзакцию();
Попытка
НовыйЗаказ = Документы.ЗаказКлиента.СоздатьДокумент();
НовыйЗаказ.Дата = ТекущаяДата();
НовыйЗаказ.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(ДанныеЗаказа.ИмяКлиента);
// Заполнение остальных реквизитов из структуры ДанныеЗаказа...
НовыйЗаказ.Записать(РежимЗаписиДокумента.Запись);
ЗафиксироватьТранзакцию();
// Формируем успешный ответ
Ответ = Новый HTTPСервисОтвет(201); // Статус "Created"
Ответ.УстановитьТелоИзСтроки("Заказ успешно создан с номером: " + НовыйЗаказ.Номер);
Исключение
ОтменитьТранзакцию();
// Возвращаем ошибку сервера
Ответ = Новый HTTPСервисОтвет(500);
Ответ.УстановитьТелоИзСтроки("Ошибка при создании заказа: " + ОписаниеОшибки());
КонецПопытки;
Возврат Ответ;
КонецФункции
Выясним причину, по которой внешние системы иногда «ругаются» на 1С, даже если заказ создался. Это происходит из-за неправильных кодов ответа. Если ваша 1С «скушала» данные, она обязана вернуть статус 200 (OK) или 201 (Created). Если данные не прошли валидацию — 400 (Bad Request). Внешняя система ориентируется именно на эти коды, чтобы понять, нужно ли повторять попытку отправки позже.
Проанализируем ситуацию с безопасностью. Выставлять базу 1С напрямую в интернет — плохая практика. Рассмотрим рекомендации профессионалов из обсуждения:
Nginx или Apache в качестве прокладки. Это позволит скрыть реальный IP-адрес сервера 1С и настроить дополнительные фильтры.Basic Auth. Для этого в 1С создается отдельный пользователь с минимальными правами (роль «Удаленный доступ к HTTP-сервисам»), чьи логин и пароль будут передаваться в заголовках запроса от CRM.Многие новички жалуются, что точка останова в коде HTTP-сервиса не срабатывает. Разберем, как правильно настроить отладку:
То, что автор темы называл «чтобы 1С поняла, что нужно забрать данные», в ИТ-мире называется Webhooks. Это современный стандарт. Вместо того чтобы 1С работала как «пылесос», собирая данные по расписанию, она работает как «слушатель». Как только в CRM происходит событие (создание заказа, изменение статуса), CRM сама «стучится» в 1С. Это обеспечивает интеграцию в режиме реального времени и экономит ресурсы сервера.
Посмотрим на пример из жизни маркетплейсов: когда покупатель на Яндекс.Маркете нажимает кнопку «Оплатить», маркет не ждет, пока 1С соизволит проверить заказы. Он мгновенно отправляет запрос в 1С. Если 1С в течение нескольких секунд не подтвердит наличие товара (через ответ вашего HTTP-сервиса), сделка может не состояться. Именно поэтому использование HTTPСервис — самый эффективный метод интеграции на сегодня.