Как в КД 2.1 настроить выгрузку документов будущей даты без потери регистрации изменений?

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

При настройке обмена данными между конфигурациями (например, 1С:Управление торговлей 11 и 1С:Бухгалтерия предприятия 3.0) через Конвертацию данных 2.1 нередко возникает задача: передавать документы только тогда, когда наступает фактическая дата документа (документы, выписанные на будущее число, не должны сразу попадать в бухгалтерскую базу). Однако при добавлении простого условия отмены выгрузки в обработчики разработчики сталкиваются с тем, что документ исключается из текущего файла, но платформа снимает его с регистрации изменений. В результате при наступлении нужной даты документ повторно не выгружается.

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

Почему объект снимается с регистрации при установке отказа в правилах

Выясним причину такого поведения платформы 1С:

  1. Механизм квитирования номеров сообщений обмена. При типовом обмене через планы обмена платформа фиксирует номер отправленного сообщения с пакетом изменений. Как только база-приемник подтверждает прием пакета (присылает квитанцию с номером принятого сообщения), база-источник автоматически очищает таблицу регистрации изменений для всех объектов, попавших в этот диапазон номеров.
  2. Логика работы обработчиков КД 2.1. Установка флага Отказ = Истина; в обработчиках ПВД («Перед выгрузкой данных») или ПКО («Перед выгрузкой») лишь предотвращает запись объекта в XML-файл выгрузки. Это действие не возвращает объект в список изменений и не сообщает платформе о необходимости сохранить регистрацию на узле.

Способ 1. Принудительная повторная регистрация объекта в обработчике

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

В обработчике ПВД («Перед выгрузкой данных») или ПКО («Перед выгрузкой») пишем следующий код:


Если Источник.Дата > ТекущаяДата() Тогда
    Отказ = Истина;
    ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Источник.Ссылка);
КонецЕсли;

Проанализируем работу этого алгоритма:

  1. Документ с будущей датой отсекается и не попадает в итоговый файл обмена текущей сессии.
  2. Метод ПланыОбмена.ЗарегистрироватьИзменения заново помещает ссылку в таблицу изменений узла, но уже со следующим номером сообщения.
  3. При следующей сессии обмена проверка повторится, и так будет происходить до тех пор, пока дата документа не станет меньше или равна текущей.

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

Способ 2. Использование произвольного запроса в ПВД

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

В этом случае мы можем напрямую обратиться к виртуальной таблице изменений документа и сразу наложить условие по дате:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТаблицаИзменений.Ссылка КАК Ссылка
    |ИЗ
    |	Документ.РеализацияТоваровУслуг.Изменения КАК ТаблицаИзменений
    |ГДЕ
    |	ТаблицаИзменений.Узел = &УзелОбмена
    |	И ТаблицаИзменений.Ссылка.Дата <= &ТекущаяДата";

Запрос.УстановитьПараметр("УзелОбмена", УзелОбмена);
Запрос.УстановитьПараметр("ТекущаяДата", КонецДня(ТекущаяДата()));

ВыборкаДанных = Запрос.Выполнить().Выгрузить();

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

Способ 3. Перенос логики в Правила регистрации объектов (ПРО) и регламентное задание

Разберем наиболее архитектурно правильный подход для высоконагруженных систем:

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

Такой подход полностью исключает холостые прогоны правил обмена и обеспечивает гарантированную передачу документов день в день.

← На главную