Как настроить отбор объектов по полю в 1С:Конвертация данных 2.0

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

При настройке обмена данными между различными конфигурациями (например, между Бухгалтерией предприятия 8.2 и БИТ.ФИНАНС 8.3) часто возникает задача выгрузки не всех объектов справочника, а только тех, которые соответствуют определенному критерию. В инструменте «Конвертация данных 2.0» (КД 2.0) существует несколько способов реализации такой фильтрации. Давайте подробно разберем, как правильно прописать условия, чтобы избежать выгрузки лишних данных.

Решение 1: Использование обработчика «Перед выгрузкой» в ПКО

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

Для реализации этого метода необходимо открыть нужное ПКО и перейти на закладку «Обработчики событий». Нам потребуется обработчик Перед выгрузкой. Почему не При выгрузке? Дело в том, что в Перед выгрузкой мы можем полностью отменить процесс для конкретного объекта еще до того, как система начнет анализировать его свойства.

Проанализируем пример кода для фильтрации по коду типа договора:


// Проверяем заполнение реквизита и соответствие коду
Если ЗначениеЗаполнено(Источник.А_ТипДоговора) Тогда
    Если СокрЛП(Источник.А_ТипДоговора.Код) <> "018" Тогда
        Отказ = Истина;
    КонецЕсли;
Иначе
    // Если тип не заполнен, также можем отказаться от выгрузки
    Отказ = Истина;
КонецЕсли;

Важные моменты при написании кода:

  1. Переменная Отказ: Это стандартный параметр обработчика. Если присвоить ему значение Истина, текущий объект не будет выгружен. Ошибки вроде ОтказА = Истина (опечатки) приведут к тому, что условие просто не сработает.
  2. Использование Источник: В контексте ПКО Источник — это ссылка на объект выгружаемой базы. Мы обращаемся к его реквизитам через точку.
  3. Функция СокрЛП(): Коды в 1С часто имеют фиксированную длину и могут содержать невидимые пробелы. Всегда используйте СокрЛП() при сравнении строковых кодов, чтобы избежать ложных срабатываний условия «не равно».
  4. Проверка на пустую ссылку: Перед обращением к Источник.А_ТипДоговора.Код убедитесь, что само поле А_ТипДоговора заполнено, иначе возникнет ошибка обращения к методу через пустое значение.

Решение 2: Оптимизация через Правила выгрузки данных (ПВД)

Если в вашей базе 10 000 договоров, а выгрузить нужно только 100, использование фильтра в ПКО может замедлить процесс, так как система все равно будет «перебирать» все объекты. В этом случае эффективнее использовать ПВД с произвольным алгоритмом.

Разберем по шагам, как это настроить:

  1. В настройках ПВД выберите способ выборки «Произвольный алгоритм».
  2. В обработчике Перед обработкой напишите запрос, который выберет только нужные ссылки.

Рассмотрим пример кода для ПВД:


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

Запрос.УстановитьПараметр("НужныйКод", "018");

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

Пока Выборка.Следующий() Цикл
    // Выгружаем объект по конкретному правилу
    ВыгрузитьПоПравилу(Выборка.Ссылка, , , , "ДоговорыКонтрагентов");
КонецЦикла;

Этот метод работает значительно быстрее, так как основную работу по фильтрации выполняет СУБД, а в механизм конвертации попадают уже «отфильтрованные» данные.

Почему выгружается больше объектов, чем задано условием?

Иногда возникает ситуация: вы прописали Отказ = Истина в ПКО, но в файл выгрузки все равно попадают «лишние» объекты. Проанализируем причины этого явления:

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

2. Особенности поиска. Если код типа договора является числом, а вы сравниваете его со строкой "018", условие может работать некорректно. Выясним тип данных в метаданных: если тип «Число», то сравнивать нужно с числом: Источник.А_ТипДоговора.Код <> 18.

Использование интерактивных отборов в Универсальном обмене

Если вы хотите, чтобы пользователь мог сам выбирать условия отбора перед запуском обмена, воспользуйтесь механизмом Построителя отчета. В КД 2.0 можно настроить ПВД так, чтобы на форме обработки «Универсальный обмен данными в формате XML» появились стандартные поля отборов 1С.

Для этого в ПВД на закладке «Настройки построителя» выберите основной объект (справочник или документ). После загрузки правил в обработку обмена, на закладке «Выгрузка данных» вы увидите кнопку «Настроить отбор», где можно будет добавить поле «А_ТипДоговора» и выбрать значение без изменения программного кода.

Резюме: Для простых задач достаточно Отказ = Истина в обработчике Перед выгрузкой ПКО. Для высоконагруженных обменов с большим объемом данных рекомендуем использовать запросы в ПВД.

← На главную