При работе с инструментом «Конвертация данных 2.1» (КД) специалисты часто сталкиваются с ситуацией, когда стандартных средств фильтрации в обработке выгрузки становится недостаточно. Представьте задачу: вам нужно перенести из одной базы в другую ровно 600 позиций номенклатуры. Эти позиции не объединены одной группой, у них разные виды, и они не подпадают под какой-то общий логический фильтр. У вас есть просто список кодов или артикулов.
Вводить 600 значений вручную в список отбора Универсального обмена данными — трудозатратно и чревато ошибками. В этой статье мы подробно разберем профессиональные приемы, которые позволят автоматизировать этот процесс и сделать выгрузку быстрой и точной.
Один из самых надежных способов «точечной» выгрузки — использование Плана обмена. Этот метод позволяет не менять правила конвертации вовсе, а использовать стандартный функционал платформы 1С для регистрации конкретных ссылок.
Разберем этот процесс по шагам:
ПланОбмена (например, с именем ТехническийВыгрузка) и включим в его состав справочник Номенклатура.
СписокКодов = Новый Массив;
// Допустим, коды уже загружены в массив из файла или таблицы
Узел = ПланыОбмена.ТехническийВыгрузка.НайтиПоНаименованию("Выгрузка по списку");
Для Каждого ТекущийКод Из СписокКодов Цикл
СсылкаНаОбъект = Справочники.Номенклатура.НайтиПоКоду(ТекущийКод);
Если Не СсылкаНаОбъект.Пустая() Тогда
ПланыОбмена.ЗарегистрироватьИзменения(Узел, СсылкаНаОбъект);
КонецЕсли;
КонецЦикла;
После регистрации в обработке Универсальный обмен данными в формате XML на закладке «Выгрузка данных» выберем наш узел плана обмена. Система сама определит, какие объекты были изменены, и выгрузит только их, игнорируя остальные тысячи позиций.
Если мы не хотим вносить изменения в структуру метаданных (создавать планы обмена), воспользуемся возможностями самих правил КД. Мы можем передать список кодов через Параметры.
Рассмотрим алгоритм реализации:
СписокВыгрузки с типом СписокЗначений.Перед выгрузкой данных на уровне интерактивной обработки напишем код для заполнения этого параметра из внешнего текстового файла.
// Пример кода в обработчике "Перед выгрузкой данных"
Текст = Новый ЧтениеТекста("C:\Export\NomenclatureCodes.txt", КодировкаТекста.UTF8);
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
Параметры.СписокВыгрузки.Добавить(СокрЛП(Стр));
Стр = Текст.ПрочитатьСтроку();
КонецЦикла;
Затем в Правилах выгрузки данных (ПВД) для номенклатуры мы установим способ выборки «Произвольный запрос». В самом запросе пропишем условие:
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Код В (&СписокВыгрузки)
Это позволит платформе на уровне СУБД быстро отобрать нужные записи, не перебирая весь справочник в памяти.
Иногда удобно использовать временные данные в базе для маркировки объектов. Рассмотрим оригинальный подход с использованием регистра ЦеныНоменклатуры или любого другого подходящего регистра.
Суть метода заключается в следующем: мы создаем специальный тип цен, например, «Служебный_Для_Выгрузки». С помощью обработки Установка цен номенклатуры или простым программным кодом мы записываем в регистр записи для наших 600 элементов с этим типом цен (цена может быть нулевой или равной 1 рублю — это неважно).
В ПВД мы меняем запрос так, чтобы он выбирал номенклатуру, по которой есть записи в этом регистре:
ВЫБРАТЬ РАЗЛИЧНЫЕ
ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Ссылка
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &СлужебныйТипЦен) КАК ЦеныНоменклатурыСрезПоследних
Этот способ хорош тем, что он нагляден: вы всегда можете открыть регистр и проверить, какие именно позиции помечены для обмена. После завершения выгрузки данные из регистра можно легко удалить.
Разберем ситуацию, когда вы не хотите менять ПВД или использовать сложные запросы. Можно применить фильтрацию непосредственно в Правилах конвертации объектов (ПКО).
В ПКО Номенклатуры, в событии Перед выгрузкой, мы можем прописать проверку. Выясним причину, почему этот метод считается «тяжелым»: система будет обращаться к этому коду для каждого элемента справочника в базе. Если в справочнике 100 000 записей, а нам нужно 600, 1С проверит все 100 000.
Однако для разовой задачи это решение самое быстрое в реализации:
// Событие Перед выгрузкой в ПКО Номенклатура
// Предположим, массив кодов загружен в Параметры.МассивКодов заранее
Если Параметры.МассивКодов.Найти(Объект.Код) = Неопределено Тогда
Отказ = Истина;
КонецЕсли;
Чтобы ускорить этот процесс, рекомендуется использовать объект Соответствие или ХешированнаяТаблица вместо обычного массива или списка значений, так как поиск в них работает значительно быстрее.
Посмотрим на ситуацию со стороны пользователя. Если конфигурация типовая, мы можем воспользоваться стандартной обработкой Групповое изменение реквизитов.
Номенклатура временную папку _Перенос_2024.Родитель В иерархии _Перенос_2024.Проанализируем наиболее гибкий программный метод. В ПВД можно выбрать способ выборки «Произвольный алгоритм». В этом случае мы сами управляем процессом выгрузки. Это позволяет нам полностью контролировать, что и в какой последовательности попадает в файл обмена.
// Код в алгоритме ПВД
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Код В (&СписокКодов)";
Запрос.УстановитьПараметр("СписокКодов", ПолучитьСписокКодовИзФайла());
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ВыгрузитьПоПравилу(Выборка.Ссылка, , , , "Номенклатура");
КонецЦикла;
Использование функции ВыгрузитьПоПравилу позволяет игнорировать любые настройки интерфейса обмена и выгружать только те данные, которые соответствуют вашей программной логике. Важно: убедитесь, что имя правила (в примере "Номенклатура") точно совпадает с кодом ПКО в вашей схеме конвертации.
Мы рассмотрели различные подходы к выгрузке специфического списка объектов. Выбор конкретного метода зависит от ваших условий:
Помните, что при выгрузке 600 элементов по ссылкам также могут потянуться связанные данные (единицы измерения, свойства, спецификации). Обязательно проверьте настройки Выгружать объекты по ссылкам в ваших ПКО, чтобы не выгрузить лишний объем информации вместе с выбранной номенклатурой.