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