Во время загрузки файла с данными происходит поиск данных по УИД и по заданным полям поиска.
Конвертация позволяет осуществлять поиск по разным наборам полей, если предыдущий набор ничего не дал. Например, сначала ищем по связке ИНН+КПП, а если ничего не находим, то начинаем пытать счастье с наименованием.
Если НомерВариантаПоиска = 1 тогда
СтрокаИменСвойствПоиска = “ИНН, КПП”;
ИначеЕсли НомерВариантаПоиска = 2 Тогда
СтрокаИменСвойствПоиска = “Наименование”;
КонецЕсли;
НомерВариантаПоиска, СтрокаИменСвойствПоиска - это параметры метода ПКО_ПоследовательностьПолейПоиска_..., который настраивается для правила конвертации объектов "Поля поиска".
У меня стояла задача сопоставить справочник Пользователи в базе источника и Сотрудники в базе приемника. Проблема была в том, что наименование пользователя записывали как больше нравится: либо целиком, либо сокращая имя и отчество до инициалов с точками, либо без точек.
Я предположил, что если взять фамилию и первые буквы имя и отчества убрать все пробелы и точки, то по полученному значению можно найти.
В правиле конвертации свойств я указал, что поиск надо осуществлять по реквизиту Наименование.
В событии Конвертация_ПередЗагрузкойДанных я сформировал таблицу значений с колонками Сотрудник, Наименование и ФИОКратко. Полученную таблицу значений закинул в параметры.
ТЗСотрудники = Новый ТаблицаЗначений();
ТЗСотрудники.Колонки.Добавить("Сотрудник");
ТЗСотрудники.Колонки.Добавить("Наименование");
ТЗСотрудники.Колонки.Добавить("ФИОКратко");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Сотрудник,
| Сотрудники.Наименование КАК Наименование
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| НЕ Сотрудники.ПометкаУдаления
| И Сотрудники.Организация.ПризнакГРО";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НовСтрока = ТЗСотрудники.Добавить();
ЗаполнитьЗначенияСвойств(НовСтрока, ВыборкаДетальныеЗаписи);
ФИО = ВыборкаДетальныеЗаписи.Наименование;
ФИО = СтрЗаменить(ФИО,"."," ");
ФИО = СтрЗаменить(ФИО, " "," ");
ФИО = СтрЗаменить(ФИО, " ", Символы.ПС);
ФИОКратко = СокрЛП(СтрПолучитьСтроку(ФИО,1)) + Лев(СокрЛ(СтрПолучитьСтроку(ФИО,2)),1) + Лев(СокрЛ(СтрПолучитьСтроку(ФИО,3)),1);
НовСтрока.ФИОКратко = ФИОКратко;
КонецЦикла;
ТЗСотрудники.Индексы.Добавить("ФИОКратко");
Параметры.Вставить("ТЗСотрудники", ТЗСотрудники);
Для ПКО "Сотрудники" создал событие ПКО_Сотрудники_ПоследовательностьПолейПоиска
В методе, после того как не нашли по УИД, сначала ищем по наименованию (НомерВариантаПоиска = 1). Если вернулись в этот же метод с другим значением НомерВариантаПоиска, то будем искать по сокращенному ФИО.
Если нашли по сокращенному ФИО, то присваиваем переменной СсылкаНаОбъект значение найденной ссылки на сотрудника. УстанавливатьУОбъектаВсеСвойстваПоиска устанвливаем равным Ложь, чтобы наименование в приемнике не поменялось на наименование из источника (считаем, что в сотрудниках наименование более правильное).
Если не нашли, то придется создавать вручную и псхраняем с нужным УИД.
Если НомерВариантаПоиска = 1 тогда
СтрокаИменСвойствПоиска = "Наименование";
Иначе
ФИО = СвойстваПоиска.Получить("Наименование");
ФИО = СтрЗаменить(ФИО,"."," ");
ФИО = СтрЗаменить(ФИО, " "," ");
ФИО = СтрЗаменить(ФИО, " ", Символы.ПС);
ФИОКратко = СокрЛП(СтрПолучитьСтроку(ФИО,1)) + Лев(СокрЛ(СтрПолучитьСтроку(ФИО,2)),1) + Лев(СокрЛ(СтрПолучитьСтроку(ФИО,3)),1);
НужнаяСтрока = Параметры.ТЗСотрудники.Найти(ФИОКратко,"ФИОКратко");
Если НужнаяСтрока <> Неопределено Тогда
СсылкаНаОбъект = НужнаяСтрока.Сотрудник;
УстанавливатьУОбъектаВсеСвойстваПоиска = Ложь; //не меняем реквизиты в приемнике
Иначе
НовСотрудник = Справочники.Сотрудники.СоздатьЭлемент();
НовСотрудник.Наименование = СвойстваПоиска.Получить("Наименование");
НовСотрудник.Организация = Параметры.Организация;
УИД = Новый УникальныйИдентификатор(СвойстваПоиска.Получить("{УникальныйИдентификатор}"));
НовСсылка = Справочники.Сотрудники.ПолучитьСсылку(УИД);
НовСотрудник.УстановитьСсылкуНового(НовСсылка);
НовСотрудник.Записать();
СсылкаНаОбъект = НовСотрудник.Ссылка;
КонецЕсли;
ПрекратитьПоиск = Истина;
КонецЕсли;
|