gifts2017

Позиционирование на объект по ID

Опубликовал WWWolfy (WWWolfy) в раздел Программирование - Практика программирования

Позиционирование на объект по ID
Полезно при переносах/синхронизации по ОЛЕ.
При синхронизации справочников и/или документов по ОЛЕ (между 2-мя и более базами) часто возникает вопрос - как найти 'тот самый' объект?
Можно по коду или НомерДок, но они могут измениться. Логичный ответ - по ID объекта в базе.
Получить его несложно, тут описаны несколько способов:
http://www.sinor.ru/~my1c/knowhow/get_id.html

Но для обратного процесса - восстановления ссылки, я использую код (пример для документа), в котором применяется шаблон и который позволяет ускорить операцию восстановления ссылки.

Получаем ID и записываем в реквизит документа, который является копией:
 
// для удобства работаем из базы-оригинала
докиПостМатериалов = СоздатьОбъект("Документ.ПоступлениеМатериалов");
//...
текID = ЗначениеВСтрокуВнутр( докиПостМатериалов.ТекущийДокумент()  );
текID = Сред(текID, СтрДлина(текID)-14,  13);
докиПостМат_Оле.ID_перенос = текID;

Следующий код работает при определении ссылок "у кого уже есть копии".
 
// подготовка к позиционированию
// выполняется один раз на все док-ты
докиПостМатериалов = СоздатьОбъект("Документ.ПоступлениеМатериалов");
текШаблон = ЗначениеВСтрокуВнутр( докиПостМатериалов  );
текШаблон = лев(текШаблон, СтрДлина(текШаблон)-15)
        +"[текID]"+ Прав(текШаблон, 2);
// ...
// собственно позиционриование
текID = докиПостМат_Оле.ID_перенос;
выбранДок = 0;
Попытка
    докПостМат = ЗначениеИзСтрокиВнутр( Шаблон(текШаблон) );
    выбранДок = докПостМат.выбран();
Исключение
    Сообщить( "Ошибка при поз-ии: "+текID ,"!" );
КонецПопытки;
// докПостМат - получили ссылку!


Далее док-ты можно переоформлять, сравнивать и т.п. Главное что есть соответствия.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. robert (Robert) 02.11.06 16:02
Если добавление новых элементов или документов выполняеся в обоих базах, то одинаковые ID будут указывать на разные элементы, документы. Как такую ситуацию будешь разруливать?
2. WWWolfy (WWWolfy) 04.11.06 21:33
Вообще-то в ОДНОЙ бзае не бывает одинаковых ID. Синхронизация ориентируется на ОДНУ базу.
3. Мутабор 02.03.07 06:13
Недавно попал в ситуацию, была база, ее скопировали и работали в двух базах, а дной правили прошлые периоды, в другой делали текущие дела, нужно было все это слить вместе. Ну значит решил сделать так, сделал распределенку из одной, притянул ее к другой, удалил старые доки за период сто правили в одной базе, перелил их в другую. И тут выяснилость что есть доки с одинаковым ID в разных базах и лежат они в разных годах. Такая вот фигня, а ты ID.
4. WWWolfy (WWWolfy) 02.03.07 17:56
Если у вас одинаковые ID объектов, то я вам не завидую..
ИМХО ты что-то путаешь.