Как связать 1С с другими системами: HTTP, SOAP, COM, очереди и ODBC

· 9 мин

Содержание

Для интеграции 1С:Предприятие 8.3 с внешней системой чаще всего выбирают HTTP-сервис с обменом в JSON: он публикуется на веб-сервере, работает на Windows и Linux и понятен любому разработчику. COM-соединение оставляют для связки двух баз 1С на одном Windows-сервере, OData — для быстрого чтения данных без программирования, а КД 3.0 — для обмена между типовыми конфигурациями.

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

Какой способ интеграции 1С выбрать

Сначала сравните механизмы по задаче, а не по моде. Вот сводка по платформе 8.3:

МеханизмКогда подходитОграничения и риски
HTTP-сервисы (REST)Сайт, мобильное приложение, внешняя CRMНужен веб-сервер и публикация базы
Веб-сервисы SOAPПартнёр требует WSDL, банковские и госсистемыТяжёлый XML, строгая схема
Стандартный интерфейс ODataЧтение справочников и документов без кодаНагрузка на базу, нужно открыть объекты
COM-соединениеОбмен двух баз 1С, скрипты на WindowsТолько Windows, зависит от разрядности
Очереди сообщенийВысокая нагрузка, гарантия доставкиОтдельная инфраструктура (брокер)
ODBC / OLE DBЧтение внешних СУБД из 1СПрямая запись в таблицы 1С недопустима
КД 2.0 / КД 3.0Обмен между конфигурациями 1СНужно сопровождать правила
Что вам нужно связать с 1С?

Интеграция 1С через HTTP-сервисы, SOAP и OData

Все три механизма требуют публикации информационной базы на веб-сервере (Apache или IIS) и установленного модуля расширения веб-сервера 1С. Публикацию делают в Конфигураторе: Администрирование → Публикация на веб-сервере.

HTTP-сервисы: REST-интерфейс к 1С

HTTP-сервисы появились в платформе 8.3.5. В дереве конфигурации это ветка Общие → HTTP-сервисы. У сервиса задают корневой URL, внутри — шаблоны URL вроде /goods/{code} и методы GET, POST, PUT, DELETE.

Адрес вызова собирается так:

https://server/base/hs/api/goods/00-000123

Здесь base — имя публикации, hs — фиксированный префикс HTTP-сервисов, api — корневой URL сервиса.

Пример обработчика GET, который возвращает товар в JSON:

Функция ТоварGET(Запрос)

    Код = Запрос.ПараметрыURL["code"];
    Товар = Справочники.Номенклатура.НайтиПоКоду(Код);

    Если Товар.Пустая() Тогда
        Возврат Новый HTTPСервисОтвет(404);
    КонецЕсли;

    Данные = Новый Структура;
    Данные.Вставить("code", Код);
    Данные.Вставить("name", Строка(Товар));

    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    ЗаписатьJSON(Запись, Данные);

    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Ответ.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8);
    Возврат Ответ;

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

💡 Заведите для обмена отдельного пользователя с ролью, где включено право на HTTP-сервис. Не публикуйте сервис под учётной записью администратора.

Исходящий вызов из 1С во внешнюю систему делается объектами HTTPСоединение и HTTPЗапрос:

Защита = Новый ЗащищенноеСоединениеOpenSSL;
Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30, Защита);
Запрос = Новый HTTPЗапрос("/v1/orders");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
    ЗаписьЖурналаРегистрации("Обмен.CRM", УровеньЖурналаРегистрации.Ошибка, , ,
        "Код ответа: " + Формат(Ответ.КодСостояния, "ЧГ=0"));
КонецЕсли;

Шестой параметр конструктора — таймаут в секундах. Не оставляйте его пустым: зависший внешний сервис повесит сеанс 1С.

Веб-сервисы SOAP

Веб-сервисы старше HTTP-сервисов и нужны там, где контрагент работает строго по WSDL. Описание сервиса отдаётся по адресу https://server/base/ws/ИмяСервиса?wsdl.

Для исходящих вызовов к чужому SOAP-сервису есть два пути:

  • 📥 статическая WS-ссылка — WSDL загружается в конфигурацию, удобно, если схема не меняется;
  • 🔄 динамическая — объект WSОпределения читает WSDL при каждом подключении, а WSПрокси вызывает операции.

Вторая схема переживает смену адреса и версии сервиса без правки конфигурации.

Стандартный интерфейс OData

OData — это REST-доступ к объектам базы без единой строки кода. После публикации с флажком стандартного интерфейса OData данные доступны так:

