вторник, 26 мая 2009 г.

Соответсвие объектов обмена


Довольно часто при обмене данными нужно прописать соответствие одного объекту другому, не учитывая возможные реквизиты поиска и прочие очевидные вещие.
Просто А=В и все.

Примерно для этих целей в конфигурации УПП 1.2. существует регистр сведений Соответствие объектов для обмена.

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

Этот регистр мы и будем использовать для указания соответствия.
Заполним его необходимым соответствием.
  1. УзелОбмена - не заполняем, чтобы не путаться под ногами у реальных фоновых обменов.
  2. СсылкаВДругойИБ - уникальный идентификатор(источник БД 8 ) или другая уникальная конкатенация полей объекта.
  3. СобственнаяСсылка - ссылка назначение в текущей БД.
  4. ИмяТипаПриемника - строковое представление типа ссылки объекта в источнике
Теперь нужно всем этим соответствием воспользоваться в Конвертации данных
в ПКО "Поля поиска" прописываем вызов алгоритма

Если НомерВариантаПоиска = 1 тогда

Выполнить(Алгоритмы.ПолучитьСоотвествиеОбъектов);

КонецЕсли;

и создаем сам аглоритм "ПолучитьСоотвествиеОбъектв" с установленным флагом "Использовать при загрузке"

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

| СоответствиеОбъектовДляОбмена.СобственнаяСсылка КАК Ссылка

|ИЗ

| РегистрСведений.СоответствиеОбъектовДляОбмена КАК СоответствиеОбъектовДляОбмена

|ГДЕ

| СоответствиеОбъектовДляОбмена.УзелОбмена = &УзелОбмена

| И СоответствиеОбъектовДляОбмена.СсылкаВДругойИБ = &СсылкаВДругойИБ

| И СоответствиеОбъектовДляОбмена.ИмяТипаПриемника = &ИмяТипаПриемника";

Запрос.УстановитьПараметр("УзелОбмена", Неопределено);

Запрос.УстановитьПараметр("СсылкаВДругойИБ",

СвойстваПоиска.Получить("{УникальныйИдентификатор}"));

Запрос.УстановитьПараметр("ИмяТипаПриемника", СтруктураСвойств.ТипСсылкиСтрокой);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

СсылкаНаОбъект=Выборка.Ссылка;

ОбъектНайден=Истина;

КонецЕсли;

Теперь более подробно о алгоритме.

Алгоритм реализует передачу переменной СсылкаНаОбъект определенного значения.

Из документации: СсылкаНаОбъект - ссылка на результирующий объект. Если в обработчике установить данную ссылку (не пустую) то программа ее запомнит и поиск на этом будет считать успешно завершенным

Теперь о том чего в документации не написано:

  1. Если установить данную ссылку (не пустую) , обработчик загрузки не поймет, что объект найден, и изменит его несмотря на установку свойства НеЗамещать. Поэтому присвоим значение переменной ОбъектНайден=Истина;
  2. Получить уникальный идентификатор можно из структуры поиска, если установлена синхронизация по уникальному идентификатору СвойстваПоиска.Получить("{УникальныйИдентификатор}")
  3. Строковое представление типа можно вытянуть еще из одной недокументированной структуры - СтруктураСвойств вот образец значений, которые она может содержать