Как реализовать обмен данными для разных объектов с разной периодичностью на одном плане обмена?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике автоматизации на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда бизнес-требования диктуют разные регламенты для передачи данных. Например, информация о новой номенклатуре должна появляться в принимающей базе практически мгновенно (каждые 5 минут), а тяжелые документы, такие как «Требование-накладная» или «Отчет о розничных продажах», должны передаваться только раз в месяц перед закрытием периода, чтобы не нагружать канал связи и серверные мощности в рабочее время.

Стандартные механизмы типовых конфигураций (БСП) на первый взгляд кажутся монолитными: один узел плана обмена — одно расписание. Однако, мы можем обойти это ограничение несколькими способами. Разберем подробно каждый из них, проанализируем их плюсы и минусы, и выберем оптимальный вариант для вашей задачи.

Метод 1. Программное управление регистрацией изменений

Это один из самых гибких подходов. Суть его заключается в том, чтобы не полагаться на автоматическую регистрацию всех объектов, входящих в состав плана обмена, а управлять этим процессом вручную через регламентные задания.

Рассмотрим алгоритм действий:

  1. Для справочника Номенклатура мы оставляем стандартную авторегистрацию в составе плана обмена. Это обеспечит выгрузку изменений каждые 5 минут.
  2. Для документа ТребованиеНакладная в составе плана обмена устанавливаем признак «Авторегистрация — Запретить». Теперь изменения по этим документам не будут фиксироваться автоматически при записи.
  3. Создаем новое регламентное задание, которое будет запускаться раз в месяц. В коде этого задания мы будем принудительно регистрировать изменения для нужных нам документов.

Проанализируем пример кода для ручной регистрации изменений:


Процедура ЗарегистрироватьДокументыДляОбмена(УзелОбмена) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка
        |ИЗ
        |   Документ.ТребованиеНакладная
        |ГДЕ
        |   Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
    
    Запрос.УстановитьПараметр("ДатаНачала", НачалоМесяца(ТекущаяДата()));
    Запрос.УстановитьПараметр("ДатаОкончания", КонецМесяца(ТекущаяДата()));
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Выборка.Ссылка);
    КонецЦикла;
    
КонецПроцедуры

После того как это задание отработает раз в месяц, ближайший сеанс стандартного обмена увидит зарегистрированные изменения по документам и передаст их вместе с очередной порцией номенклатуры.

Метод 2. Использование параметров в правилах конвертации (КД 2.0)

Если ваша синхронизация построена на базе «Конвертации данных 2.0», мы можем использовать параметры правил обмена для фильтрации объектов прямо в момент выгрузки. Этот метод позволяет не менять настройки регистрации, а управлять логикой выгрузки «на лету».

Выясним, как это реализовать. В правилах выгрузки данных (ПВД) для конкретного объекта можно прописать условие в обработчике ПередВыгрузкой. Нам понадобится параметр, например ВыгружатьТяжелыеДокументы.

Пример логики в ПВД:


// Обработчик "Перед выгрузкой" в ПВД для документа ТребованиеНакладная
Если Параметры.Свойство("ВыгружатьТяжелыеДокументы") И Параметры.ВыгружатьТяжелыеДокументы = Ложь Тогда
    Отказ = Истина;
КонецЕсли;

Теперь самое важное: как передать этот параметр? При программном запуске обмена (например, через обработку УниверсальныйОбменДаннымиXML) мы можем заполнить структуру параметров. Для пятиминутного обмена мы устанавливаем Ложь, а для ежемесячного — Истина. Однако в типовых сценариях БСП это потребует небольшой доработки процедуры выгрузки данных, чтобы система понимала, по какому сценарию она сейчас работает.

Метод 3. Разделение на разные узлы одного плана обмена

Рассмотрим вариант, который часто называют «самым простым для настройки в пользовательском режиме». Платформа позволяет создавать неограниченное количество узлов в рамках одного плана обмена.

Посмотрим на шаги реализации:

  1. Создаем узел Склад_Быстрый. В его настройках (если конфигурация позволяет фильтровать типы объектов на уровне узла) или в правилах обмена указываем, что выгружаются только справочники. Назначаем расписание — каждые 5 минут.
  2. Создаем узел Склад_Полный. Для этого узла настраиваем выгрузку всех данных, включая тяжелые документы. Назначаем расписание — раз в месяц.

Важный нюанс: при таком подходе изменения будут регистрироваться на обоих узлах одновременно. Это означает, что Номенклатура будет числиться к выгрузке и на «быстром», и на «медленном» узле. Это не критично, но требует аккуратности в обслуживании таблиц регистрации изменений, чтобы они не раздувались. Чтобы избежать дублирования выгрузки номенклатуры на втором узле, в его правилах можно, наоборот, оставить только документы.

Метод 4. Фильтрация в формате EnterpriseData (КД 3.0)

Если ваша конфигурация современная и использует «Универсальный формат» (EnterpriseData), то логика фильтрации переносится в модуль менеджера обмена. Здесь мы можем использовать обработчик ПравкаВыгрузкиОбъекта.

Разберем, как прописать условие, которое будет проверять текущую дату и тип объекта:


Процедура ПравкаВыгрузкиОбъекта(Объект, ДанныеИксДэО, Параметры, Отказ) Экспорт
    
    Если ТипЗнч(Объект) = Тип("ДокументСсылка.ТребованиеНакладная") Тогда
        // Проверяем, является ли текущий день последним днем месяца
        Если НачалоДня(ТекущаяДата()) <> КонецМесяца(ТекущаяДата()) Тогда
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Этот метод хорош тем, что он не требует создания дополнительных узлов или сложных регламентных заданий. Система сама будет «пропускать» документы во все дни, кроме назначенного, даже если они зарегистрированы к обмену.

Проблема очереди и производительности

Проанализируем ситуацию, о которой часто забывают: блокировка очереди. Если раз в месяц вы запускаете выгрузку огромного массива документов, и это происходит в рамках того же процесса, что и обмен номенклатурой, ваша «пятиминутная» синхронизация справочников может «встать» в очередь на несколько часов, пока обрабатываются тяжелые пакеты документов.

Для решения этой проблемы мы рекомендуем:

Подводя итог, выбор метода зависит от глубины возможной доработки системы. Если вы хотите обойтись минимальными изменениями, используйте Метод 3 (разные узлы). Если вы готовы к написанию кода для более элегантного решения — Метод 1 (управление регистрацией) является наиболее надежным и производительным.

← На главную