Как в Конвертации данных перенести только номенклатуру с остатками и оборотами?

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

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

Разберем подробнее технические способы реализации такой выгрузки в конфигурации 1С:Конвертация данных 2.1 (КД 2.1), а также альтернативные подходы для Конвертации данных 3.0 и стандартных механизмов платформы.

Способ 1. Выгрузка через ПВД с произвольным алгоритмом (КД 2.1)

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

Разберем по шагам настройку правила выгрузки данных (ПВД):

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

Посмотрим на пример кода в обработчике Перед обработкой ПВД:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура
    |ИЗ
    |	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, , , ) КАК ТоварыНаСкладахОстаткиИОбороты";

Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);

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

Такой подход обеспечивает максимальное быстродействие, так как запрос к базе данных выполняется ровно один раз.

Способ 2. Оптимизированная фильтрация через структуру «Параметры» и ПКО

Иногда требуется оставить стандартный способ выборки объектов в ПВД, но отсекать лишние позиции на уровне правила конвертации объекта (ПКО) Номенклатура. Частая ошибка разработчиков — выполнение запроса к остаткам в обработчике Перед выгрузкой для каждого отдельного элемента. Это порождает проблему множественных запросов (N+1) и критически замедляет обмен.

Чтобы избежать падения производительности, оптимизируем алгоритм:

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

Посмотрим на код в глобальном обработчике Перед выгрузкой данных:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура
    |ИЗ
    |	РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки";

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

СоответствиеНоменклатуры = Новый Соответствие;
Пока Выборка.Следующий() Цикл
    СоответствиеНоменклатуры.Вставить(Выборка.Номенклатура, Истина);
КонецЦикла;

Параметры.Вставить("СписокАктивнойНоменклатуры", СоответствиеНоменклатуры);

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


Если Источник.ЭтоГруппа Тогда
    // Группы справочника не имеют остатков, но нужны для сохранения иерархии
    Возврат;
КонецЕсли;

Если Параметры.СписокАктивнойНоменклатуры[Источник] = Неопределено Тогда
    Отказ = Истина;
КонецЕсли;

Способ 3. Перенос номенклатуры через документ ввода начальных остатков

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

В этом случае номенклатура, попавшая в табличную часть документа ввода остатков, автоматически выгрузится по ссылке через соответствующее ПКО со всеми заполненными реквизитами.

Способ 4. Программная регистрация на узле обмена (КД 3.0 / Планы обмена)

Если обмен строится на базе Конвертации данных 3.0 и формата EnterpriseData, механизм выгрузки опирается на состав плана обмена. В такой архитектуре фильтрацию удобнее всего выполнить на этапе регистрации изменений.

Для этого пишется внешняя обработка или код в модуле обмена, который выполняет запрос к остаткам и регистрирует только отобранные элементы методом ПланыОбмена.ЗарегистрироватьИзменения():


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	Остатки.Номенклатура КАК Ссылка
    |ИЗ
    |	РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки";

Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());
МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");

ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, МассивСсылок);

Важные нюансы при частичном переносе номенклатуры

При переносе только активных позиций обязательно учтем следующие моменты:

  1. Иерархия (папки и группы): у групп справочника нет движений в регистрах. Если принудительно отменять выгрузку всех объектов без остатка, структура справочника в базе-приемнике станет плоской. В ПКО обязательно делайте исключение для групп через проверку Источник.ЭтоГруппа.
  2. Подчиненные справочники и регистры: для корректной работы позиций в новой базе необходимо перенести подчиненные единицы измерения, упаковки, характеристики и актуальные штрихкоды. Без единиц измерения позиции в новой базе могут оказаться неработоспособными.
  3. Услуги и нескладские позиции: услуги и работы не имеют остатков на складах, однако они могут активно использоваться в текущих оборотах и продажах. Их выборку необходимо настраивать отдельно по оборотам регистров взаиморасчетов, продаж или по типу номенклатуры.
  4. Бизнес-риски: перед усечением справочника обязательно согласуйте решение с пользователями. Если предприятие работает с широким ассортиментом редких товаров или запчастей, отсутствие старых позиций вынудит сотрудников создавать дубли и заново вводить информацию вручную.
← На главную