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