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

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

При разработке правил обмена в "Конвертации данных 2.1" часто возникает задача выгрузить не все объекты определенного типа, а только конкретный элемент или небольшую группу по заданному условию. Например, для тестирования правил или для точечной синхронизации нужно выгрузить один документ, ссылка на который передается через параметры. Стандартный механизм выгрузки предполагает полный перебор всех данных, что крайне неэффективно и медленно при больших объемах. Рассмотрим, как правильно организовать фильтрацию данных на уровне запроса к базе, чтобы повысить производительность и гибкость обмена.

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

Решение: Используем "Произвольный алгоритм" в Правиле выгрузки данных (ПВД)

Ключ к решению проблемы лежит в способе выборки данных, который настраивается в Правиле выгрузки данных (ПВД). По умолчанию используется "Стандартная выборка". Этот режим заставляет систему выполнять простой запрос к базе данных вида ВЫБРАТЬ * ИЗ Документ.ИмяДокумента, то есть получать все без исключения объекты. Именно поэтому попытка отфильтровать данные позже оказывается неэффективной — данные уже выбраны.

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

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

  1. Откройте вашу конфигурацию "Конвертация данных 2.1" и найдите нужное Правило выгрузки данных (ПВД), например, для документа "ЗадачаИсполнителя".
  2. В настройках ПВД на вкладке "Источник" найдите свойство "Способ выборки данных".
  3. Измените его значение со "Стандартная выборка" на "Произвольный алгоритм".
  4. Теперь перейдите на вкладку "Обработчики событий" и выберите обработчик "Перед обработкой". Именно здесь мы и напишем код для формирования нашей выборки.

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

Посмотрим на пример кода для обработчика "Перед обработкой":


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

// 1. Создаем новый объект Запрос
Запрос = Новый Запрос;

// 2. Определяем текст запроса. Мы выбираем только поле "Ссылка"
// из нужного нам документа и накладываем условие отбора.
Запрос.Текст =
"ВЫБРАТЬ
|    ЗадачаИсполнителя.Ссылка
|ИЗ
|    Документ.ЗадачаИсполнителя КАК ЗадачаИсполнителя
|ГДЕ
|    ЗадачаИсполнителя.Ссылка = &ЗадачаИсполнителя";

// 3. Устанавливаем значение для параметра запроса.
// Берем его из глобальных параметров конвертации.
Запрос.УстановитьПараметр("ЗадачаИсполнителя", Параметры.ЗадачаИсполнителя);

// 4. Выполняем запрос и результат (выборку) помещаем
// в специальную переменную "ВыборкаДанных".
// Система автоматически обработает эту выборку.
ВыборкаДанных = Запрос.Выполнить().Выбрать();

Что делает этот код? Он формирует запрос, который выбирает из базы данных не все документы, а только один, ссылка на который совпадает со значением, переданным в Параметры.ЗадачаИсполнителя. Результат этого запроса (выборка, содержащая всего одну строку) присваивается переменной ВыборкаДанных. После этого дальнейшую работу система берет на себя: она пройдет по этой выборке и выгрузит единственный найденный документ. Таким образом, мы избегаем чтения лишних данных и значительно ускоряем процесс.

Почему не сработали другие подходы?

Чтобы закрепить понимание, давайте проанализируем, почему изначальные попытки автора не привели к желаемому результату.

1. Отказ в обработчике `ПередВыгрузкой`

Код вида:


Если Параметры.ЗадачаИсполнителя <> Объект.Ссылка Тогда 
    Отказ = Истина;
КонецЕсли;

Этот обработчик срабатывает для каждого объекта, который был получен на этапе выборки данных. При стандартном способе выборки система сначала получает из базы все документы "ЗадачаИсполнителя", а затем начинает их по одному перебирать. Внутри этого цикла и выполняется код обработчика. Да, он не дает лишним объектам выгрузиться в файл, но он не отменяет тот факт, что все они были прочитаны из базы данных. Для "моря документов" это означает колоссальную потерю производительности.

2. Вызов `ВыгрузитьПоПравилу` в обработчике `Перед обработкой`

Попытка вызвать ВыгрузитьПоПравилу(Параметры.ЗадачаИсполнителя, ...) в этом обработчике также обречена на провал при стандартной выборке. Обработчик Перед обработкой ПВД предназначен для подготовки к выгрузке всей коллекции. Когда вы вызываете здесь ВыгрузитьПоПравилу, вы нарушаете стандартный алгоритм работы. Система ожидает, что после этого обработчика начнется перебор основной выборки, а вы пытаетесь принудительно выгрузить что-то свое. Это приводит к конфликтам и ошибкам, в том числе к зависаниям.

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

Совет по отладке правил

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

В итоге, для эффективной фильтрации данных при выгрузке всегда используйте возможности запросов, переключив ПВД в режим "Произвольный алгоритм" и формируя нужную вам коллекцию в переменной ВыборкаДанных. Это каноничный и самый производительный способ решения подобных задач в "Конвертации данных 2.1".

← На главную