Обмен 1С с сайтом: HTTP-сервис или OData, авторизация и частые ошибки
Для обмена сайта с 1С есть два пути: стандартный интерфейс OData для простого чтения и записи объектов и собственный HTTP-сервис для своей логики. Базу нельзя открывать в интернет напрямую: нужен прокси с ограничениями, отдельный пользователь с узкой ролью и обмен с повторами и защитой от дублей.
Сайт и 1С обмениваются данными в двух типовых сценариях: сайт забирает из 1С каталог, цены и остатки, а 1С забирает заказы и заявки с сайта. Разберём два способа и правила, которые не дают обмену превратиться в источник сбоев.
Два способа: OData и HTTP-сервис
| OData (стандартный интерфейс) | HTTP-сервис | |
|---|---|---|
| Что это | Встроенный REST-подобный доступ к объектам конфигурации | Свои методы с вашей логикой |
| Когда выбирать | Простые чтение и запись справочников и документов | Нужна своя обработка: расчёты, проверки, сборка ответа под сайт |
| Настройка | Включить состав стандартного интерфейса OData и опубликовать базу | Создать объект «HTTP-сервис», написать обработчики, опубликовать |
| Минусы | Отдаёт структуру 1С как есть, тяжёлые выборки, неудобные имена | Нужно писать и сопровождать код |
Практическое правило: для каталога и остатков чаще удобнее свой HTTP-сервис с компактным ответом, а OData годится для быстрых прототипов и административных задач.
OData: пример чтения из Python
После включения OData и публикации базы объекты доступны по адресу вида http://сервер/база/odata/standard.odata/Catalog_Номенклатура.
import requests
BASE = "https://example.com/base/odata/standard.odata"
def items(top: int = 10) -> list[dict]:
r = requests.get(
f"{BASE}/Catalog_Номенклатура",
params={"$format": "json", "$top": top},
auth=("integration", "пароль-из-хранилища"),
timeout=20,
)
r.raise_for_status()
return r.json()["value"]
Логин и пароль берите из переменных окружения или хранилища секретов, а не из кода.
HTTP-сервис: пример метода
В конфигураторе создаётся объект «HTTP-сервис» с корневым URL и шаблоном. Обработчик метода возвращает ответ с JSON:
Функция ТоварыGET(Запрос)
Данные = Новый Массив;
// ... заполнение данных из справочника ...
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
Адрес метода формируется как http://сервер/база/hs/корневойURL/шаблон. Проверяйте синтаксис на своей версии платформы.
Правила безопасности
- Не открывайте базу в интернет напрямую. Ставьте перед 1С обратный прокси (например, nginx) с HTTPS и ограничением по IP-адресам сайта.
- Отдельный пользователь для интеграции с минимальной ролью: только те объекты и права, которые нужны обмену.
- HTTPS обязательно. Логин и пароль в Basic-авторизации по HTTP уходят открытым текстом.
- Пароли и токены не хранят в коде. Переменные окружения или хранилище секретов.
- Ограничьте объём выдачи: пагинация и лимиты, чтобы один запрос не загрузил сервер 1С.
Правила надёжности обмена
- Идемпотентность. Каждому заказу присваивайте уникальный идентификатор. Если запрос ушёл повторно, 1С должна понять, что заказ уже есть, а не создать дубль.
- Очередь и повторы. Не пишите в 1С прямо из обработчика на сайте. Сохраняйте заказ у себя и передавайте в 1С отдельным процессом с повторными попытками.
- Статус обмена. Храните у каждого заказа признак «передан в 1С» и время. Это позволит найти потерянные и увидеть сбои.
- Не блокируйте пользователя. Если 1С недоступна, сайт должен принять заказ и передать позже.
- Версии и совместимость. Меняя формат ответа, сохраняйте старые поля или версионируйте методы (
/v1/,/v2/). - Логи. Пишите в журнал каждый вызов и ошибку, иначе разбор сбоев превращается в угадывание.
Типичные ошибки
- Кодировка. Отправляйте и принимайте JSON в UTF-8 и явно указывайте её в заголовке.
- Тяжёлые выборки. Запрос «все товары» с реквизитами и остатками вешает сеанс. Делайте страницы и отдельный метод остатков.
- Сеансы и лицензии. Каждое обращение использует сеанс базы: проверьте лицензирование и настройте тайм-ауты.
- Часовые пояса и даты. Передавайте даты в едином формате и часовом поясе.
- Изменили конфигурацию. После обновления проверьте, что методы опубликованы, права на месте и формат не изменился.
Что дальше
Если нужно связать 1С с сайтом, интернет-магазином, Telegram и другими сервисами, подробности в разделе «1С и учётные системы» и в услуге «Интеграции и API». Родственные темы: отправка сообщений из 1С в Telegram.
Частые вопросы
Что лучше для сайта: OData или HTTP-сервис?
Для быстрого прототипа и административных задач подойдёт OData. Для рабочего обмена с каталогом, остатками и заказами чаще удобнее HTTP-сервис с компактным ответом.
Можно ли подключить сайт к 1С без прямого доступа из интернета?
Да, и это правильнее. Держите 1С во внутренней сети и вызывайте её через прокси с ограничением по IP или через отдельный сервис-посредник, который сам обращается к 1С.
Как избежать дублей заказов?
Передавайте уникальный идентификатор заказа и проверяйте его на стороне 1С перед созданием документа.
Что делать, если 1С временно недоступна?
Принимайте заказ на сайте, храните его в очереди и повторяйте передачу, пока не получите подтверждение.
Версия для ИИ и чтения без оформления: Markdown.