Почему не работает условие в "ПередВыгрузкой" в Правилах выгрузки данных (ПВД) при конвертации 1С?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При настройке правил обмена в конфигурации «Конвертация данных» начинающие разработчики часто сталкиваются с ситуацией, когда условие отмены выгрузки (флаг Отказ = 1 или Отказ = Истина) в обработчике ПередВыгрузкой Правила выгрузки данных (ПВД) игнорируется, и элементы справочника все равно попадают в итоговый файл обмена.

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

Причина: Выгрузка объекта по ссылке в обход ПВД

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

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

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

Способ 1. Перенос условия в события ПКО (Правила конвертации объектов)

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

Для платформы 1С 7.7 в обработчике ПриВыгрузке или ПередВыгрузкой соответствующего ПКО пропишем условие проверки:


Если Источник.УТ_НеВыгружать = 1 Тогда
    Отказ = 1;
КонецЕсли;

В случае платформы 1С 8.x используется значение типа Булево:


Если Источник.УТ_НеВыгружать Тогда
    Отказ = Истина;
КонецЕсли;

Важное примечание: Переменная Источник в ПКО содержит ссылаемый объект базы данных, к реквизитам которого мы обращаемся. Установка флага Отказ в ПКО отменит выгрузку данного конкретного экземпляра.

Способ 2. Фильтрация реквизита в ПКС (Правиле конвертации свойств)

Если отменять выгрузку объекта целиком через ПКО нежелательно (например, чтобы избегать битых ссылок в целевой базе), проанализируем вариант с очисткой ссылки в Правиле конвертации свойств (ПКС) ссылающегося объекта (например, в ПКС Банк справочника БанковскиеСчета).

В обработчике ПередВыгрузкой соответствующего ПКС добавим сброс значения при выполнении условия:


Если Значение.УТ_НеВыгружать = 1 Тогда
    Значение = ПолучитьПустоеЗначение();
КонецЕсли;

При таком подходе ссылающийся объект выгрузится корректно, но поле банка останется незаполненным, а сам заблокированный банк не выгрузится в итоговую структуру XML.

Способ 3. Отключение флага "Выгружать объект по ссылке"

Разберем еще один способ управления ссылочной выгрузкой через настройки интерфейса ПКД:

  1. Перейдем в настройки ПКС объекта-владельца, содержащего ссылку на справочник.
  2. Снимем флаг Выгружать объект по ссылке.

В данном режиме в файл выгрузки будут переданы только ключевые данные, необходимые для поиска объекта на стороне приемника (например, БИК или Код), но сам связанный справочник перезаписываться и целиком выгружаться не будет.

Способ 4. Использование глобального обработчика "ПередВыгрузкойОбъекта"

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

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

← На главную