Как отменить выгрузку документа в Конвертации данных, если в ПКГС нет движений?

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

При настройке правил обмена в конфигурации «Конвертация данных 2.1» часто возникает задача: перенести документ только в том случае, если у него сформировались определенные проводки или движения по регистрам. Если в Правиле конвертации группы свойств (ПКГС) для набора записей регистра (например, Хозрасчетный) установлен программный фильтр, стандартными средствами тяжело определить факт наличия выгруженных строк до момента их обработки. Разберем детально, как отследить выгрузку движений и корректно отменить регистрацию документа в источнике или приемнике.

Особенности работы обработчиков и подводные камни

Проанализируем порядок выполнения событий в правилах выгрузки. Обработчики ПКГС и входящие в них ПКС выполняются до того, как управление передается в обработчик ПКО После выгрузки. Это дает нам возможность зафиксировать факт выгрузки хотя бы одной строки.

Однако при использовании конструкции Отказ = Истина; в обработчике ПКО После выгрузки важно помнить о ссылочной целостности: к моменту завершения выгрузки объекта все ссылочные реквизиты шапки (контрагенты, договоры, склады) уже могли быть выгружены в файл обмена по правилам конвертации свойств. Если для этих ПКС не включен флаг «Не выгружать по ссылке», отмена документа в самом конце приведет к появлению «мусорных» элементов справочников в базе-приемнике. Рассмотрим варианты решения проблемы с учетом этих нюансов.

Способ 1. Использование глобальной коллекции «Параметры» (в источнике)

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

  1. В ПКО документа в обработчике «Перед выгрузкой» инициализируем счетчик. Сбрасывать значение обязательно перед каждым объектом, иначе накопится результат предыдущих документов:

    Параметры.Вставить("ВыгруженоДвиженийТекущегоДокумента", 0);
  2. В ПКГС или в обработчике «Перед выгрузкой» конкретного ПКС движения, где проходит проверка условия отбора, увеличиваем счетчик:

    
    Параметры.ВыгруженоДвиженийТекущегоДокумента = Параметры.ВыгруженоДвиженийТекущегоДокумента + 1;
    
  3. В ПКО документа в обработчике «После выгрузки» проверяем, изменился ли наш счетчик. Если ни одна строка не попала в выгрузку, отменяем запись объекта в выходной XML:

    
    Если Параметры.ВыгруженоДвиженийТекущегоДокумента = 0 Тогда
        Отказ = Истина;
    КонецЕсли;
    

Способ 2. Рекомендуемый подход — предварительная фильтрация в «Перед выгрузкой»

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

В ПКО документа в обработчике «Перед выгрузкой» выполним прямой точечный запрос к регистру бухгалтерии с теми же условиями отбора, которые планировались для движений:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |	1
    |ИЗ
    |	РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
    |ГДЕ
    |	Хозрасчетный.Регистратор = &Источник
    |	И Хозрасчетный.СчетДт В ИЕРАРХИИ (&НужныеСчета)";

Запрос.УстановитьПараметр("Источник", Источник);
Запрос.УстановитьПараметр("НужныеСчета", НужныеСчета);

Если Запрос.Выполнить().Пустой() Тогда
    Отказ = Истина;
КонецЕсли;

Выясним преимущества этого метода: если запрос вернул пустой результат, документ отсекается сразу на входе через Отказ = Истина;. Механизм обмена не читает табличные части, не формирует XML-структуру и гарантированно не тащит за собой ссылки на связанные элементы.

Способ 3. Отмена записи на стороне базы-приемника

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

  1. Откроем ПКО документа и перейдем в обработчик «После загрузки». В этот момент доступен параметр Объект (готовый к записи документ в оперативной памяти) и флаг Отказ.

  2. Проанализируем состояние набора движений документа в памяти базы-приемника:

    
    Если Объект.Движения.Хозрасчетный.Количество() = 0 Тогда
        Отказ = Истина;
    КонецЕсли;
    

При установке флага Отказ = Истина; в обработчике «После загрузки» объект не будет физически записан в базу данных приемника. Если движения заполняются сложным алгоритмом или передаются отдельно, признак наличия строк можно передать из источника в приемник через специальную системную коллекцию ПараметрыОбъекта, а затем прочитать это соответствие в обработчиках загрузки.

← На главную