понедельник, 14 декабря 2009 г.

"СтрокаИменСвойствПоиска" - особенности

В конфигурации "Конвертация данных 2.0" в ПКО существует обработчик Поля поиска.
Описание (из документации):
Условия возникновения события
Только для платформы 1cV8.
Событие выполняется при поиске элемента ссылочного типа. Если установлен поиск по уникальнму идентификатору и программа нашла элемент, то поиск прекращается. Если поиск по уникальному идентификатору не дал положительного результата и указано, что нужно продолжить поиск в этом случае или поиск по уникальному идентификатору не проводился, то программа пытается найти элементы по свойствам поиска. В обработчике нужно установить список полей через запятую по которым нужно проводить поиск. Если очередная попытка дала положительный результат, то поиск прекращается.
Поиск возможен только по тем полям у которых на этапе выгрузка был установлен флаг поиска данных!!!
Параметры:
НомерВариантаПоиска - число. Номер попытки поиска. Попыток поиска может быть не больше 10.
СвойстваПоиска -соотвествие в котором хранятся текущие значения реквизитов поиска
ПрекратитьПоиск - булево. Если Истина, то поиск объекта прекращается, в зависимости от того СсылкаНаОбъект заполнена или нет создается новый объект.
СсылкаНаОбъект - ссылка на результирующий объект. Если в обработчике установить данную ссылку (не пустую) то программа ее запомнит и поиск на этом будет считать успешно завершенным
УстанавливатьУОбъектаВсеСвойстваПоиска - булево. Определяет нужно ли после удачного завершения поиска установить объекту все реквизиты поиска. Объект может быть найден по части реквизитов. Этот флаг определяет нужно оставшиеся реквизиты, которые не участвовали в поиске (но по которым поиск возможен) установить объекту или нет. Значение по умолчанию: Истина.
НастройкаПоиска - строка. Выбранный пользователем вариант сопоставления объектов. В ПКО есть таблица Варианты настроек полей поиска - с возможными вариантами настроек полей поиска для пользователя. Разработчик правил определяет возможные комбинации полей поиска, которые пользователь может выбирать при настройке обмена. Все настройки указанные разработчиком правил должны быть отработаны в коде обработчика "Поля поиска". Переменная НастройкаПоиска в обработчике определяет выбранный пользователем вариант сопоставления (ИмяНастройкиДляАлгоритма из соответствующей строки таблицы). Если пользователь не выбрал ни один вариант сопоставления, или ему ни один вариант не был предложен, то НастройкаПоиска - пустая строка.
СтрокаИменСвойствПоиска – строка в которой задаются ключевые поля варианта поиска. Могут быть указаны только те свойства, для которых при настройке правил обмена был выставлен флаг поиска.


Довольно часто набор реквизитов, по которым необходимо провести поиск зависят от их содержания, например: если "ИНН" контрагента или физ. лица в базе источника не заполнен, то поиск по такому реквизиту в приемнике будет неэффективен. Поэтому приходится заглядывать в соответствие СвойстваПоиска.

Если НомерВариантаПоиска = 1 тогда
    Если ЗначениеЗаполнено(СвойстваПоиска.Получить("ИНН")) Тогда
        СтрокаИменСвойствПоиска = "ИНН";
    КонецЕсли;
ИначеЕсли НомерВариантаПоиска = 2 тогда
    Если ЗначениеЗаполнено(СвойстваПоиска.Получить("СтраховойНомерПФР"))
        СтрокаИменСвойствПоиска = "СтраховойНомерПФР";
    КонецЕсли;
Иначе
    СтрокаИменСвойствПоиска = "Наименование,ПометкаУдаления";
КонецЕсли;

Выше приведенный кусок кода поиска физического лица кажется рабочим - если заполнен ИНН ищем по нему, если не не нашли ищем по ПФРесли он заполнен, и в крайнем случае ищем по совокупности наименование и пометка удаления. Однако код не проводит к желаемому описанному алгоритму поиска. Давайте попробуем разобраться почему.

В первых двух вариантах поиска мы заполняем переменную СтрокаИменСвойствПоиска  только если заполнен необходимое свойство поиска, в противном случае у нас пустая строка (в обоих случаях!!). Однако в обработке УниверсальныйОбменДаннымиXML если предыдущая переменная  СтрокаИменСвойствПоиска была равна текущей поиск прерывается (чтобы не делать 10 предельных итераций). Поэтому в нашем случае нужно передать любые разные значения переменной СтрокаИменСвойствПоиска . Примерно вот так:
Если НомерВариантаПоиска = 1 тогда
    Если ЗначениеЗаполнено(СвойстваПоиска.Получить("ИНН")) Тогда
        СтрокаИменСвойствПоиска = "ИНН";
    Иначе
        СтрокаИменСвойствПоиска = "1";
    КонецЕсли;
ИначеЕсли НомерВариантаПоиска = 2 тогда
    Если ЗначениеЗаполнено(СвойстваПоиска.Получить("СтраховойНомерПФР"))
        СтрокаИменСвойствПоиска = "СтраховойНомерПФР";
    Иначе
        СтрокаИменСвойствПоиска = "2";
    КонецЕсли;
Иначе
    СтрокаИменСвойствПоиска = "Наименование,ПометкаУдаления";
КонецЕсли;.