Как настроить обмен между двумя базами 1С (XML/COM/HTTP)

Обмен данными в 1С обычно делают тремя способами: XML (файловый/регламентный), COM (прямое подключение к другой базе из кода) и HTTP (API по сети). Выбор зависит от того, нужен ли онлайн, одинаковы ли конфигурации и насколько важна устойчивость.

Оглавление

С чего начать: мини‑ТЗ и устойчивость

До кода зафиксируйте (это экономит дни переделок):

  • Состав данных: какие справочники/документы/статусы, нужна ли передача удалений.
  • Ключи сопоставления: GUID (Ссылка), код, артикул, ИНН+КПП и т. п. (лучше иметь стабильный внешний ключ).
  • Направление и конфликты: один источник «главный» или правки в обеих базах; что делать при одновременных изменениях.
  • Режим: оффлайн (раз в час/день) или почти онлайн (минуты).
  • Эксплуатация: отдельный пользователь, логирование, повторы, ограничения по правам/сети.

Сразу заложите идемпотентность: повторная загрузка одного и того же сообщения не должна создавать дубль. Минимум — таблица соответствий «внешний ключ ↔ ссылка 1С» + проверка версии/даты изменения.

XML: планы обмена, РИБ и свой формат

XML выбирают, когда нужен надёжный регламентный обмен (файл можно переотправить), связь нестабильная или требуется трансформация данных.

Когда использовать планы обмена/РИБ

Подходит, если базы и структура данных одинаковые (типовой сценарий: филиалы). Тогда логика такая:

  1. регистрируете изменения (план обмена),
  2. формируете сообщения,
  3. принимаете и отмечаете обработанные.

Если конфигурации разные и нужна сложная «перекладка» реквизитов, РИБ/планы обмена без доп. прослойки могут стать слишком жёсткими — проще перейти на универсальную выгрузку/загрузку.

Мини‑пример: выгрузка простого XML

Процедура ВыгрузитьНоменклатуру(Путь) Экспорт
    Зап = Новый ЗаписьXML; Зап.ОткрытьФайл(Путь);
    Зап.ЗаписатьОбъявлениеXML();
    Зап.ЗаписатьНачалоЭлемента("items");

    Выб = Справочники.Номенклатура.Выбрать();
    Пока Выб.Следующий() Цикл
        Зап.ЗаписатьНачалоЭлемента("item");
        Зап.ЗаписатьАтрибут("ref", Строка(Выб.Ссылка));
        Зап.ЗаписатьАтрибут("code", Выб.Код);
        Зап.ЗаписатьТекст(Выб.Наименование);
        Зап.ЗаписатьКонецЭлемента();
    КонецЦикла;

    Зап.ЗаписатьКонецЭлемента(); Зап.Закрыть();
КонецПроцедуры

Практика для объёмов: пакетируйте (например, по 500–2000 записей), храните маркер последней успешной выгрузки, ведите журнал обмена (пакет, направление, время, результат, текст ошибки).

COM и HTTP: прямое подключение и API

COM‑соединение (быстро и «внутри периметра»)

COM удобно, когда нужно из одной базы напрямую прочитать/записать в другую (обычно в одной инфраструктуре). Схема: подключились → выполнили запрос/создали объект → зафиксировали результат.

Функция ПодключитьсяCOM(СтрСоед) Экспорт
    Конн = Новый COMОбъект("V83.COMConnector");
    Возврат Конн.Connect(СтрСоед);
КонецФункции

Процедура Прочитать10Товаров() Экспорт
    Соед = ПодключитьсяCOM("File=""C:\Bases\Trade"";Usr=""Обмен"";Pwd=""***"";");
    Запрос = Соед.NewObject("Запрос");
    Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 10 Ссылка, Код, Наименование ИЗ Справочник.Номенклатура";
    Рез = Запрос.Выполнить().Выбрать();
    Пока Рез.Следующий() Цикл
        // перенос/сопоставление
    КонецЦикла;
КонецПроцедуры

COM часто «ломается» не кодом, а окружением: права, запуск под нужной учетной записью, компоненты, ограничения COM‑контекста. Планируйте мониторинг и понятные сообщения об ошибках.

HTTP (лучше для онлайн и долгоживущих интеграций)

HTTP выбирают, когда нужен онлайн‑обмен, несколько потребителей, или вы хотите стабильный контракт (API). Рекомендации:

  • версионируйте методы (/v1/...);
  • принимайте/отдавайте JSON;
  • делайте операции идемпотентными (например, externalId в теле);
  • ограничивайте права отдельным пользователем и логируйте запросы.

Клиентский пример (POST JSON):

Процедура ОтправитьJSON() Экспорт
    Соед = Новый HTTPСоединение("host", 443,,,,,, Новый ЗащищенноеСоединениеOpenSSL);
    Зап = Новый HTTPЗапрос("/v1/items");
    Зап.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Зап.УстановитьТелоИзСтроки("{""externalId"":""A-100"",""name"":""Товар""}", "UTF-8");
    Ответ = Соед.Выполнить(Зап);
    Если Ответ.КодСостояния >= 300 Тогда
        // лог + повтор по расписанию
    КонецЕсли;
КонецПроцедуры

Частые ошибки

  • Нет ключей сопоставления → дубли справочников. Решение: внешний ключ + таблица соответствий.
  • Передают «всё каждый раз» → объёмы, блокировки, долгие окна обмена. Решение: выгрузка изменений + пакеты.
  • HTTP без версии и контракта → любое изменение ломает вторую сторону. Решение: /v1/, строгие форматы, обратная совместимость.
  • COM используют как постоянный онлайн‑канал → нестабильность при сбоях окружения. Решение: COM для админских задач, а для онлайна — HTTP/очереди.

FAQ

Что выбрать, если конфигурации одинаковые и есть филиалы?
Планы обмена/РИБ или близкий к ним механизм: меньше ручной трансформации и проще сопровождать.

Можно ли комбинировать способы?
Да: например, HTTP для «событий» (заказы/статусы) и XML для ночной сверки больших справочников.

Как безопаснее хранить доступы?
Отдельный пользователь с минимальными правами, ограничения доступа к настройкам, не хранить пароль в открытом виде в коде/общих формах, логировать только технические детали без секретов.

Как понять, что обмен «живой»?
Нужны: журнал обмена, метрики (сколько пакетов/ошибок), уведомление при превышении времени/числа ошибок и механизм повторов.