Как в плане обмена 1С переносить документы только после определенной даты?

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

При настройке обмена данными между информационными базами 1С часто возникает задача ограничить объем передаваемой информации. Типичный сценарий — выгружать только актуальные документы, дата которых позже определенной границы, исключая старые закрытые периоды.

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

Разбор типичных ошибок при фильтрации в модуле плана обмена

Посмотрим на пример попытки отфильтровать данные непосредственно в обработчике ПриОтправкеДанныхГлавному (или ПриОтправкеДанныхПодчиненному):


Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента)
    Если (ТипЗнч(ЭлементДанных) = Тип("ДокументСсылка.ЗаказПокупателя")) Тогда
        Если ЭлементДанных.Дата < Дата(2023, 1, 1) Тогда 
            ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
            ПланыОбмена.УдалитьРегистрациюИзменений(ЭтотОбъект.Ссылка, ЭлементДанных);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

В этом фрагменте допущено сразу несколько распространенных ошибок, из-за которых код не работает или работает некорректно. Разберем каждую из них подробнее:

  1. Неверная проверка типа объекта. В параметр ЭлементДанных передается не ссылка, а сам объект базы данных (тип ДокументОбъект.<ИмяДокумента>, СправочникОбъект.<ИмяСправочника>) либо наборы записей регистров. Поэтому условие ТипЗнч(ЭлементДанных) = Тип("ДокументСсылка.ЗаказПокупателя") всегда вернет Ложь.
  2. Обращение к реквизитам без проверки типа. Не у всех выгружаемых элементов есть реквизит Дата (например, у справочников или констант его нет). Прямое обращение ЭлементДанных.Дата для справочников вызовет ошибку времени выполнения.
  3. Избыточный вызов удаления регистрации. При присвоении параметру ОтправкаЭлемента значения ОтправкаЭлементаДанных.Игнорировать платформа 1С автоматически удаляет запись о регистрации изменений для данного объекта при записи сообщения. Вызывать метод ПланыОбмена.УдалитьРегистрациюИзменений вручную в этой процедуре не требуется.
  4. Игнорирование регистров и движений. Документы формируют наборы записей регистров накопления, бухгалтерии или сведений. Если отфильтровать только документ, но пропустить связанные наборы записей, движения по-прежнему попадут в сообщение обмена.

Корректная реализация фильтрации в обработчиках плана обмена

Проанализируем исправленный вариант обработчика. Чтобы корректно проверить тип метаданных объекта, используем проверку через объект метаданных документа:


Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента)
    
    // Проверяем, является ли элемент данных документом
    Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(ЭлементДанных.Ссылка)) Тогда
        
        ГраницаДаты = '20230101000000';
        
        // Дополнительно можно проверять конкретные типы метаданных:
        Если ЭлементДанных.Метаданные() = Метаданные.Документы.ЗаказПокупателя Тогда
            ГраницаДаты = '20230714000000';
        КонецЕсли;
        
        // Если документ старше границы — исключаем его из сообщения и очищаем регистрацию
        Если ЭлементДанных.Дата < ГраницаДаты Тогда
            ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Важное отличие режимов отправки:

  1. ОтправкаЭлементаДанных.Игнорировать — объект не включается в сообщение обмена, а его регистрация изменений снимается навсегда.
  2. ОтправкаЭлементаДанных.Пропустить — объект не включается в текущее сообщение обмена, но остается в таблице изменений для следующих выгрузок.

Почему отладчик не останавливается в обработчике?

Если вы установили точку останова в процедуре модуля плана обмена, но она не срабатывает, выясним возможные причины:

  1. Несоответствие направления обмена. Событие ПриОтправкеДанныхГлавному вызывается только в подчиненном узле РИБ при отправке в главный узел. Если обмен идет из главного в подчиненный или между равноправными узлами, вызывается ПриОтправкеДанныхПодчиненному.
  2. Фоновое выполнение. Если регламентный обмен запускается сервером, точка останова сработает только при включенной отладке фоновых заданий в конфигураторе.
  3. Обмен выполняется по правилам через внешнюю обработку. Если данные выгружаются через правила конвертации (обработка «Универсальный обмен данными XML»), стандартная низкоуровневая запись сообщения плана обмена платформой может не использоваться.

Альтернативные способы фильтрации данных

Фильтрация в момент генерации сообщения через ОтправкаЭлементаДанных.Игнорировать создает лишнюю нагрузку на таблицы регистрации изменений (_Changes). Рассмотрим более производительные и правильные подходы:

  1. Фильтрация на этапе регистрации изменений.

    Для метаданных в плане обмена отключается режим авторегистрации (устанавливается значение «Запретить»). Регистрация выполняется кодом через подписку на событие ПриЗаписи (или ПередЗаписью) с предварительной проверкой даты документа:

    
    Если Источник.Дата >= ДатаГраницыОбмена Тогда
        ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Источник);
    КонецЕсли;
    
  2. Фильтрация в правилах конвертации данных (КД 2.0 / КД 3.0).

    Если обмен настроен через правила конвертации, ограничение по дате настраивается в обработчике «Перед выгрузкой» правила конвертации объекта (ПКО):

    
    Если Объект.Дата < Параметры.ДатаНачалаВыгрузки Тогда
        Отказ = Истина;
    КонецЕсли;
    
  3. Использование возможностей Библиотеки стандартных подсистем (БСП).

    В типовых конфигурациях 1С механизмы обмена уже содержат встроенный реквизит узла ДатаНачалаВыгрузкиДокументов. Ограничение периода настраивается непосредственно в пользовательском интерфейсе базы данных без доработки программного кода.

← На главную