Переход платформы 1С и типовых конфигураций на новые стандарты Библиотеки стандартных подсистем (БСП) принес множество полезных инструментов. Однако разработчики часто сталкиваются с жестким ограничением: современные редакции конфигураций, включая «1С:Управление торговлей 11.1», ориентированы на использование универсального формата обмена (EnterpriseData / КД3). Штатный интерфейс настройки синхронизации предлагает интеграцию только с определенным набором программ (БП, ДО, Розница) либо обмен через РИБ. Настройка произвольного обмена «точка-точка» между двумя однородными базами по классическим правилам Конвертации данных 2.0 (КД2) в пользовательском режиме напрямую не предусмотрена.
В рамках данной статьи мы подробно разберем, как решить эту задачу. Мы проанализируем два основных практических подхода: адаптацию стандартных механизмов БСП под собственные правила КД2 и полную автоматизацию обмена через программный вызов обработки УниверсальныйОбменДаннымиXML с использованием планов обмена.
Этот способ оптимален, если мы хотим сохранить привычный для пользователей интерфейс мониторинга синхронизации, использовать штатные каналы связи (сетевой каталог, FTP, электронная почта) и стандартное расписание БСП. Суть метода заключается в том, чтобы взять за основу существующий в конфигурации план обмена и адаптировать его под наши нужды.
Рассмотрим последовательность действий по шагам:
ОбменУправлениеТорговлейБухгалтерияПредприятия30) или Документооборотом. Мы можем использовать его напрямую или скопировать в конфигураторе, создав собственный уникальный план обмена.ДокументСсылка.СборкаТоваров или ДокументСсылка.ВнутреннееПотреблениеТоваров), их обязательно нужно включить в состав.ОбменДанными[ИмяПланаОбмена]ЗарегистрироватьИзменение и ЗарегистрироватьУдаление. В свойствах этих подписок в качестве источника укажем наши новые объекты.ПравилаДляОбменаДанными (сделать это можно через меню «Все функции» / «Функции для технического специалиста»). Найдем запись, соответствующую нашему узлу обмена, и загрузим туда новые файлы: XML-файл правил конвертации (ПКО) и XML-файл правил регистрации объектов (ПРО).Важный нюанс при использовании БСП: механизмы стандартной подсистемы обмена накладывают свои алгоритмы поверх правил КД2. В частности, при выгрузке связанных объектов «по ссылке» БСП может отсекать часть данных для оптимизации пакета. Если в правилах настроен сложный поиск или выгрузка сопутствующих справочников без явного указания ПКО в правилах конвертации свойств, данные в приемнике могут не создаться (загрузится только пустая ссылка с УИД). Будьте готовы к детальной отладке общих модулей, таких как ОбменДаннымиСервер и КонвертацияОбъектовИнформационныхБаз.
Если мы хотим избежать вмешательства в сложные и часто непредсказуемые алгоритмы БСП, наиболее надежным решением станет написание собственного регламентного задания. Этот способ гарантирует, что выгрузка и загрузка пройдут строго по правилам КД2, без какого-либо влияния со стороны механизмов очистки ссылок БСП.
Для реализации этого подхода выполним следующие шаги:
Custom_ОбменУТ_УТ. В его состав включим только те метаданные, изменения которых планируем переносить. Настроим стандартные подписки на события для автоматической регистрации изменений объектов на узлах этого плана обмена. Это позволит нам выгружать не всю базу целиком, а только измененные объекты.УниверсальныйОбменДаннымиXML, передадим ей параметры узла нашего плана обмена и запустим процесс.Проанализируем пример кода для регламентного задания выгрузки:
Процедура ВыполнитьАвтоматическуюВыгрузку() Экспорт
// Инициализируем обработку выгрузки КД2
ОбработкаВыгрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаВыгрузки.РежимОбмена = "Выгрузка";
ОбработкаВыгрузки.ИмяФайлаПравилОбмена = "C:\Exchange\Rules.xml"; // Путь к правилам конвертации
ОбработкаВыгрузки.ИмяФайлаОбмена = "C:\Exchange\Data.xml"; // Путь к файлу выгрузки данных
// Настраиваем отбор по нашему плану обмена
ОбработкаВыгрузки.ИспользоватьОтборПоПлануОбмена = Истина;
// Получаем ссылку на узел-приемник нашего плана обмена
СсылкаНаУзел = ПланыОбмена.Custom_ОбменУТ_УТ.НайтиПоКоду("UT2");
Если СсылкаНаУзел.Пустая() Тогда
ЗаписьЖурналаРегистрации("Обмен данными", УровеньЖурналаРегистрации.Ошибка, , , "Не найден узел обмена с кодом UT2");
Возврат;
КонецЕсли;
ОбработкаВыгрузки.УзелДляВыгрузкиДляПланаОбмена = СсылкаНаУзел;
// Важнейшая настройка для корректного переноса связанных данных по ссылке
ОбработкаВыгрузки.РежимВыгрузкиПриНеобходимости = "ВыгружатьПриНеобходимости";
// Загружаем правила и производим выгрузку только измененных объектов
ОбработкаВыгрузки.ЗагрузитьПравилаОбмена();
ОбработкаВыгрузки.ВыполнитьВыгрузку();
ЗаписьЖурналаРегистрации("Обмен данными", УровеньЖурналаРегистрации.Информация, , , "Выгрузка данных успешно завершена.");
КонецПроцедуры
Режим ВыгружатьПриНеобходимости гарантирует, что если в выгружаемом документе заполнена ссылка на новый договор или контрагент, этот объект также будет полностью выгружен в XML-пакет, даже если изменения по нему самому не были зарегистрированы на узле плана обмена.
Рассмотрим пример программного кода для загрузки данных в базу-приемник:
Процедура ВыполнитьАвтоматическуюЗагрузку() Экспорт
ФайлОбмена = Новый Файл("C:\Exchange\Data.xml");
Если Не ФайлОбмена.Существует() Тогда
Возврат; // Файл еще не передан источником
КонецЕсли;
ОбработкаЗагрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаЗагрузки.РежимОбмена = "Загрузка";
ОбработкаЗагрузки.ИмяФайлаОбмена = "C:\Exchange\Data.xml";
// Выполняем загрузку объектов в транзакции
ОбработкаЗагрузки.ВыполнитьЗагрузку();
// Удаляем обработанный файл, чтобы избежать повторного импорта
Попытка
УдалитьФайлы("C:\Exchange\Data.xml");
ЗаписьЖурналаРегистрации("Обмен данными", УровеньЖурналаРегистрации.Информация, , , "Загрузка данных и удаление файла успешно завершены.");
Исключение
ЗаписьЖурналаРегистрации("Обмен данными", УровеньЖурналаРегистрации.Предупреждение, , , "Не удалось удалить файл обмена: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Важным аспектом любого надежного обмена является своевременная очистка зарегистрированных изменений. Если мы не будем снимать объекты с регистрации на узле плана обмена после их успешной передачи, при каждой следующей итерации файл выгрузки будет расти, дублируя уже перенесенные данные, что в конечном итоге приведет к критическому падению производительности.
Выясним, как организовать простой и эффективный механизм подтверждения приема пакета:
ПланыОбмена.ВыбратьИзменения() возвращает номера сообщений, которые мы можем записать в файл обмена.confirm.txt, в который записывает номер успешно обработанного пакета.confirm.txt. Если файл найден, программа считывает номер пакета и выполняет очистку регистрации изменений с помощью метода:
ПланыОбмена.УдалитьРегистрациюИзменений(СсылкаНаУзел, НомерПринятогоСообщения);
После удаления регистрации изменений файл подтверждения удаляется, и источник приступает к формированию нового пакета данных.
Выбор конкретного варианта зависит от архитектуры вашей ИТ-системы и планов по обновлению конфигурации:
УниверсальныйОбменДаннымиXML работает изолированно, легко настраивается и не зависит от логики БСП, обеспечивая стабильную и прозрачную интеграцию.