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