Как организовать логирование и сопоставление данных при переносе через Конвертацию данных 2.1

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

Перенос данных между конфигурациями 1С, особенно такими разными, как Управление торговлей 10.3 (на обычных формах) и Управление нашей фирмой 1.6 (на управляемых формах), часто сталкивается с проблемой неточного совпадения ключевых полей. Когда наименования номенклатуры различаются на один-два знака, стандартный поиск в Конвертации данных 2.1 (КД 2.1) может создать дубли. Рассмотрим подробно, как организовать логирование этого процесса и какие инструменты сопоставления использовать, чтобы минимизировать ручную работу.

Использование стандартного протоколирования в обработке обмена

Прежде чем приступать к написанию собственного кода, проанализируем возможности типовой обработки Универсальный обмен данными в формате XML (V8Exch8.epf). Многие разработчики забывают о встроенных функциях отладки и протоколирования.

Разберем по шагам, как включить детальный лог:

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

Этот метод позволяет получить полную картину того, сколько объектов было обработано, без риска «повесить» сеанс 1С бесконечным выводом в окно сообщений.

Логирование через обработчики событий КД 2.1

Если нам нужно не просто знать факт загрузки, а видеть статистику (например, сколько объектов сопоставлено, а сколько создано новых), мы можем внедрить собственный код в обработчики событий Правил Конвертации Объектов (ПКО).

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


Если ОбъектМодифицирован(Объект) Тогда
    Если Объект.ЭтоНовый() Тогда
        Сообщить("СОЗДАНО: " + Объект.Наименование);
    Иначе
        Сообщить("ОБНОВЛЕНО: " + Объект.Наименование);
    КонецЕсли;
Иначе
    Сообщить("НАЙДЕНО (БЕЗ ИЗМЕНЕНИЙ): " + Объект.Наименование);
КонецЕсли;

Для записи этой информации в Журнал регистрации, чтобы лог сохранился в базе данных, используем метод ЗаписьЖурналаРегистрации:


ЗаписьЖурналаРегистрации("ОбменДанными.ЗагрузкаНоменклатуры",
    УровеньЖурналаРегистрации.Информация,
    Объект.Метаданные(),
    Объект.Ссылка,
    "Результат загрузки: " + ?(Объект.ЭтоНовый(), "Новый", "Сопоставлен"));

Интерактивное сопоставление через механизмы БСП

Поскольку УНФ 1.6 построена на базе Библиотеки стандартных подсистем (БСП), мы имеем доступ к мощному инструменту — обработке Сопоставление данных обмена. Рассмотрим, как применить этот механизм для разовой задачи.

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

Реализация нечеткого поиска в «Полях поиска»

Выясним причину, по которой объекты не сопоставляются автоматически. Часто это лишние пробелы, кавычки или разный регистр. Мы можем программно «подсказать» системе, как искать объект, используя обработчик ПоляПоиска в ПКО Номенклатуры.

Рассмотрим алгоритм нормализации наименования для поиска:

  1. Удаляем спецсимволы и пробелы.
  2. Приводим к нижнему регистру.
  3. Ищем в базе через запрос с оператором ПОДОБНО.

Пример кода в обработчике ПоляПоиска:


// Очищаем наименование от лишнего "шума"
ЧистоеИмя = СокрЛП(СвойстваПоиска["Наименование"]);
ЧистоеИмя = СтрЗаменить(ЧистоеИмя, " ", "");
ЧистоеИмя = СтрЗаменить(ЧистоеИмя, "-", "");

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ Ссылка 
    |ИЗ Справочник.Номенклатура 
    |ГДЕ Наименование ПОДОБНО &Наименование";
Запрос.УстановитьПараметр("Наименование", "%" + ЧистоеИмя + "%");

Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    ВыборкаСледующий();
    СсылкаНаОбъект = Выборка.Ссылка;
    ПрекратитьПоиск = Истина;
КонецЕсли;

Метод двухэтапной загрузки через промежуточную таблицу

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

  1. Создаем в приемнике (УНФ) временный справочник ТехническаяНоменклатура с идентичными реквизитами.
  2. Загружаем все данные из УТ 10.3 в этот справочник «как есть», без сопоставления.
  3. Пишем простую обработку в УНФ, которая сравнивает два справочника (Номенклатура и ТехническаяНоменклатура).
  4. Используем полнотекстовый поиск или встроенные функции сравнения строк для вывода отчета о схожести.
  5. После ручного подтверждения пар переносим данные из технического справочника в боевой с помощью обработки Поиск и замена значений.

Использование внешних инструментов анализа XML

Посмотрим на ситуацию со стороны данных. Файл выгрузки Message.xml — это структурированный текст. Мы можем воспользоваться сторонними обработками для предварительного анализа этого файла. Существуют решения, которые позволяют прочитать XML-файл обмена и вывести его содержимое в виде таблицы значений. Это дает возможность визуально сравнить данные источника с текущим справочником в приемнике еще до начала процесса загрузки, что крайне полезно при объемах в несколько тысяч позиций.

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

← На главную