İki 1C veritabanı arasında değişim nasıl kurulur (XML/COM/HTTP)

Kerem Aydın·24 Haziran 2026·⏱3 dk

1C'de veri değişimi genellikle üç şekilde yapılır: XML (dosya tabanlı/zamanlanmış), COM (kod içinden diğer veritabanına doğrudan bağlantı) ve HTTP (ağ üzerinden API). Seçim; çevrimiçi ihtiyaca, yapılandırmaların aynı olup olmadığına ve dayanıklılığın ne kadar önemli olduğuna bağlıdır.

İçindekiler

Nereden başlamalı: Mini gereksinim ve dayanıklılık

Kodlamadan önce şunları sabitleyin (bu, günlerce süren yeniden düzenlemeleri önler):

  • Veri kapsamı: Hangi kataloglar/belgeler/durumlar, silme işlemlerinin aktarılması gerekiyor mu?
  • Eşleştirme anahtarları: GUID (Bağlantı), kod, ürün kodu, TIN+VKN vb. (tercihen kararlı bir harici anahtara sahip olun).
  • Yön ve çakışmalar: Tek bir kaynak "ana" mı yoksa her iki veritabanında da düzenleme var mı; eşzamanlı değişikliklerde ne yapılmalı?
  • Çalışma modu: Çevrimdışı (saatte/günde bir) mi yoksa neredeyse çevrimiçi (dakikalar içinde) mi?
  • İşletim: Ayrı bir kullanıcı, günlük kaydı, yeniden denemeler, yetki/ağ kısıtlamaları.

Baştan idempotentliği (tekrarlanabilirliği) planlayın: Aynı mesajın tekrar yüklenmesi yinelenen kayıt oluşturmamalıdır. En azından "harici anahtar ↔ 1C bağlantısı" eşleştirme tablosu + sürüm/değişiklik tarihi kontrolü yapın.

XML: Değişim planları, RIB ve özel format

Güvenilir zamanlanmış bir değişime ihtiyaç duyulduğunda (dosya yeniden gönderilebilir), bağlantı kararsız olduğunda veya veri dönüşümü gerektiğinde XML tercih edilir.

Değişim planları/RIB ne zaman kullanılır?

Veritabanları ve veri yapısı aynıysa uygun olur (tipik senaryo: şubeler). Mantık şöyledir:

  1. Değişimleri kaydedersiniz (değişim planı),
  2. Mesajları oluşturursunuz,
  3. Kabul eder ve işlenenleri işaretlersiniz.

Yapılandırmalar farklıysa ve karmaşık özellik "dönüşümü" gerekiyorsa, ek bir ara katman olmadan RIB/değişim planları çok katı hale gelebilir — evrensel dışa/içe aktarım yöntemine geçmek daha kolaydır.

Mini örnek: Basit bir XML dışa aktarma

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

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

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

Büyük hacimler için uygulama: Paketleme yapın (örneğin, 500–2000 kayıt), son başarılı dışa aktarma işaretçisini saklayın, değişim günlüğü tutun (paket, yön, zaman, sonuç, hata metni).

COM ve HTTP: Doğrudan bağlantı ve API

COM bağlantısı (hızlı ve "perimeter içinde")

Bir veritabanından diğerine doğrudan okuma/yazma gerektiğinde COM uygundur (genellikle aynı altyapıda). Şema: Bağlanıldı → Sorgu çalıştırıldı/nesne oluşturuldu → Sonuç kaydedildi.

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

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

COM genellikle kodla değil, ortamla ilgili sorunlardan dolayı "bozulur": Yetkiler, doğru kullanıcı hesabıyla çalıştırma, bileşenler, COM bağlamı kısıtlamaları. İzlemeyi ve anlaşılır hata mesajlarını planlayın.

HTTP (çevrimiçi ve uzun ömürlü entegrasyonlar için daha iyi)

Çevrimiçi değişim, birden fazla tüketici veya kararlı bir sözleşme (API) istendiğinde HTTP tercih edilir. Öneriler:

  • Yöntemleri sürümlendirin (/v1/...);
  • JSON kabul edin/gönderin;
  • İşlemleri idempotent yapın (örneğin, gövdede externalId);
  • Yetkileri ayrı bir kullanıcıyla sınırlayın ve istekleri günlüğe kaydedin.

İstemci örneği (POST JSON):

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

Sık yapılan hatalar

  • Eşleştirme anahtarlarının olmaması → Kataloglarda yinelenen kayıtlar. Çözüm: Harici anahtar + eşleştirme tablosu.
  • "Her seferinde her şeyin" aktarılması → Hacim sorunları, kilitlemeler, uzun değişim pencereleri. Çözüm: Değişikliklerin dışa aktarımı + paketleme.
  • Sürüm ve sözleşme olmadan HTTP → Herhangi bir değişiklik diğer tarafı bozar. Çözüm: /v1/, sıkı formatlar, geriye dönük uyumluluk.
  • COM'un sürekli çevrimiçi kanal olarak kullanılması → Ortam arızalarında kararsızlık. Çözüm: Yönetimsel görevler için COM, çevrimiçi için HTTP/kuyruklar.

SSS

Yapılandırmalar aynıysa ve şubeler varsa ne seçmeli? Değişim planları/RIB veya buna yakın bir mekanizma: Daha az manuel dönüşüm gerekir ve bakımı daha kolaydır.

Yöntemler birleştirilebilir mi? Evet: Örneğin, "olaylar" (siparişler/durumlar) için HTTP ve büyük katalogların gece karşılaştırması için XML.

Erişim bilgileri daha güvenli nasıl saklanır? Minimum yetkilere sahip ayrı bir kullanıcı, ayarlara erişim kısıtlamaları, parolayı kodda/genel formlarda açık metin olarak saklamama, gizli bilgiler olmadan yalnızca teknik detayları günlüğe kaydetme.

Değişimin "canlı" olduğunu nasıl anlarım? Gerekli olanlar: Değişim günlüğü, metrikler (kaç paket/hata), süre/hata sayısı aşıldığında bildirim ve yeniden deneme mekanizması.