https://server/base/odata/standard.odata/Catalog_Номенклатура?$format=json

По умолчанию состав интерфейса пустой, поэтому первый запрос часто возвращает пустой список сервиса. Состав задают методом УстановитьСоставСтандартногоИнтерфейсаOData() или обработкой настройки, которая есть в типовых конфигурациях на БСП.

⚠️ OData не знает про ваши права «по смыслу»: если открыть регистр бухгалтерии целиком, внешняя система сможет выгрузить его весь. Открывайте только нужные объекты и давайте пользователю обмена права только на чтение.

COM-соединение и внешние компоненты 1С

COM-соединение запускает внутри стороннего процесса движок 1С без интерфейса. Через него одна база 1С читает и пишет в другую, а скрипт на Python, PowerShell или VBScript работает с объектами 1С напрямую.

Как подключиться к базе через V83.COMConnector

  1. Установите платформу той же разрядности, что и вызывающая программа. 64-битный Python не увидит 32-битную компоненту.
  2. Зарегистрируйте comcntr.dll от имени администратора:
regsvr32 "C:\Program Files\1cv8\8.3.24.1548\bin\comcntr.dll"

Подставьте свою версию платформы из имени каталога. 3. Создайте объект и подключитесь строкой соединения:

Коннектор = Новый COMОбъект("V83.COMConnector");
// Серверная база
База = Коннектор.Connect("Srvr=""srv1c"";Ref=""buh"";Usr=""Обмен"";Pwd=""***"";");
// Файловая база
// База = Коннектор.Connect("File=""D:\Bases\Buh"";Usr=""Обмен"";Pwd=""***"";");

После подключения доступны База.Справочники, База.Документы, База.NewObject("Запрос") и общие модули с флажком «Внешнее соединение».

Каждое COM-соединение занимает лицензию и держит сеанс, пока объект не уничтожен. Обнуляйте переменную подключения сразу после обмена, иначе сеансы копятся до перезапуска процесса.

💡 Для сервера 1С обычно регистрируют компоненту и в COM+ (службы компонентов Windows), чтобы вызовы шли от отдельной учётной записи и не падали из-за прав пользователя.

V83.Application — когда нужен клиент целиком

V83.Application запускает полноценный клиент 1С как OLE-сервер. Это медленнее и тяжелее, чем COMConnector, зато доступны клиентские методы. Для обмена данными его почти не применяют.

Внешние компоненты

Если нужен протокол, которого нет в платформе (особое торговое оборудование, AMQP, нестандартное шифрование), подключают внешнюю компоненту:

  • 🧩 Native API — работает на Windows и Linux, на клиенте и сервере, рекомендуемая технология;
  • 🪟 COM-компоненты — только Windows, наследие старых решений.

Компоненту кладут в общий макет и подключают методом ПодключитьВнешнююКомпоненту(). На клиенте используйте асинхронные варианты методов: веб-клиент синхронные вызовы не поддерживает.

Асинхронный обмен 1С через очереди сообщений

Прямые вызовы HTTP хороши, пока обе стороны доступны. Если сайт принял 500 заказов за минуту, а база 1С в это время обновляется, часть заказов потеряется. Очередь решает эту проблему: отправитель кладёт сообщение в брокер, 1С забирает его, когда готова.

Варианты для 1С

ВариантКак подключаетсяКому подходит
1С:ШинаОбъект «Сервисы интеграции» в конфигурации (платформа 8.3.17 и новее)Тем, кто строит обмены на продуктах 1С
RabbitMQВнешняя компонента AMQP или промежуточный сервисКомандам со смешанным стеком
Kafka и другие брокерыПромежуточный сервис, который передаёт сообщения в HTTP-сервис 1СКрупным ландшафтам

Как устроен обработчик в 1С

  1. Регламентное задание раз в 10–60 секунд забирает пачку сообщений, например по 100 штук.
  2. Каждое сообщение записывается в регистр сведений «входящая очередь» со статусом и идентификатором.
  3. Отдельная процедура разбирает записи и создаёт документы.
  4. Подтверждение брокеру отправляется только после записи в регистр.

Такая схема даёт идемпотентность: повторное сообщение с тем же идентификатором не создаст второй документ.

⚠️ Не создавайте документ в той же транзакции, что и чтение из брокера. Ошибка проведения одного заказа тогда откатит всю пачку, и брокер начнёт отдавать её снова и снова.

Прямой доступ к данным: ODBC и OLE DB

Здесь два разных направления, и путать их опасно.

Из 1С во внешнюю базу — можно и удобно

