Как связать 1С с другими системами: HTTP, SOAP, COM, очереди и ODBC
Содержание
Для интеграции 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С через 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
- Установите платформу той же разрядности, что и вызывающая программа. 64-битный Python не увидит 32-битную компоненту.
- Зарегистрируйте
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С
- Регламентное задание раз в 10–60 секунд забирает пачку сообщений, например по 100 штук.
- Каждое сообщение записывается в регистр сведений «входящая очередь» со статусом и идентификатором.
- Отдельная процедура разбирает записи и создаёт документы.
- Подтверждение брокеру отправляется только после записи в регистр.
Такая схема даёт идемпотентность: повторное сообщение с тем же идентификатором не создаст второй документ.
⚠️ Не создавайте документ в той же транзакции, что и чтение из брокера. Ошибка проведения одного заказа тогда откатит всю пачку, и брокер начнёт отдавать её снова и снова.
Прямой доступ к данным: 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, тело, код ответа. Через неделю такой лог отвечает на вопрос «а вы точно отправляли?» за минуту.