Как программно выгрузить один конкретный документ с помощью Конвертации данных 2.0

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

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

Метод 1. Фильтрация в правилах выгрузки данных (ПВД) через обработчик

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

Для реализации этого метода нам необходимо выполнить следующие шаги:

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

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

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

Метод 2. Использование ПВД с типом «Произвольный запрос»

Чтобы избежать перебора всех объектов, мы можем изменить способ выборки данных в ПВД. Вместо «Стандартной» выборки выберем «Произвольный запрос». Это позволит нам на уровне СУБД ограничить выборку только одним объектом.

Рассмотрим алгоритм настройки:

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

ВЫБРАТЬ
    Ссылка
ИЗ
    Документ.РеализацияТоваровУслуг
ГДЕ
    Ссылка = &СсылкаНаОбъект

В этом случае система выполнит точечное обращение к таблице. Чтобы этот параметр был доступен, его нужно передать в обработку УниверсальныйОбменДаннымиXML. Если вы вызываете выгрузку из своей обработки, это делается заполнением структуры параметров перед началом выгрузки.

Метод 3. Программный вызов точечной выгрузки (Метод ВыгрузитьПоПравилу)

Если вы создаете собственную обработку для переноса данных, можно вообще отказаться от использования ПВД и вызывать ядро конвертации напрямую. Для этого в модуле обработки «Универсальный обмен данными в формате XML» существует функция ВыгрузитьПоПравилу.

Выясним, как это работает на практике. Допустим, у нас уже загружены правила обмена. Мы можем инициировать выгрузку одного объекта следующим кодом:


// Предполагается, что код выполняется в контексте обработки обмена
ПараметрыВыгрузки = Новый Структура;
ПараметрыВыгрузки.Вставить("ИмяПКО", "РеализацияТоваровУслуг");
ПараметрыВыгрузки.Вставить("Объект", СсылкаНаДокумент);

// Вызов функции ядра
ВыгрузитьПоПравилу(СсылкаНаДокумент, , , , "РеализацияТоваровУслуг");

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

Метод 4. Системная процедура ВыгрузитьОбъект

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

Проанализируем пример кода в обработчике ПКО «После выгрузки»:


Если ЗначениеЗаполнено(Объект.ДокументОснование) Тогда
    ВыгрузитьОбъект(Объект.ДокументОснование);
КонецЕсли;

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

Метод 5. Управление зависимыми объектами и ссылочной целостностью

При выгрузке одного конкретного документа важно помнить, что КД2 по умолчанию «тянет» за собой все связанные объекты: справочники (Контрагенты, Номенклатура), другие документы, если на них есть ссылки в реквизитах или табличных частях. Чтобы не выгружать лишнего, используйте настройки в ПКС (Правилах конвертации свойств):

Метод 6. Передача объекта через фиктивный «Узел обмена»

Если вам нужно использовать стандартный интерфейс обработки УниверсальныйОбменДаннымиXML, но при этом выгрузить только один объект, можно прибегнуть к хитрости. Стандартная обработка поддерживает режим выгрузки по плану обмена.

  1. Создаем в базе-источнике фиктивный узел в любом подходящем плане обмена.
  2. Программно регистрируем в этом узле только один нужный нам документ.
  3. В обработке выгрузки выбираем этот узел.

Это позволит использовать «родной» механизм 1С без написания сложного кода, так как система сама сформирует выборку на основе таблицы регистрации изменений.

Заключение

Мы рассмотрели несколько способов выгрузки конкретного объекта через КД2. Для разовых задач наиболее оптимально использовать ПВД с произвольным запросом и параметром. Для встраивания в свои инструменты лучше использовать прямой вызов ВыгрузитьПоПравилу. Выбор метода зависит от ваших конкретных целей и объема данных в информационной базе.

← На главную