При разработке и тестировании правил обмена данными в среде «1С:Конвертация данных 2.1» (КД) разработчики часто сталкиваются с серьезной проблемой производительности. Если в базе-источнике содержатся сотни тысяч элементов (например, справочник Номенклатура, насчитывающий 400 000 позиций), то процесс выгрузки для проверки одной мелкой ошибки может занимать несколько часов. Ждать завершения полной выгрузки крайне неэффективно.
Для ускорения процесса тестирования критически важно научиться ограничивать объем выгружаемых данных. В этой статье мы подробно разберем, как выгрузить не весь массив информации, а лишь небольшую репрезентативную выборку (например, 100–200 элементов). Мы проанализируем различные подходы — от быстрого изменения настроек в пользовательском режиме до программного управления выборкой непосредственно в правилах обмена.
Это классический и самый надежный программный метод контроля над выгрузкой. Вместо стандартной выборки данных, которую платформа выполняет автоматически для правила выгрузки данных (ПВД), мы переопределяем этот процесс с помощью собственного запроса к базе данных.
Давайте разберем по шагам, как настроить этот механизм в конфигурации «Конвертация данных»:
Номенклатура или документа ЗаказКлиента).Стандартная выборка выберите «Произвольный алгоритм».ПЕРВЫЕ.Рассмотрим пример кода для обработчика «Перед обработкой» в ПВД:
// Отменяем стандартную автоматическую выборку объектов платформой
Отказ = Истина;
// Создаем запрос для выборки ограниченного количества тестовых объектов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 200
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ";
РезультатЗапроса = Запрос.Выполнить();
// Если выборка не пуста, запускаем выгрузку каждого элемента по правилу
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Передаем ссылку на конкретный объект в универсальный метод выгрузки
// Указываем имя ПКО (Правило конвертации объектов), по которому нужно обработать элемент
ВыгрузитьПоПравилу(Выборка.Ссылка, , , , "Номенклатура");
КонецЦикла;
КонецЕсли;
Важно проанализировать: в данном коде мы обязательно устанавливаем параметр Отказ = Истина. Это сообщает обработке выгрузки, что стандартный механизм обхода таблицы БД задействовать не нужно, так как мы полностью переписали алгоритм и выполнили выгрузку вручную через метод ВыгрузитьПоПравилу.
После того как правила будут полностью отлажены и проверены на тестовом контуре, вам достаточно будет зайти в это ПВД, вернуть способ выборки на Стандартная выборка (или убрать конструкцию ПЕРВЫЕ 200 из текста запроса) для запуска полноценного обмена на рабочей базе.
Если вам категорически не хочется вносить изменения в структуру самих правил обмена (XML-файл), или у вас нет прямого доступа к конфигурации «Конвертация данных» в момент тестирования, можно воспользоваться встроенными возможностями обработки «Универсальный обмен данными в формате XML».
Выясним, как настроить быстрый отбор непосредственно перед запуском выгрузки в режиме «1С:Предприятие»:
УниверсальныйОбменДаннымиXML в базе-источнике и загрузите файл правил обмена.Равно используйте вид сравнения В группе и укажите конкретную небольшую папку (группу номенклатуры), в которой находится всего несколько десятков товаров.В списке, куда вручную подберите 10–15 различных карточек номенклатуры (включая простые товары, услуги, позиции с характеристиками и сериями для максимальной полноты теста).Этот способ экономит массу времени, так как база данных обработает только указанные элементы, не затрагивая остальные сотни тысяч записей, а файлы правил останутся "чистыми" и готовыми к промышленной эксплуатации.
Очень часто справочник Номенклатура сам по себе не является главным объектом переноса — он мигрирует в базу-приемник как сопутствующая аналитика в составе документов (например, в табличных частях накладных, заказов или спецификаций).
Если вы отлаживаете именно перенос документов, то выгружать весь справочник номенклатуры абсолютно бессмысленно. Мы можем настроить выгрузку связанных справочников исключительно «по ссылкам».
Разберем этот изящный алгоритм настройки:
Номенклатура. Это заблокирует его самостоятельную выгрузку.РеализацияТоваровУслуг) настройте отбор на 1-2 конкретных тестовых документа, которые содержат интересующие вас позиции номенклатуры.Таким образом, вместо 400 000 элементов справочника вы выгрузите ровно те 5–10 позиций, которые требуются для тестирования бизнес-логики проведения документов. Скорость выгрузки при этом возрастет в сотни раз.
Рассмотрим более сложную, но крайне гибкую ситуацию. Представим, что вы запускаете выгрузку программно из внешней обработки или кода конфигурации и хотите передать в правила обмена конкретный массив объектов для тестирования.
Для этого мы можем передать список объектов через таблицу настройки параметров обработки обмена, а внутри ПВД принять этот параметр и обработать его.
Посмотрим на пример кода внешней обработки, которая инициирует выгрузку конкретного списка документов:
// Создаем экземпляр обработки обмена данными
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.РежимОбмена = "Выгрузка";
ОбработкаОбмена.ИмяФайлаПравилОбмена = ПутьКФайлуПравил;
ОбработкаОбмена.ИмяФайлаОбмена = ПутьКФайлуДанных;
// Обязательно загружаем правила перед заполнением параметров
ОбработкаОбмена.ЗагрузитьПравилаОбмена();
// Формируем список документов для тестирования
СписокТестовыхДокументов = Новый Массив;
СписокТестовыхДокументов.Добавить(СсылкаНаПервыйДокумент);
СписокТестовыхДокументов.Добавить(СсылкаНаВторойДокумент);
// Добавляем параметр "МассивДокументов" в таблицу настройки параметров обработки
НоваяСтрокаПараметров = ОбработкаОбмена.ТаблицаНастройкиПараметров.Добавить();
НоваяСтрокаПараметров.Имя = "МассивДокументов";
НоваяСтрокаПараметров.Наименование = "Массив документов для тестирования";
НоваяСтрокаПараметров.Значение = СписокТестовыхДокументов;
// Запускаем выгрузку
ОбработкаОбмена.ВыполнитьВыгрузку();
Теперь проанализируем, как поймать этот параметр внутри правил обмена. В КД в ПВД соответствующего документа в обработчике «Перед обработкой» пишем следующий код:
// Отключаем стандартный перебор всех документов в базе
Отказ = Истина;
// Проверяем заполненность нашего параметра, переданного программно
Если Параметры.Свойство("МассивДокументов") И ТипЗнч(Параметры.МассивДокументов) = Тип("Массив") Тогда
ПКО = Неопределено;
пУзелСсылки = Неопределено;
// Перебираем переданные документы и выгружаем их по правилу
Для Каждого ТекущийДокумент Из Параметры.МассивДокументов Цикл
// Логируем процесс выгрузки для визуального контроля
Сообщить("Выгружается тестовый объект: " + Строка(ТекущийДокумент));
// Вызываем выгрузку по конкретному правилу конвертации (ПКО)
ВыгрузитьПоПравилу(ТекущийДокумент, , , , "РеализацияТоваровУслуг", пУзелСсылки, , ПКО);
КонецЦикла;
КонецЕсли;
Этот подход незаменим при организации автоматического тестирования или интеграции обмена в регулярные регламентные процедуры, когда состав выгружаемых данных постоянно меняется и зависит от внешних факторов.
Если вы хотите протестировать правила в условиях, максимально приближенных к реальной боевой эксплуатации («exchange-like» режим), используйте стандартный механизм регистрации изменений на узлах планов обмена.
Разберем этот процесс по шагам:
УниверсальныйОбменДаннымиXML укажите этот узел плана обмена в качестве источника данных.Выясним, почему процесс выгрузки может занимать много времени даже при небольшом количестве объектов, и как это исправить:
Выбирать данные для выгрузки одним запросом в свойствах ПВД. Если этот флаг снят, система будет генерировать отдельный запрос к СУБД для каждого выгружаемого объекта (проблема N+1 запроса), что критически замедляет процесс. Всегда старайтесь использовать выборку одним запросом.Применяя предложенные нами методики программного ограничения выборки через ВыгрузитьПоПравилу, интерактивной настройки параметров и использования планов обмена, вы сможете сократить время итерации тестирования правил КД в сотни раз, сделав процесс разработки быстрым, комфортным и эффективным.