Как ограничить количество выгружаемых элементов справочника при работе с Конвертацией данных 2.0

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

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

Способ 1. Использование счетчика в ПКО (Правила конвертации объектов)

Это один из самых простых способов реализации, который не требует глубокого изменения логики правил выгрузки данных. Идея заключается в создании глобального параметра-счетчика, который будет увеличиваться при каждой выгрузке объекта.

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

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

Проанализируем пример кода для этого метода:


// Увеличиваем значение счетчика в параметрах
Параметры.КоличествоВыгруженных = Параметры.КоличествоВыгруженных + 1;

// Проверяем, достигли ли мы лимита (например, 100 элементов)
Если Параметры.КоличествоВыгруженных > 100 Тогда
    Отказ = Истина;
КонецЕсли;

Важное замечание: Этот метод прост, но имеет существенный недостаток в плане производительности. Система все равно будет перебирать все объекты в базе источнике. Для каждого объекта будет вызываться ПКО, и только потом срабатывать Отказ = Истина. Если в справочнике миллион записей, процесс «пропуска» лишних элементов может затянуться.

Способ 2. Произвольный алгоритм в ПВД (Правила выгрузки данных)

Этот способ считается наиболее правильным и эффективным. Вместо того чтобы позволять системе автоматически выбирать все данные, мы сами напишем запрос, который ограничит выборку еще на уровне базы данных СУБД. Это значительно ускорит процесс.

Разберем алгоритм действий в ПВД:

  1. Найдем правило выгрузки данных (ПВД) для нашего справочника.
  2. Изменим Способ выборки со «Стандартная выборка» на «Произвольный алгоритм».
  3. В обработчике ПередОбработкой напишем запрос с конструкцией ВЫБРАТЬ ПЕРВЫЕ.

Посмотрим на пример реализации такого алгоритма:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 100
    |   Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   НЕ Номенклатура.ПометкаУдаления";

Выборка = Запрос.Выполнить().Выбрать();

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

Используя данный метод, мы экономим ресурсы сервера, так как передаем в обработку только те 100 записей, которые нам действительно нужны. Обратите внимание на использование функции ВыгрузитьПоПравилу — она является ключевой при работе с произвольными алгоритмами выгрузки.

Способ 3. Интерактивная настройка в обработке выгрузки

Выясним причину, по которой многие программисты забывают о самом простом методе — использовании возможностей стандартной обработки «Универсальный обмен данными в формате XML». Вам не обязательно менять сами правила (файл XML), если вам нужно разово ограничить выборку.

В самой обработке на стороне базы-источника есть вкладка «Построитель отчета» или «Настройка отборов» (в зависимости от версии). Здесь мы можем сделать следующее:

Это позволяет гибко управлять объемом данных без необходимости заходить в конфигуратор КД 2.0 и переформировывать правила.

Способ 4. Ограничение по диапазону (алфавиту или коду)

Если нам нужно протестировать разные типы данных, но при этом ограничить их объем, мы можем применить фильтрацию по первым символам кода или наименования. Это часто удобнее, чем просто «первые 100», так как позволяет захватить объекты из разных групп.

Например, в обработчике ПередВыгрузкой ПКО можно написать:


// Выгружаем только те объекты, код которых начинается на "001"
Если Лев(Источник.Код, 3) <> "001" Тогда
    Отказ = Истина;
КонецЕсли;

Или, как советовали опытные участники обсуждения, можно использовать алфавитный подход: выгружать только товары, название которых начинается на букву «А».

Нюансы ссылочной целостности

Проанализируем ситуацию: вы ограничили выгрузку справочника Номенклатура сотней элементов. Однако после загрузки в приемник вы обнаруживаете, что данных гораздо больше, чем ожидалось. Почему так происходит?

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

Для максимально «чистого» и быстрого теста рекомендуем:

  1. В ПКС свойств, ссылающихся на тяжелые справочники, устанавливать флаг «Только передавать ссылку (без выгрузки объекта)». В этом случае в приемнике создастся «объект-пустышка» с тем же GUID, но без заполненных реквизитов, что достаточно для проверки алгоритмов поиска.
  2. Тщательно проверять настройки ПВД — иногда для одного и того же объекта создано несколько правил выгрузки, и ограничение в одном не сработает для другого.

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

← На главную