Перенос данных между конфигурациями 1С, особенно такими разными, как Управление торговлей 10.3 (на обычных формах) и Управление нашей фирмой 1.6 (на управляемых формах), часто сталкивается с проблемой неточного совпадения ключевых полей. Когда наименования номенклатуры различаются на один-два знака, стандартный поиск в Конвертации данных 2.1 (КД 2.1) может создать дубли. Рассмотрим подробно, как организовать логирование этого процесса и какие инструменты сопоставления использовать, чтобы минимизировать ручную работу.
Прежде чем приступать к написанию собственного кода, проанализируем возможности типовой обработки Универсальный обмен данными в формате XML (V8Exch8.epf). Многие разработчики забывают о встроенных функциях отладки и протоколирования.
Разберем по шагам, как включить детальный лог:
Этот метод позволяет получить полную картину того, сколько объектов было обработано, без риска «повесить» сеанс 1С бесконечным выводом в окно сообщений.
Если нам нужно не просто знать факт загрузки, а видеть статистику (например, сколько объектов сопоставлено, а сколько создано новых), мы можем внедрить собственный код в обработчики событий Правил Конвертации Объектов (ПКО).
Проанализируем ситуацию: нам нужно понять, была ли найдена Номенклатура или создана новая. Для этого идеально подходит обработчик ПослеЗагрузки в ПКО. Рассмотрим пример кода:
Если ОбъектМодифицирован(Объект) Тогда
Если Объект.ЭтоНовый() Тогда
Сообщить("СОЗДАНО: " + Объект.Наименование);
Иначе
Сообщить("ОБНОВЛЕНО: " + Объект.Наименование);
КонецЕсли;
Иначе
Сообщить("НАЙДЕНО (БЕЗ ИЗМЕНЕНИЙ): " + Объект.Наименование);
КонецЕсли;
Для записи этой информации в Журнал регистрации, чтобы лог сохранился в базе данных, используем метод ЗаписьЖурналаРегистрации:
ЗаписьЖурналаРегистрации("ОбменДанными.ЗагрузкаНоменклатуры",
УровеньЖурналаРегистрации.Информация,
Объект.Метаданные(),
Объект.Ссылка,
"Результат загрузки: " + ?(Объект.ЭтоНовый(), "Новый", "Сопоставлен"));
Поскольку УНФ 1.6 построена на базе Библиотеки стандартных подсистем (БСП), мы имеем доступ к мощному инструменту — обработке Сопоставление данных обмена. Рассмотрим, как применить этот механизм для разовой задачи.
Вместо того чтобы сразу записывать данные в справочник Номенклатура, мы можем выгрузить их во временную таблицу или использовать режим предварительного сопоставления. Программа выведет таблицу, где в левой части будут данные из файла (источника), а в правой — найденные объекты в базе (приемнике). Объекты с расхождениями в 1-2 знака система пометит как «Несопоставленные», но позволит вам вручную указать правильную пару до того, как в базе появятся дубли.
Выясним причину, по которой объекты не сопоставляются автоматически. Часто это лишние пробелы, кавычки или разный регистр. Мы можем программно «подсказать» системе, как искать объект, используя обработчик ПоляПоиска в ПКО Номенклатуры.
Рассмотрим алгоритм нормализации наименования для поиска:
ПОДОБНО.Пример кода в обработчике ПоляПоиска:
// Очищаем наименование от лишнего "шума"
ЧистоеИмя = СокрЛП(СвойстваПоиска["Наименование"]);
ЧистоеИмя = СтрЗаменить(ЧистоеИмя, " ", "");
ЧистоеИмя = СтрЗаменить(ЧистоеИмя, "-", "");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ Ссылка
|ИЗ Справочник.Номенклатура
|ГДЕ Наименование ПОДОБНО &Наименование";
Запрос.УстановитьПараметр("Наименование", "%" + ЧистоеИмя + "%");
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
ВыборкаСледующий();
СсылкаНаОбъект = Выборка.Ссылка;
ПрекратитьПоиск = Истина;
КонецЕсли;
Для разовых задач с большим количеством расхождений проанализируем стратегию «буферного обмена»:
ТехническаяНоменклатура с идентичными реквизитами.Номенклатура и ТехническаяНоменклатура).Поиск и замена значений.Посмотрим на ситуацию со стороны данных. Файл выгрузки Message.xml — это структурированный текст. Мы можем воспользоваться сторонними обработками для предварительного анализа этого файла. Существуют решения, которые позволяют прочитать XML-файл обмена и вывести его содержимое в виде таблицы значений. Это дает возможность визуально сравнить данные источника с текущим справочником в приемнике еще до начала процесса загрузки, что крайне полезно при объемах в несколько тысяч позиций.
В завершение отметим, что для разовой задачи самым эффективным будет сочетание стандартного логирования в файл для контроля процесса и использования типовой обработки поиска и удаления дублей уже после загрузки. Это позволит не переусложнять правила конвертации и быстро добиться чистоты в справочниках.