Синхронизация данных между устаревающей, но все еще активно используемой конфигурацией Управление производственным предприятием (УПП) 1.3 и современной Бухгалтерией предприятия КОРП (БП КОРП) 3.0 — это классическая и одновременно сложная задача для разработчика 1С. Ситуация существенно осложняется, если обе базы подверглись сильным кастомизациям (изменена структура метаданных), а сам обмен должен выполняться периодически, запускаться разными пользователями и обрабатывать внушительные массивы документов.
В этой статье мы подробно рассмотрим, с помощью каких механизмов лучше реализовать такой экспорт, проанализируем сильные и слабые стороны каждого технологического решения и разберем конкретные архитектурные приемы для оптимизации производительности и защиты данных от перезаписи.
При интеграции сильно измененных конфигураций перед разработчиком всегда стоит выбор между двумя концептуально разными подходами: классическим XML-обменом по правилам конвертации и использованием универсального формата обмена.
1. Использование Конвертации данных 2.1 (XML-обмен по правилам)
Это проверенный временем, максимально гибкий инструмент. Он позволяет сопоставить абсолютно любые нетиповые реквизиты, таблицы и справочники, написав произвольный код в обработчиках событий правил обмена (ПКО, ПКС, ПВД).
Однако у КД 2.1 есть критический недостаток — жесткая связанность систем (tight coupling). Поскольку БП КОРП 3.0 регулярно обновляется фирмой 1С, структура ее метаданных постоянно меняется. Любое существенное изменение в БП КОРП (например, рефакторинг перечисления ставок НДС или появление новых обязательных реквизитов в табличных частях документов) приведет к тому, что старые правила КД 2.1 сломаются. Вам придется оперативно выгружать метаданные обеих баз, загружать их в КД 2.1, пересобирать правила и обновлять их у пользователей.
2. Обмен через универсальный формат EnterpriseData (ED / Конвертация данных 3.0)
В последних релизах УПП 1.3 (начиная с версий 1.3.200+) разработчики добавили штатную поддержку синхронизации через универсальный формат. В конфигурации появились план обмена СинхронизацияДанныхЧерезУниверсальныйФормат, общий модуль МенеджерОбменаЧерезУниверсальныйФормат и соответствующие пакеты XDTO.
Главный плюс EnterpriseData — слабая связанность систем. БП КОРП «общается» не напрямую со структурой УПП, а с промежуточным стандартизированным форматом XML/XDTO. При обновлении БП КОРП логика трансляции формата ED во внутренние реквизиты обновляется автоматически силами 1С, и правила на стороне УПП переписывать не требуется. Если в ваших базах добавлены уникальные реквизиты, стандартную схему ED можно расширить либо использовать готовые модули доработки обмена (например, специализированные внешние обработки интеграции).
Конфигурация УПП 1.3 позволяет вести детальный учет по характеристикам номенклатуры (размеры, цвета и т.д.). В типовой БП КОРП 3.0 полноценного аналога характеристик в справочнике номенклатуры нет — там учет ведется в разрезе чистых номенклатурных позиций. При проектировании правил обмена нам необходимо решить, как сопоставлять эти данные.
Рассмотрим два основных сценария решения этой проблемы:
Номенклатура (например, наименование формируется как «Рабочий костюм (Размер 48, Рост 180)»).Поскольку выгрузка будет производиться периодически разными пользователями, высок риск того, что документы за прошлые периоды, которые бухгалтер уже проверил, закрыл от изменений или скорректировал вручную в БП КОРП, будут повторно перезаписаны данными из УПП. Чтобы избежать этого, необходимо внедрить механизм защиты.
Для реализации защиты на стороне БП КОРП в правилах загрузки (или через расширение конфигурации в модуле объекта документа) в обработчике «Перед записью» следует прописать блокирующий алгоритм. Проанализируем пример кода:
// Пример обработчика "Перед записью полученных данных" в приемнике БП КОРП
Если Объект.Ссылка.Проведен Тогда
// Если документ в базе-приемнике уже проведен и период закрыт,
// отменяем перезапись объекта, чтобы сохранить ручные правки бухгалтера.
// В КД 2.1 для этого можно сбросить загружаемый Объект в Неопределено:
Объект = Неопределено;
ВыполнитьОтказ = Истина;
КонецЕсли;
Использование этого подхода гарантирует, что ручные корректировки проводок и закрытые периоды в БП КОРП не пострадают при массовой повторной инициализации обмена пользователями со стороны УПП.
Когда документов в УПП действительно много (десятки тысяч за период), попытка выгрузить их одним файлом через стандартную обработку УниверсальныйОбменДаннымиXML гарантированно приведет к критическому потреблению оперативной памяти на сервере и ошибке «Out of Memory».
Чтобы избежать падения платформы, разберем по шагам логику организации порционного обмена:
Рассмотрим пример кода на стороне УПП, реализующий выборку изменений порциями:
// Пример порционного чтения зарегистрированных изменений
УзелОтбора = ПланыОбмена.ВыбратьИзменения(УзелПолучатель, НомерСообщения, 1000); // Ограничение в 1000 объектов
Пока УзелОтбора.Следующий() Цикл
ТекущийОбъект = УзелОтбора.Получить();
Если ТекущийОбъект <> Неопределено Тогда
// Производим выгрузку текущего объекта в XML-последовательность
ВыгрузитьОбъектВПоток(ТекущийОбъект);
КонецЕсли;
КонецЦикла;
Для повышения безопасности и скорости передачи данных вместо традиционных общих сетевых папок или FTP-соединений рекомендуется опубликовать на стороне БП КОРП специальный **HTTP-сервис**. В этом случае УПП будет передавать сформированные порционные пакеты напрямую через HTTP-запросы (POST), что минимизирует риски блокировки файлов операционной системой.
Для обеспечения стабильной работы большого количества пользователей идеальным решением будет создание в УПП выделенной подсистемы автообмена. Она должна функционировать по следующему принципу:
Такой подход полностью снимает нагрузку с конечных пользователей УПП, исключает зависание сессий при проведении документов и гарантирует гарантированную доставку данных даже при нестабильном канале связи.