Приветствую Вас ГостьПятница, 03.05.2024, 22:07

Каталог статей


Конвертация. Производный поиск в базе приемника

Во время загрузки файла с данными происходит поиск данных по УИД и по заданным полям поиска.

Конвертация позволяет осуществлять поиск по разным наборам полей, если предыдущий набор ничего не дал. Например, сначала ищем по связке ИНН+КПП, а если ничего не находим, то начинаем пытать счастье с наименованием.

Если НомерВариантаПоиска = 1 тогда
    СтрокаИменСвойствПоиска = “ИНН, КПП”;
ИначеЕсли НомерВариантаПоиска = 2 Тогда
    СтрокаИменСвойствПоиска = “Наименование”;
КонецЕсли;

НомерВариантаПоиска, СтрокаИменСвойствПоиска - это параметры метода ПКО_ПоследовательностьПолейПоиска_..., который настраивается для правила конвертации объектов "Поля поиска".

У меня стояла задача сопоставить справочник Пользователи в базе источника и Сотрудники в базе приемника. Проблема была в том, что наименование пользователя записывали как больше нравится: либо целиком, либо сокращая имя и отчество до инициалов с точками, либо без точек.

Я предположил, что если взять фамилию и первые буквы имя и отчества убрать все пробелы и точки, то по полученному значению можно найти.

В правиле конвертации свойств я указал, что поиск надо осуществлять по реквизиту Наименование. 

В событии Конвертация_ПередЗагрузкойДанных я сформировал таблицу значений с колонками Сотрудник, Наименование и ФИОКратко. Полученную таблицу значений закинул в параметры.

    ТЗСотрудники = Новый ТаблицаЗначений();
    ТЗСотрудники.Колонки.Добавить("Сотрудник");
    ТЗСотрудники.Колонки.Добавить("Наименование");
    ТЗСотрудники.Колонки.Добавить("ФИОКратко");         
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    Сотрудники.Ссылка КАК Сотрудник,
    |    Сотрудники.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Сотрудники КАК Сотрудники
    |ГДЕ
    |    НЕ Сотрудники.ПометкаУдаления
    |    И Сотрудники.Организация.ПризнакГРО";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        НовСтрока = ТЗСотрудники.Добавить();
        ЗаполнитьЗначенияСвойств(НовСтрока, ВыборкаДетальныеЗаписи);    
        ФИО = ВыборкаДетальныеЗаписи.Наименование;        
        ФИО = СтрЗаменить(ФИО,"."," ");
        ФИО = СтрЗаменить(ФИО, "  "," ");
        ФИО = СтрЗаменить(ФИО, " ", Символы.ПС);      
        ФИОКратко = СокрЛП(СтрПолучитьСтроку(ФИО,1)) + Лев(СокрЛ(СтрПолучитьСтроку(ФИО,2)),1) + Лев(СокрЛ(СтрПолучитьСтроку(ФИО,3)),1);        
        НовСтрока.ФИОКратко = ФИОКратко;        
    КонецЦикла;                                  
    ТЗСотрудники.Индексы.Добавить("ФИОКратко");
    Параметры.Вставить("ТЗСотрудники", ТЗСотрудники); 

Для ПКО "Сотрудники"  создал событие ПКО_Сотрудники_ПоследовательностьПолейПоиска

В методе, после того как не нашли по УИД, сначала ищем по наименованию (НомерВариантаПоиска = 1). Если вернулись в этот же метод с другим значением НомерВариантаПоиска, то будем искать по сокращенному ФИО.

Если нашли по сокращенному ФИО, то присваиваем переменной СсылкаНаОбъект значение найденной ссылки на сотрудника. УстанавливатьУОбъектаВсеСвойстваПоиска устанвливаем равным Ложь, чтобы наименование в приемнике не поменялось на наименование из источника (считаем, что в сотрудниках наименование более правильное).

Если не нашли, то придется создавать вручную и псхраняем с нужным УИД.

Если НомерВариантаПоиска = 1 тогда
    СтрокаИменСвойствПоиска = "Наименование";
Иначе
    ФИО = СвойстваПоиска.Получить("Наименование");        
    ФИО = СтрЗаменить(ФИО,"."," ");
    ФИО = СтрЗаменить(ФИО, "  "," ");
    ФИО = СтрЗаменить(ФИО, " ", Символы.ПС);      
    ФИОКратко = СокрЛП(СтрПолучитьСтроку(ФИО,1)) + Лев(СокрЛ(СтрПолучитьСтроку(ФИО,2)),1) + Лев(СокрЛ(СтрПолучитьСтроку(ФИО,3)),1);        
    НужнаяСтрока = Параметры.ТЗСотрудники.Найти(ФИОКратко,"ФИОКратко");
    Если НужнаяСтрока <> Неопределено Тогда
        СсылкаНаОбъект = НужнаяСтрока.Сотрудник;   
        УстанавливатьУОбъектаВсеСвойстваПоиска = Ложь; //не меняем реквизиты в приемнике 
    Иначе
        НовСотрудник = Справочники.Сотрудники.СоздатьЭлемент();
        НовСотрудник.Наименование = СвойстваПоиска.Получить("Наименование");
        НовСотрудник.Организация = Параметры.Организация;
        УИД = Новый УникальныйИдентификатор(СвойстваПоиска.Получить("{УникальныйИдентификатор}"));
        НовСсылка = Справочники.Сотрудники.ПолучитьСсылку(УИД);
        НовСотрудник.УстановитьСсылкуНового(НовСсылка);
        НовСотрудник.Записать();
        СсылкаНаОбъект = НовСотрудник.Ссылка; 
    КонецЕсли; 
    ПрекратитьПоиск = Истина;    
КонецЕсли;

 

Категория: Взаимодействие с другими базами, приложениями и источниками данных | Добавил: leshic (20.06.2022)
Просмотров: 593 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [40]
Администрирование [34]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0