При переносе данных между конфигурациями 1С, например, из УТ 10.3 в УТ 11.4, разработчики часто сталкиваются с проблемой производительности. Стандартная выгрузка всех объектов за период может занимать часы, особенно если база данных имеет внушительный объем. Если у нас уже есть механизм (например, собственный регистр сведений), который фиксирует измененные ссылки, возникает логичный вопрос: как заставить Конвертацию данных 2.1 выгружать только эти конкретные объекты, не прибегая к полному перебору всей базы? Рассмотрим детально, как это реализовать эффективно.
Типичная ошибка новичка при работе с обработкой УниверсальныйОбменДаннымиXML заключается в попытке отфильтровать данные непосредственно в обработчике "Перед выгрузкой объекта". Мы пишем код, который проверяет наличие текущей ссылки в нашем регистре изменений, и, если ссылки там нет, устанавливаем Отказ = 1. Проанализируем ситуацию: при таком подходе система все равно выполняет полный обход всех объектов метаданных (например, всех документов "Реализация товаров и услуг" за 10 лет), считывает их из базы в память и только потом спрашивает наше правило, нужно ли их выгружать. Это создает колоссальную нагрузку на дисковую подсистему и процессор, превращая обмен в "ночного монстра". Наша задача — исключить лишние объекты еще на этапе формирования выборки.
Это самый гибкий и мощный способ, позволяющий напрямую управлять списком выгружаемых объектов. В конфигурации "Конвертация данных" нам необходимо создать новое Правило выгрузки данных (ПВД). Разберем по шагам, как настроить программную выборку:
Рассмотрим пример кода для этого обработчика:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Рег.ОбъектСсылка КАК ОбъектСсылка,
| ТИПЗНАЧЕНИЯ(Рег.ОбъектСсылка) КАК ТипОбъекта
|ИЗ
| РегистрСведений.НашРегистрИзменений КАК Рег
|ГДЕ
| Рег.ДатаМодификации >= &ДатаНачала";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Выгружаем объект по соответствующему правилу конвертации (ПКО)
// Метод ВыгрузитьПоПравилу сам определит нужное ПКО, если передать ссылку
ВыгрузитьПоПравилу(Выборка.ОбъектСсылка);
КонецЦикла;
Важный момент: Метод ВыгрузитьПоПравилу позволяет не привязываться к конкретному типу в одном ПВД. Мы можем одним запросом собрать и справочники, и документы, а система сама подберет подходящее ПКО (Правило конвертации объекта) на основании типа ссылки. Это кардинально ускоряет процесс, так как мы работаем только с целевым набором данных.
Если нам нужно выгружать конкретный вид метаданных (например, только Номенклатуру или только Заказы), лучше использовать способ выборки «Запрос» в ПВД. Это позволит СУБД выполнить соединение таблиц на низком уровне, что является самым быстрым способом получения данных.
Выясним, как составить такой запрос в интерфейсе КД:
Документ.РеализацияТоваровУслуг).
ВЫБРАТЬ
ДокументТаблица.Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК ДокументТаблица
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
РегистрСведений.НашРегистрИзменений КАК Рег
ПО
ДокументТаблица.Ссылка = Рег.ОбъектСсылка
ГДЕ
Рег.ДатаМодификации >= &ДатаНачала
Такой подход гарантирует, что 1С даже не попытается прочитать объекты, которых нет в регистре изменений. Проанализируем результат: скорость выгрузки возрастает в десятки раз, так как объем передаваемой информации от SQL-сервера к приложению минимизируется.
Как справедливо заметили коллеги в обсуждении, использование собственного регистра — это "изобретение велосипеда". В платформе 1С уже реализован механизм Планов обмена, который идеально подходит для этой задачи. Более того, типовая обработка УниверсальныйОбменДаннымиXML умеет работать с планами обмена напрямую.
Разберем, как использовать этот механизм совместно с вашими правилами:
Изменения данного плана обмена.УниверсальныйОбменДаннымиXML перейдите на вкладку «Выгрузка по плану обмена». Выберите ваш узел обмена.Преимущество: Вам не нужно следить за очисткой собственного регистра. После успешной выгрузки обработка предложит Удалить регистрацию изменений, что автоматически очистит очередь для следующего сеанса обмена.
Даже если мы оптимизировали выборку, выгрузка может тормозить из-за связанных объектов. Рассмотрим, как этого избежать:
1. Настройка ПКО для справочников. Если вы выгружаете документ, по умолчанию 1С пытается выгрузить и всю связанную номенклатуру, контрагентов, склады и т.д. Если эти справочники уже были перенесены ранее, в ПКО этих объектов на закладке "Выгрузка объекта" стоит установить флаг «Не выгружать объекты свойств (только ссылки)». В этом случае в XML попадет только УИД ссылки, а не все реквизиты справочника.
2. Использование параметров. Если вы все же используете произвольный алгоритм в ПВД, передавайте дату последнего обмена через Параметры в окне выгрузки. Обратиться к ним в коде можно через структуру Параметры.ДатаПоследнегоОбмена. Это позволит избежать жесткой привязки к датам внутри кода правил.
3. Групповая обработка. При больших объемах (сотни тысяч записей) старайтесь разбивать выгрузку на порции. В обработке обмена есть настройка «Количество объектов в транзакции». Оптимальное значение — от 100 до 1000. Это предотвратит переполнение лога транзакций и обеспечит стабильность процесса.
Подводя итог, можно сказать: наиболее "правильным" с точки зрения архитектуры 1С является использование Планов обмена. Однако, если время поджимает и нужно быстро внедрить фильтр в существующие правила, использование ПВД с произвольным запросом и методом ВыгрузитьПоПравилу является самым эффективным "тактическим" решением.