При организации обмена между конфигурациями 1С:Комплексная автоматизация 1 и 1С:Управление торговлей 10 нередко возникает задача разнести потоки данных по времени. Например, выгрузка справочников (номенклатуры, контрагентов) из КА в УТ должна происходить утром, а загрузка оформленных документов из УТ в КА — вечером.
Обычной ошибкой при реализации такого требования становится создание двух независимых планов обмена между одной и той же парой баз. В результате платформенные механизмы 1С начинают путать узлы, сбрасывать счетчики или выдавать ошибку несоответствия номеров сообщений обмена. Разберем подробнее, почему возникают эти сбои и как правильно построить схему синхронизации.
Проанализируем работу платформы 1С при синхронизации данных. В основе любого плана обмена лежит механизм регистрации изменений для узлов-корреспондентов. Для каждого узла система хранит два ключевых числовых реквизита:
НомерОтправленного — номер последнего сформированного пакета данных для этого узла.НомерПринятого — номер последнего успешно подтвержденного пакета от узла-приемника.Платформа жестко контролирует последовательность номеров сообщений. Если в базу поступает пакет с номером, который меньше или равен значению НомерПринятого, система блокирует загрузку с ошибкой рассогласования. При попытке настроить два разных плана обмена для одних и тех же информационных баз типовые механизмы идентификации (по префиксу базы и коду узла) начинают конфликтовать, что приводит к перезаписи настроек узла или сбою счетчиков пакетов.
Наиболее корректный способ организации интеграции — использование одного плана обмена и одной пары узлов для двух баз. Чтобы разнести по времени выгрузку справочников и загрузку документов, разберем настройки сценариев обмена.
При такой схеме сквозная нумерация пакетов в свойствах узла НомерОтправленного и НомерПринятого не нарушается, так как все пакеты проходят через единую пару узлов плана обмена.
Если ошибка нумерации уже возникла из-за сбоя счетчиков, необходимо выровнять номера сообщений в обеих базах. Рассмотрим, как это сделать программно. В обработке или через вызов встроенного языка сбрасываются счетчики узла:
УзелОбмена = ПланыОбмена.МойПланОбмена.НайтиПоКоду("УТ");
Если ЗначениеЗаполнено(УзелОбмена) Тогда
ОбъектУзла = УзелОбмена.ПолучитьОбъект();
ОбъектУзла.НомерОтправленного = 0;
ОбъектУзла.НомерПринятого = 0;
ОбъектУзла.Записать();
КонецЕсли;
Аналогичные манипуляции с установкой одинаковых номеров необходимо выполнить для парного узла в базе-корреспонденте. Также для этого можно использовать штатную обработку «Регистрация изменений для обмена данными», нажав кнопку «Изменить номера сообщений».
Чтобы объекты не регистрировались лишний раз перед выгрузкой конкретных данных, рекомендуется настроить выборочную регистрацию изменений. Посмотрим на основные шаги:
Не регистрировать.ПриЗаписи) или при помощи регламентного задания по определенным правилам.Если штатный механизм планов обмена не подходит под специфику задач, рассмотрим альтернативные архитектурные решения:
COMConnector и напрямую записывает созданные объекты. Это исключает необходимость формирования XML-файлов и отслеживания номеров пакетов.