Когда к 1С нужно подключить CRM, сайт, WMS, мобильное приложение, собственный backend или внешний сервис, первым вопросом обычно становится API.
В платформе 1С:Предприятие уже есть стандартный REST-интерфейс, который автоматически предоставляет доступ к объектам прикладного решения. Для этого используется протокол OData версии 3.0, а данные можно получать и изменять через HTTP в форматах JSON или Atom/XML.
Это делает OData одним из самых быстрых способов начать интеграцию с 1С без разработки отдельного API для каждого справочника или документа.
Что такое OData в 1С
OData — открытый веб-протокол для запроса и изменения данных. В 1С он реализован как стандартный REST-интерфейс прикладного решения. После публикации информационной базы внешняя система может обращаться к объектам конфигурации через HTTP.
Платформа позволяет работать через OData с большим количеством объектов конфигурации: справочниками, документами, регистрами, константами, перечислениями и другими объектами, а также выполнять операции чтения, создания, изменения и удаления там, где это поддерживается.
Концептуально интеграция выглядит так:
Внешняя система
↓
HTTP
↓
1С REST / OData
↓
Информационная база 1С
OData — это API 1С?
В практическом смысле OData часто называют API 1С, и для задач интеграции это допустимое упрощение. Точнее говорить, что стандартный интерфейс OData является автоматически формируемым REST-интерфейсом прикладного решения.
В отличие от собственного HTTP-сервиса, разработчику не требуется отдельно описывать endpoint для каждого объекта: после публикации внешняя система получает стандартный способ обращения к доступным объектам конфигурации.
Как выглядит URL OData в 1С
Конкретный URL зависит от имени публикации и информационной базы. Типовая структура выглядит примерно так:
https://example.ru/erp/odata/standard.odata/
После этого указываются ресурсы, соответствующие объектам прикладного решения. Например:
/Catalog_Номенклатура
/InformationRegister_Цены
/Document_РеализацияТоваровУслуг
Фактические имена ресурсов зависят от конфигурации и публикации. Поэтому перед разработкой интеграции полезно получить метаданные OData и проверить реальные имена объектов.
Метаданные OData
Один из важных плюсов стандартного интерфейса — возможность получить описание доступных объектов. Официальная документация 1С предусматривает получение метаданных стандартного интерфейса OData.
Это позволяет интеграционному клиенту понять структуру доступных сущностей до выполнения конкретных запросов.
GET /odata/standard.odata/$metadata
На практике метаданные особенно полезны на этапе обследования:
- проверить наличие нужного объекта;
- посмотреть доступные поля;
- понять связи между сущностями;
- определить типы данных;
- выявить различия между конфигурациями.
Как получить данные из 1С через OData
Самый простой сценарий — HTTP GET.
GET /odata/standard.odata/Catalog_Номенклатура
Внешний сервис получает список доступных записей в формате, предусмотренном интерфейсом. Для интеграции обычно интереснее не читать весь справочник, а использовать фильтрацию.
$filter: как искать данные в 1С
OData поддерживает стандартные условия фильтрации. Например, официальный пример 1С показывает фильтр по числовому полю:
GET /OData_Tests_Infobase/odata/standard.odata/Catalog_Goods?$filter=Price le 3.5 or Price gt 200
В реальной интеграции фильтр позволяет получать только необходимые записи вместо полной выгрузки справочника.
Концептуально запрос может выглядеть так:
GET /odata/standard.odata/Catalog_Номенклатура?
$filter=Артикул eq 'ABC-001'
При использовании OData важно учитывать фактические имена полей и типы данных конкретной конфигурации.
$top и $skip: постраничная обработка
Если в справочнике сотни тысяч элементов, нельзя проектировать интеграцию по принципу «каждый запуск скачиваем всё».
Для ограничения количества записей используются параметры вроде $top и
$skip; эти параметры описаны в документации стандартного интерфейса OData 1С.
GET /odata/standard.odata/Catalog_Номенклатура?
$top=1000&$skip=2000
Но для больших интеграций одной постраничной выборки недостаточно. Лучше строить инкрементальный обмен по признаку изменения или другой бизнес-метке, если конфигурация позволяет надёжно её использовать.
$orderby: сортировка
Если порядок данных имеет значение для клиента, можно использовать $orderby.
Важно заранее определить стабильное поле сортировки, особенно если результаты читаются
порциями.
GET /odata/standard.odata/Catalog_Номенклатура?
$orderby=Code
При построении большого обмена желательно избегать логики, которая зависит от нестабильного порядка строк между запросами.
$count: сколько записей
Стандартный интерфейс предусматривает параметры для получения количества записей.
В зависимости от версии платформы и конкретного режима работы могут использоваться
$count или связанные с ним параметры, описанные в документации OData 1С.
Количество данных полезно получать отдельно от самих данных, если клиенту нужно построить пагинацию или оценить объём обмена.
$expand: связанные данные
В бизнес-системах данные редко существуют изолированно. Например, у документа есть контрагент, у строки документа — номенклатура, у номенклатуры — единица измерения.
Для работы со связанными объектами стандартный интерфейс OData поддерживает параметр
$expand. Он входит в набор параметров запроса, описанный в документации 1С.
GET /odata/standard.odata/Document_ЗаказКлиента?
$expand=Контрагент
Это удобно, но именно здесь нужно внимательно следить за объёмом ответа. Не следует без необходимости строить огромные вложенные запросы.
Как создать объект через OData
OData в 1С предназначен не только для чтения. Стандартный REST-интерфейс позволяет создавать и изменять данные прикладного решения, а также выполнять некоторые действия, доступные через интерфейс.
Концептуально создание объекта выглядит как HTTP POST:
POST /odata/standard.odata/Catalog_Контрагенты
Content-Type: application/json
{
"Description": "ООО Ромашка",
"ИНН": "7700000000"
}
Но здесь есть важная оговорка: реальный набор обязательных реквизитов, ссылочных полей, обработчиков и бизнес-правил определяется конкретной конфигурацией. Поэтому универсального JSON, одинаково работающего во всех 1С, нет.
Можно ли изменять данные через OData
Да. Официальная документация прямо указывает, что REST-интерфейс позволяет читать, изменять, создавать и удалять данные прикладного решения в рамках доступных операций. При чтении и записи выполняются обычные проверки прав, а при изменении вызываются обработчики событий, за исключением проверки заполнения.
Именно поэтому OData нельзя считать безрисковым read-only API. Если учётная запись имеет права на изменение, внешний клиент способен инициировать реальные изменения в информационной базе.
Проведение документов через OData
REST-интерфейс 1С предусматривает не только CRUD для объектов, но и некоторые действия, включая проведение документа и запуск бизнес-процесса.
Это позволяет построить интеграцию, в которой внешняя система не только передаёт данные в 1С, но и запускает определённый бизнес-сценарий.
Однако для критичных операций лучше сначала определить явный бизнес-контракт:
Внешняя система
↓
Проверка данных
↓
1С Business API
↓
Документ
↓
Проведение
↓
Результат
Если операция сложная, собственный HTTP-сервис часто оказывается безопаснее и понятнее стандартного доступа к объектам.
OData vs HTTP-сервис 1С
Это один из главных архитектурных вопросов. В 1С есть отдельный механизм HTTP-сервисов, где разработчик самостоятельно определяет URL-шаблоны, HTTP-методы, обработчики и формат ответа.
| Задача | OData | Собственный HTTP-сервис |
|---|---|---|
| Получить справочник | Подходит | Избыточно |
| Прочитать документ | Подходит | Подходит |
| CRUD-интеграция | Подходит | Подходит |
| Сложный бизнес-сценарий | Не всегда удобен | Обычно лучше |
| Единый бизнес-контракт | Ограниченно | Да |
| Скрыть внутреннюю структуру 1С | Сложнее | Проще |
| Специальная валидация | Ограниченно | Да |
Хорошее практическое правило:
Почему прямой доступ к OData не всегда хорошая архитектура
Главный недостаток OData в enterprise-интеграции — внешний клиент начинает зависеть от внутренней модели конфигурации.
Например:
CRM
↓
Catalog_Контрагенты
↓
Catalog_Номенклатура
↓
Document_ЗаказКлиента
↓
Document_РеализацияТоваровУслуг
Такая интеграция знает слишком много о структуре 1С. При изменении конфигурации, расширении или переходе на другую конфигурацию приходится менять внешний код.
Поэтому для долгоживущего enterprise-контура лучше использовать слой абстракции:
CRM / WMS / Website
↓
Integration Layer
↓
Business API
↓
1С OData / HTTP-сервис
Тогда OData становится внутренним транспортным механизмом, а не публичным контрактом всей корпоративной архитектуры.
Symfony + 1С OData
Symfony хорошо подходит для создания такого Integration Layer. Внешнее приложение может работать с OData через HTTP-клиент, преобразуя ответ 1С в собственные DTO и бизнес-модели.
1С
↓
OData
↓
Symfony Integration Service
↓
DTO / Validation / Mapping
↓
CRM / WMS / API / PostgreSQL
Например, вместо передачи структуры конкретного справочника 1С наружу можно получить:
final class CounterpartyDto
{
public function __construct(
public readonly string $id,
public readonly string $name,
public readonly ?string $inn,
public readonly ?string $kpp,
) {}
}
После этого CRM уже работает с собственным контрактом, а не с физической структурой 1С.
PHP: запрос к OData
Для PHP интеграционный клиент может быть построен поверх обычного HTTP-клиента. Например, концептуально:
$response = $httpClient->request(
'GET',
$baseUrl . '/odata/standard.odata/Catalog_Контрагенты',
[
'auth_basic' => [$username, $password],
'query' => [
'$filter' => "ИНН eq '7700000000'",
'$top' => 10,
],
]
);
$data = $response->toArray();
Конкретная аутентификация зависит от публикации и настроек 1С. Не следует зашивать этот пример в production без настройки TLS, прав доступа, таймаутов и обработки ошибок.
Go + 1С OData
Для интеграционного gateway на Go принцип тот же:
HTTP Client
↓
OData
↓
JSON
↓
DTO
↓
Business Service
↓
Queue / PostgreSQL / API
Go особенно удобен, если через один сервис нужно обслуживать несколько внешних API и большое количество асинхронных задач.
Аутентификация и безопасность
Способы аутентификации OData-клиентов совпадают со способами, используемыми для веб-сервисов публикации.
При проектировании интеграции важно:
- не публиковать 1С напрямую в интернет без необходимости;
- использовать HTTPS;
- создать отдельную техническую учётную запись;
- выдать ей минимально необходимые права;
- ограничить сетевой доступ;
- не хранить пароли в Git;
- контролировать журнал запросов;
- не логировать чувствительные данные без необходимости.
Особенно важно учитывать, что OData способен не только читать, но и изменять данные. Поэтому техническая учётная запись с широкими правами превращает API в потенциально опасную точку входа.
Производительность OData
Главная ошибка интеграции — воспринимать OData как бесконечный поток данных:
Каждые 5 минут
↓
Скачать весь справочник
↓
Скачать все документы
↓
Сравнить всё с прошлым запуском
Такая архитектура быстро начинает создавать нагрузку на 1С.
Лучше:
- использовать фильтры;
- ограничивать количество полей и связанных данных, когда это возможно;
- использовать пагинацию;
- делать инкрементальный обмен;
- кэшировать неизменяемые данные;
- переносить тяжёлую аналитику из оперативного контура;
- использовать очередь для массового обмена.
Почему не стоит строить аналитическое хранилище на OData
OData удобен как интерфейс интеграции, но это не значит, что он должен использоваться как постоянный источник для тяжёлой аналитики.
Архитектура:
BI
↓
OData
↓
1С
↓
Сложный запрос
↓
Большой объём данных
может создать лишнюю нагрузку на оперативную систему.
Для аналитики разумнее строить отдельный контур:
1С
↓
Integration Layer
↓
ETL / Queue
↓
PostgreSQL / DWH
↓
BI / AI
OData и AI: можно ли дать LLM доступ к 1С
Технически можно построить LLM-инструмент, который обращается к OData. Архитектурно это не означает, что модели нужно давать прямой доступ ко всему OData API.
Лучше предоставить ограниченный набор business tools:
get_counterparty()
get_product()
get_customer_orders()
get_sales()
get_stock()
get_production_orders()
Внутри инструмента уже решается, какие запросы выполнить к 1С:
LLM
↓
Business Tool
↓
Validation
↓
OData / HTTP API
↓
1С
↓
Result
↓
LLM
Такой подход отделяет естественный язык от физической структуры базы и API. Подробнее о причинах, по которым LLM не стоит напрямую подключать к SQL и внутренней структуре 1С, мы разбирали отдельно.
OData, HTTP-сервис или SQL?
На практике эти три подхода решают разные задачи.
| Подход | Назначение |
|---|---|
| OData | Стандартный доступ к объектам прикладного решения |
| HTTP-сервис 1С | Собственный бизнес-контракт и операции |
| SQL | Низкоуровневый доступ к данным конкретной СУБД; не должен использоваться как публичный бизнес API |
Для интеграции с внешней системой обычно предпочтительнее OData или собственный HTTP-сервис. Прямой доступ к физическим таблицам 1С создаёт сильную зависимость от внутренней реализации и обходит прикладной API.
Когда OData подходит идеально
Когда лучше сделать собственный HTTP API
Собственный HTTP-сервис предпочтительнее, если внешней системе не нужны сами объекты 1С, а нужна конкретная операция.
Например:
POST /api/orders/{id}/reserve
POST /api/orders/{id}/confirm
POST /api/shipments/{id}/create
GET /api/customers/{id}/balance
Здесь внешний клиент работает с бизнес-сущностями и действиями, а не с внутренней структурой конфигурации.
Платформа 1С специально предоставляет возможность создавать собственные HTTP-сервисы, где разработчик самостоятельно определяет HTTP-методы, URL и обработку запросов.
Архитектура enterprise-интеграции с 1С
┌─────────────┐
│ CRM │
└──────┬──────┘
│
┌──────▼──────────────┐
│ Integration Layer │
│ Symfony / Go │
│ Mapping / Security │
└──────┬──────────────┘
│
┌─────┴──────┐
▼ ▼
OData HTTP API
│ │
└──────┬─────┘
▼
┌──────────┐
│ 1С │
└────┬─────┘
│
├── ERP
├── WMS
├── Production
└── Accounting
Integration Layer
│
▼
Queue → PostgreSQL → Analytics / AI
Здесь OData используется там, где он действительно удобен, но не становится единственным контрактом всей архитектуры.
Типичные ошибки при интеграции через OData
| Ошибка | Последствие |
|---|---|
| Скачивать весь справочник при каждом запуске | Лишняя нагрузка на 1С и сеть |
| Использовать OData как публичную бизнес-модель | Внешние системы жёстко зависят от структуры конфигурации |
| Давать техническому пользователю лишние права | Внешняя система получает избыточный доступ |
| Не использовать пагинацию | Большие ответы и таймауты |
| Игнорировать $filter | Передаются данные, которые клиенту не нужны |
| Слишком активно использовать $expand | Ответы становятся тяжёлыми |
| Строить BI напрямую через OData | Аналитика создаёт нагрузку на оперативную 1С |
| Давать LLM полный доступ к OData | AI получает слишком широкий доступ к бизнес-данным |
Минимальный MVP интеграции 1С через OData
Для первого этапа не нужно строить огромный integration platform. Достаточно одного бизнес-сценария.
Итог
1С OData — удобный стандартный механизм интеграции, который позволяет внешним системам обращаться к объектам прикладного решения через HTTP. Платформа использует OData 3.0 в стандартном REST-интерфейсе и поддерживает операции чтения и изменения данных, а также ряд дополнительных действий.
Для простого обмена OData часто является самым быстрым способом начать интеграцию. Но для долгоживущего enterprise-решения не стоит превращать структуру OData в публичный контракт всех систем компании.
Оптимальная архитектура обычно выглядит так:
CRM / WMS / Website / AI
↓
Integration Layer
↓
┌────────┴────────┐
▼ ▼
OData HTTP-сервис
│ │
└────────┬────────┘
▼
1С
│
▼
Business Data
OData хорошо работает как стандартный транспорт к 1С. Но бизнес-контракт лучше строить выше него.