Как настроить обмен между двумя базами 1С (XML/COM/HTTP)
Обмен данными в 1С обычно делают тремя способами: XML (файловый/регламентный), COM (прямое подключение к другой базе из кода) и HTTP (API по сети). Выбор зависит от того, нужен ли онлайн, одинаковы ли конфигурации и насколько важна устойчивость.
Оглавление
С чего начать: мини‑ТЗ и устойчивость
До кода зафиксируйте (это экономит дни переделок):
- Состав данных: какие справочники/документы/статусы, нужна ли передача удалений.
- Ключи сопоставления: GUID (Ссылка), код, артикул, ИНН+КПП и т. п. (лучше иметь стабильный внешний ключ).
- Направление и конфликты: один источник «главный» или правки в обеих базах; что делать при одновременных изменениях.
- Режим: оффлайн (раз в час/день) или почти онлайн (минуты).
- Эксплуатация: отдельный пользователь, логирование, повторы, ограничения по правам/сети.
Сразу заложите идемпотентность: повторная загрузка одного и того же сообщения не должна создавать дубль. Минимум — таблица соответствий «внешний ключ ↔ ссылка 1С» + проверка версии/даты изменения.
XML: планы обмена, РИБ и свой формат
XML выбирают, когда нужен надёжный регламентный обмен (файл можно переотправить), связь нестабильная или требуется трансформация данных.
Когда использовать планы обмена/РИБ
Подходит, если базы и структура данных одинаковые (типовой сценарий: филиалы). Тогда логика такая:
- регистрируете изменения (план обмена),
- формируете сообщения,
- принимаете и отмечаете обработанные.
Если конфигурации разные и нужна сложная «перекладка» реквизитов, РИБ/планы обмена без доп. прослойки могут стать слишком жёсткими — проще перейти на универсальную выгрузку/загрузку.
Мини‑пример: выгрузка простого 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 для ночной сверки больших справочников.
Как безопаснее хранить доступы?
Отдельный пользователь с минимальными правами, ограничения доступа к настройкам, не хранить пароль в открытом виде в коде/общих формах, логировать только технические детали без секретов.
Как понять, что обмен «живой»?
Нужны: журнал обмена, метрики (сколько пакетов/ошибок), уведомление при превышении времени/числа ошибок и механизм повторов.