При работе с инструментом «Конвертация данных 2.0» (КД 2) программисты часто сталкиваются с задачей точечной выгрузки одного конкретного документа или справочника. Стандартный подход, когда в правилах прописывается Отказ = Истина для всех объектов, кроме нужного, является крайне неэффективным. В некоторых архитектурных решениях для этих целей используется передача по одному объекту через RabbitMQ, но в рамках классического обмена через файлы это решается оптимизацией выборки. В противном случае система сначала извлекает все документы за период из базы данных, а затем поочередно их отсеивает, что при больших объемах данных приводит к зависаниям.
Проанализируем ситуацию: когда мы пишем условие в обработчике Перед выгрузкой и устанавливаем Отказ = Истина, 1С уже выполнила запрос к базе и прочитала объект. Если в выбранном периоде находится 50 000 документов, программа выполнит этот цикл 50 000 раз. Наша задача — ограничить выборку еще на этапе формирования запроса к базе данных.
Самый простой способ, не требующий изменения самих правил в конфигураторе КД2, — это использование встроенных возможностей обработки Универсальный обмен данными в формате XML — есть готовая универсальная подсистема для настройки обмена данными. Существуют также модифицированные версии обработки с дополнительными опциями, позволяющие делать отборы по любому выгружаемому объекту или подсистемам. Рассмотрим классический алгоритм подробнее:
Реализация товаров и услуг).Ссылка.Равно и выберем конкретный документ из журнала.При таком подходе обработка сформирует запрос к базе данных с учетом этого фильтра, и в файл попадет только один объект. Если вам требуется более адаптивная выгрузка с гибкими отборами для обмена между не вполне идентичными конфигурациями, стоит использовать специализированные версии инструментов обмена.
Если нам необходимо, чтобы документ выбирался программно (например, через заранее созданный параметр конвертации), воспользуемся обработчиком «Перед обработкой» в Правилах выгрузки данных (ПВД). Разберем по шагам, как это реализовать:
В КД2 существует предопределенная переменная ВыборкаДанных. Если в коде обработчика Перед обработкой мы присвоим ей значение (массив, список значений или таблицу значений), то стандартный запрос системы по периоду будет полностью проигнорирован. Посмотрим на пример кода:
Если ЗначениеЗаполнено(Параметры.ДокументДляВыгрузки) Тогда
// Создаем массив и помещаем в него только наш документ
СписокДокументов = Новый Массив;
СписокДокументов.Добавить(Параметры.ДокументДляВыгрузки);
// Передаем массив в стандартную переменную КД
ВыборкаДанных = СписокДокументов;
КонецЕсли;
Важно помнить: чтобы этот код сработал, в настройках ПВД должен быть выбран способ выборки «Стандартная выборка». Система увидит, что ВыборкаДанных заполнена, и просто «пробежится» по вашему массиву.
В ситуациях, когда логика отбора сложная, целесообразно переключить «Способ выборки» в ПВД на «Произвольный алгоритм». Этот подход часто применяется в масштабных проектах, например, когда разрабатываются правила обмена между Комплексной автоматизацией 2.5 и WMS 5, где требуется тонкая настройка выгружаемых данных. Проанализируем пример использования запроса в событии Перед обработкой:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг
|ГДЕ
| Ссылка = &СсылкаДляВыгрузки";
Запрос.УстановитьПараметр("СсылкаДляВыгрузки", Параметры.НужныйДокумент);
// Результат запроса напрямую передаем в ВыборкаДанных
ВыборкаДанных = Запрос.Выполнить().Выгрузить();
Этот метод является самым «чистым» с точки зрения производительности, так как база данных отдает ровно одну запись, а движок КД не тратит время на лишние проверки условий для каждого объекта в цикле.
Рассмотрим ситуацию, когда нам вообще не нужно настраивать Правила выгрузки данных для конкретного документа. Если этот документ является реквизитом другого объекта, он выгрузится автоматически по ПКО, как только система встретит ссылку на него.
Если ваша задача — просто перебросить один документ «здесь и сейчас», вы можете воспользоваться кнопкой «Добавить» в списке выгружаемых объектов — для этого есть универсальная обработка выгрузки с гибкими отборами. Для этого лучше использовать дополненный универсальный обмен данными XML, который поддерживает сохранение настроек дерева правил и удобную работу с отборами на платформах 8.2 и 8.3.
Подведем итог. Чтобы выгрузка работала максимально эффективно, придерживайтесь следующих правил:
Отказ = Истина в событии Перед выгрузкой для фильтрации больших массивов данных.ВыборкаДанных.Используя эти методы, вы значительно сократите время подготовки файла обмена и снизите нагрузку на информационную базу.