# Обмен 1С с сайтом: HTTP-сервис или OData, авторизация и частые ошибки

> Для обмена сайта с 1С есть два пути: стандартный интерфейс OData для простого чтения и записи объектов и собственный HTTP-сервис для своей логики. Базу нельзя открывать в интернет напрямую: нужен прокси с ограничениями, отдельный пользователь с узкой ролью и обмен с повторами и защитой от дублей.

Дата: 2026-10-30 · Источник: https://oneswitch.ru/blog/obmen-1s-s-sajtom-http-servis-odata/

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

## Два способа: OData и HTTP-сервис

| | **OData (стандартный интерфейс)** | **HTTP-сервис** |
|---|---|---|
| Что это | Встроенный REST-подобный доступ к объектам конфигурации | Свои методы с вашей логикой |
| Когда выбирать | Простые чтение и запись справочников и документов | Нужна своя обработка: расчёты, проверки, сборка ответа под сайт |
| Настройка | Включить состав стандартного интерфейса OData и опубликовать базу | Создать объект «HTTP-сервис», написать обработчики, опубликовать |
| Минусы | Отдаёт структуру 1С как есть, тяжёлые выборки, неудобные имена | Нужно писать и сопровождать код |

Практическое правило: **для каталога и остатков чаще удобнее свой HTTP-сервис** с компактным ответом, а OData годится для быстрых прототипов и административных задач.

## OData: пример чтения из Python

После включения OData и публикации базы объекты доступны по адресу вида `http://сервер/база/odata/standard.odata/Catalog_Номенклатура`.

```python
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:

```bsl
Функция Товары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С должна понять, что заказ уже есть, а не создать дубль.
2. **Очередь и повторы.** Не пишите в 1С прямо из обработчика на сайте. Сохраняйте заказ у себя и передавайте в 1С отдельным процессом с повторными попытками.
3. **Статус обмена.** Храните у каждого заказа признак «передан в 1С» и время. Это позволит найти потерянные и увидеть сбои.
4. **Не блокируйте пользователя.** Если 1С недоступна, сайт должен принять заказ и передать позже.
5. **Версии и совместимость.** Меняя формат ответа, сохраняйте старые поля или версионируйте методы (`/v1/`, `/v2/`).
6. **Логи.** Пишите в журнал каждый вызов и ошибку, иначе разбор сбоев превращается в угадывание.

## Типичные ошибки

- **Кодировка.** Отправляйте и принимайте JSON в UTF-8 и явно указывайте её в заголовке.
- **Тяжёлые выборки.** Запрос «все товары» с реквизитами и остатками вешает сеанс. Делайте страницы и отдельный метод остатков.
- **Сеансы и лицензии.** Каждое обращение использует сеанс базы: проверьте лицензирование и настройте тайм-ауты.
- **Часовые пояса и даты.** Передавайте даты в едином формате и часовом поясе.
- **Изменили конфигурацию.** После обновления проверьте, что методы опубликованы, права на месте и формат не изменился.

## Что дальше

Если нужно связать 1С с сайтом, интернет-магазином, Telegram и другими сервисами, подробности в разделе [«1С и учётные системы»](/uslugi/1c/) и в услуге [«Интеграции и API»](/uslugi/integracii-i-api/). Родственные темы: [отправка сообщений из 1С в Telegram](/blog/otpravka-soobshchenij-iz-1s-v-telegram/).

## Частые вопросы

### Что лучше для сайта: OData или HTTP-сервис?

Для быстрого прототипа и административных задач подойдёт OData. Для рабочего обмена с каталогом, остатками и заказами чаще удобнее HTTP-сервис с компактным ответом.

### Можно ли подключить сайт к 1С без прямого доступа из интернета?

Да, и это правильнее. Держите 1С во внутренней сети и вызывайте её через прокси с ограничением по IP или через отдельный сервис-посредник, который сам обращается к 1С.

### Как избежать дублей заказов?

Передавайте уникальный идентификатор заказа и проверяйте его на стороне 1С перед созданием документа.

### Что делать, если 1С временно недоступна?

Принимайте заказ на сайте, храните его в очереди и повторяйте передачу, пока не получите подтверждение.