Для чтения таблиц внешней СУБД в конфигурации есть объект Внешние источники данных (ветка Общие). Он подключается через ODBC: вы описываете таблицы, а дальше пишете к ним обычные запросы 1С.

Второй способ — ADO через COM на Windows:

Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Open("Provider=SQLOLEDB;Data Source=sql01;Initial Catalog=Shop;Integrated Security=SSPI");
Выборка = Соединение.Execute("SELECT id, total FROM orders WHERE status = 'new'");
Пока Не Выборка.EOF Цикл
    Ид = Выборка.Fields("id").Value;
    Сумма = Выборка.Fields("total").Value;
    // создание документа по полученным полям
    Выборка.MoveNext();
КонецЦикла;
Соединение.Close();

Из внешней системы в базу 1С — только на чтение и осторожно

Таблицы 1С в СУБД называются вроде _Reference42 и _Document118, а соответствие метаданным выдаёт функция ПолучитьСтруктуруХраненияБазыДанных(). Имена меняются при реструктуризации, поэтому отчёт, написанный по ним, ломается после обновления.

  • ❌ запись в таблицы в обход платформы ломает итоги регистров и ссылочную целостность;
  • ❌ фирма 1С такой способ не поддерживает;
  • ✅ для записи используйте HTTP-сервис или COM-соединение, для чтения в BI — OData или отдельную реплику.

Обмены между базами: КД 2.0 и КД 3.0

«Конвертация данных» — отдельная конфигурация, в которой описывают, как объекты одной базы превращаются в объекты другой.

КД 2.0КД 3.0
Что на выходеФайл правил XMLКод модуля менеджера обмена
Формат обменаВнутренний XML по правиламEnterpriseData (общий формат)
Где загружаетсяОбработка «Универсальный обмен данными в формате XML» или настройка обменаОбщий модуль в конфигурации или расширении
Где встречаетсяСтарые и нетиповые обменыТиповые обмены БП, УТ, КА, ERP, УНФ

Когда что брать

  • 🔁 Типовые конфигурации на БСП уже обмениваются через EnterpriseData. Сначала проверьте раздел Администрирование → Синхронизация данных: нужный обмен может быть готов.
  • 🛠 Нетиповую базу проще подключить через КД 3.0: она описывает правила только для «своей» стороны, а с типовой общается на общем формате.
  • 📄 КД 2.0 оставьте для разовых переносов и обменов, где правила уже написаны и работают.

💡 Доработки обмена делайте в расширении, а не в основной конфигурации. Тогда обновление типовой не сотрёт ваши правила.

Диагностика и решение проблем интеграции 1С

Начинайте с журнала регистрации базы-приёмника: Администрирование → Обслуживание → Журнал регистрации, отбор по пользователю обмена. Если там пусто — запрос не дошёл до 1С, и искать надо на стороне веб-сервера или сети.

Диагностика: выберите симптом

Если обычных средств не хватает

Когда журнал регистрации молчит, включите технологический журнал через файл logcfg.xml в каталоге conf платформы. Собирайте события EXCP и CALL с отбором по нужной базе.

⚠️ Технологический журнал без отбора за час может занять десятки гигабайт и замедлить сервер. Включайте его на короткое время, с ограничением по сроку хранения, и отключайте сразу после диагностики. Изменение logcfg.xml применяется без перезапуска службы.

Для HTTP-обменов полезно сохранять в регистр сведений каждый входящий запрос: время, URL, тело, код ответа. Через неделю такой лог отвечает на вопрос «а вы точно отправляли?» за минуту.

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

Можно ли интегрировать 1С по COM-соединению на Linux?
Нет. COM — технология Windows. На Linux для той же задачи используют HTTP-сервисы или веб-сервисы.
Нужна ли отдельная лицензия для обмена через HTTP-сервис?
Сеанс веб-сервиса тоже использует клиентскую лицензию, как и COM-соединение. Закладывайте её в расчёт, особенно при частых вызовах.
Что быстрее: OData или свой HTTP-сервис?
Свой HTTP-сервис: вы сами пишете запрос и отдаёте только нужные поля. OData удобна для старта, но при больших выборках заметно нагружает базу.
Можно ли добавить HTTP-сервис, не снимая типовую конфигурацию с поддержки?
Да. HTTP-сервисы можно добавлять в расширение конфигурации. Основная конфигурация остаётся на поддержке.
Как защитить интеграционный адрес 1С, открытый в интернет?
Только HTTPS, отдельный пользователь с минимальной ролью, ограничение доступа по IP на веб-сервере. Публиковать базу без авторизации нельзя.