Как организовать выгрузку объектов по списку из собственного регистра в 1С:Конвертация данных 2.1

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

При переносе данных между конфигурациями 1С, например, из УТ 10.3 в УТ 11.4, разработчики часто сталкиваются с проблемой производительности. Стандартная выгрузка всех объектов за период может занимать часы, особенно если база данных имеет внушительный объем. Если у нас уже есть механизм (например, собственный регистр сведений), который фиксирует измененные ссылки, возникает логичный вопрос: как заставить Конвертацию данных 2.1 выгружать только эти конкретные объекты, не прибегая к полному перебору всей базы? Рассмотрим детально, как это реализовать эффективно.

Анализ проблемы: почему стандартный подход работает медленно

Типичная ошибка новичка при работе с обработкой УниверсальныйОбменДаннымиXML заключается в попытке отфильтровать данные непосредственно в обработчике "Перед выгрузкой объекта". Мы пишем код, который проверяет наличие текущей ссылки в нашем регистре изменений, и, если ссылки там нет, устанавливаем Отказ = 1. Проанализируем ситуацию: при таком подходе система все равно выполняет полный обход всех объектов метаданных (например, всех документов "Реализация товаров и услуг" за 10 лет), считывает их из базы в память и только потом спрашивает наше правило, нужно ли их выгружать. Это создает колоссальную нагрузку на дисковую подсистему и процессор, превращая обмен в "ночного монстра". Наша задача — исключить лишние объекты еще на этапе формирования выборки.

Решение №1: Использование способа выборки «Произвольный алгоритм» в ПВД

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

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

Рассмотрим пример кода для этого обработчика:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Рег.ОбъектСсылка КАК ОбъектСсылка,
    |	ТИПЗНАЧЕНИЯ(Рег.ОбъектСсылка) КАК ТипОбъекта
    |ИЗ
    |	РегистрСведений.НашРегистрИзменений КАК Рег
    |ГДЕ
    |	Рег.ДатаМодификации >= &ДатаНачала";

Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

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

Решение №2: Оптимизация через способ выборки «Запрос»

Если нам нужно выгружать конкретный вид метаданных (например, только Номенклатуру или только Заказы), лучше использовать способ выборки «Запрос» в ПВД. Это позволит СУБД выполнить соединение таблиц на низком уровне, что является самым быстрым способом получения данных.

Выясним, как составить такой запрос в интерфейсе КД:

  1. Указываем Объект выборки (например, Документ.РеализацияТоваровУслуг).
  2. В тексте запроса пишем соединение с нашим регистром:

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

Такой подход гарантирует, что 1С даже не попытается прочитать объекты, которых нет в регистре изменений. Проанализируем результат: скорость выгрузки возрастает в десятки раз, так как объем передаваемой информации от SQL-сервера к приложению минимизируется.

Решение №3: Переход на использование Планов обмена

Как справедливо заметили коллеги в обсуждении, использование собственного регистра — это "изобретение велосипеда". В платформе 1С уже реализован механизм Планов обмена, который идеально подходит для этой задачи. Более того, типовая обработка УниверсальныйОбменДаннымиXML умеет работать с планами обмена напрямую.

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

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

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

Дополнительные советы по ускорению обмена

Даже если мы оптимизировали выборку, выгрузка может тормозить из-за связанных объектов. Рассмотрим, как этого избежать:

1. Настройка ПКО для справочников. Если вы выгружаете документ, по умолчанию 1С пытается выгрузить и всю связанную номенклатуру, контрагентов, склады и т.д. Если эти справочники уже были перенесены ранее, в ПКО этих объектов на закладке "Выгрузка объекта" стоит установить флаг «Не выгружать объекты свойств (только ссылки)». В этом случае в XML попадет только УИД ссылки, а не все реквизиты справочника.

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

3. Групповая обработка. При больших объемах (сотни тысяч записей) старайтесь разбивать выгрузку на порции. В обработке обмена есть настройка «Количество объектов в транзакции». Оптимальное значение — от 100 до 1000. Это предотвратит переполнение лога транзакций и обеспечит стабильность процесса.

Подводя итог, можно сказать: наиболее "правильным" с точки зрения архитектуры 1С является использование Планов обмена. Однако, если время поджимает и нужно быстро внедрить фильтр в существующие правила, использование ПВД с произвольным запросом и методом ВыгрузитьПоПравилу является самым эффективным "тактическим" решением.

← На главную