Имя: Пароль:
1C
1С v8
Глупый вопрос про GUID 1с и ЗагрузкаВыгрузкаXML
0 Икогнито
 
16.03.12
12:31
ЗагрузкаВыгрузкаXML между одинаковыми по структуре базами переносит элемент справочника. Как я понимаю, обработка привязана к идентификатору элемента, потому переноси хоть 20 раз элементы не двоятся.

Если обработка может создавать в одинаковых по структуре базах элементы с одинаковыми идентификаторами, то почему нельзя программно в разных по структуре базах создавать элементы с нужным идентификатором?
1 YF
 
16.03.12
12:31
(0) Почему нельзя?
2 Икогнито
 
16.03.12
12:34
(1) Сейчас пишу обработку переноса контрагентов между разными по структуре базами.
1. И в источнике и в получателе есть один и тот же справочник "Контрагенты".
2. Прилепил регистр сведений, где вынужден хранить идентификаторы элементов из разных баз.

Неужели можно при загрузке из одной базы создать в справочнике элемент с точно таким же идентификатором, чтобы не лепить это в регистр соответствий? Как?
3 Sammo
 
16.03.12
12:34
УстановитьСсылкуНового(<Ссылка>)
Параметры:
<Ссылка> (обязательный)
Тип: СправочникСсылка. Ссылка, которая будет назначена при записи нового объекта.
4 Икогнито
 
16.03.12
12:35
(3) а как ссылке назначить идентификатор из другой базы?
5 Sammo
 
16.03.12
12:35
(4) Продажей СП занимаются другие люди. Там все есть - отправная точка дана
6 Икогнито
 
16.03.12
12:36
(5) что такое СП?
7 PVV65
 
16.03.12
12:37
(4) В ПКО на закладке "Настройки" поставить галку "Искать объект приемника по внутреннему идентификатору объекта источника".
8 PVV65
 
16.03.12
12:37
(3) Это здесь ни при чем.
9 Икогнито
 
16.03.12
12:38
(7) что такое ПКО?
10 Икогнито
 
16.03.12
12:40
Спасибо, помогли
11 Икогнито
 
16.03.12
12:40
+(10) в смысле, что не фига не помогли
12 fisher
 
16.03.12
12:41
(4) Объект УникальныйИдентификатор() имеет вариант конструктора из строки.
Метод ПолучитьСсылку() менеджеров объектов умеет создавать её из уникального идентификатора. А её уже можно назначить новому объекту. В конвертации именно так и делается. Там же всё штатными методами.
(6) Синтакс-Помощник.
(9) Правило Конвертации Объекта
13 PVV65
 
16.03.12
12:41
(9)(10)(11) Как ты пишешь правила переноса между базами с разной структурой, если не знаешь, что такое ПКО?
14 Kashemir
 
16.03.12
12:42
(11) Чем тебе (3) не угодило ?
15 Икогнито
 
16.03.12
12:43
(14) не решает проблему создания элемента с нужным идентификатором
16 PVV65
 
16.03.12
12:44
+(13) Понял. Ты пишешь свою обработку.
17 Икогнито
 
16.03.12
12:45
(13) фиг знает, вот так пишу:
ЗапросПоГруппам = СоединениеБП.NewObject("Запрос");
   ЗапросПоГруппам.Текст = "ВЫБРАТЬ
                           |    Контрагенты.Ссылка КАК Ссылка,
                           |    0 КАК Уровень,
                           |    ВЫРАЗИТЬ("""" КАК СТРОКА(36)) КАК УникальныйИдентификаторБП
                           |ИЗ
                           |    Справочник.Контрагенты КАК Контрагенты
                           |ГДЕ
                           |    Контрагенты.ЭтоГруппа";
                           
   ТабЗапроса = ЗапросПоГруппам.Выполнить().Выгрузить();
   
   Если ТабЗапроса.Количество() = 0 Тогда
       Возврат;
   КонецЕсли;
   
   Для Каждого СтрокаТабЗапроса из ТабЗапроса Цикл
       СтрокаТабЗапроса.Уровень = СтрокаТабЗапроса.Ссылка.Уровень();
       СтрокаТабЗапроса.УникальныйИдентификаторБП = СоединениеБП.Документы.удДоговор.ВернутьСтрокуУникальногоИдентификатора(СтрокаТабЗапроса.Ссылка);
   КонецЦикла;
   
   ТабЗапроса.Сортировать("Уровень убыв");
   
   Для Каждого СтрокаТабЗапроса из ТабЗапроса Цикл
       МаксНомерУровня = СтрокаТабЗапроса.Уровень;
       Прервать;
   КонецЦикла;
   
   ОтборСтрок = СоединениеБП.NewObject("Структура");
   
   Для ш = 0 По МаксНомерУровня Цикл
       ОтборСтрок.Вставить("Уровень",ш);
       МассивСтрокТаб = ТабЗапроса.НайтиСтроки(ОтборСтрок);
       
       Для к = 0 По МассивСтрокТаб.Количество()-1 Цикл
           
           
           СтрокаМассива = МассивСтрокТаб.Получить(к);
           СсылкаИсточник = СтрокаМассива.Ссылка;
           
           СсылкаИлиОбъект = НайтиСоответствиеКонтрагентаПоИдентификатору(СтрокаМассива.УникальныйИдентификаторБП,Истина);
           ОбъектНайденВРегистре = Ложь;
           
           Если ТипЗнч(СсылкаИлиОбъект)     = ТИП("СправочникОбъект.Контрагенты") Тогда
               ИзменяемыйОбъект = СсылкаИлиОбъект;
               ОбъектНайденВРегистре = Ложь;
           ИначеЕсли ТипЗнч(СсылкаИлиОбъект) = ТИП("СправочникСсылка.Контрагенты") Тогда
               ИзменяемыйОбъект = СсылкаИлиОбъект.ПолучитьОбъект();
               ИзменяемыйОбъект.Заблокировать();
               ОбъектНайденВРегистре = Истина;
           КонецЕсли;
           
           ИзменяемыйОбъект.Наименование     = СсылкаИсточник.Наименование;
           ИзменяемыйОбъект.ПометкаУдаления = СсылкаИсточник.ПометкаУдаления;
           
           Если ш > 0 Тогда
               РодительОбъектаИдентификатор = СоединениеБП.Документы.удДоговор.ВернутьСтрокуУникальногоИдентификатора(СсылкаИсточник.Родитель);
               ИзменяемыйОбъект.Родитель     = НайтиСоответствиеКонтрагентаПоИдентификатору(РодительОбъектаИдентификатор,Истина);
           КонецЕсли;
           
           ИзменяемыйОбъект.Записать();
           
           Если НЕ ОбъектНайденВРегистре Тогда //занесем в регистр соответствий
               СтруктураЗаписи = Новый Структура;
               СтруктураЗаписи.Вставить("Контрагент",ИзменяемыйОбъект.Ссылка);
               СтруктураЗаписи.Вставить("ИдентификаторБП",СтрокаМассива.УникальныйИдентификаторБП);
               СтруктураЗаписи.Вставить("ИдентификаторУСФ",СокрЛП(ИзменяемыйОбъект.Ссылка.УникальныйИдентификатор()));
               
               ВыполнитьЗаписьВРегистрСоответствийКонтрагентов(СтруктураЗаписи);
               
           КонецЕсли;
           
       КонецЦикла;
18 Kashemir
 
16.03.12
12:45
(15) Эту проблему как раз решает.
19 Икогнито
 
16.03.12
12:46
(18) приведи пожалуйста пример
20 fisher
 
16.03.12
12:46
Я понял. Чукча - писатель.
21 Kashemir
 
16.03.12
12:46
(19) В СП четко описано предназначение этого метода, полностью совпадающее с поставленной задачей.
22 Икогнито
 
16.03.12
12:47
(20) без обсиралова, плиз
23 Икогнито
 
16.03.12
12:48
(18)
СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>)
УстановитьСсылкуНового (SetNewObjectRef)
Синтаксис:

УстановитьСсылкуНового(<Ссылка>)
Параметры:

<Ссылка> (обязательный)

Тип: СправочникСсылка.
Ссылка, которая будет назначена при записи нового объекта.
Описание:

Устанавливает значение для нового (созданного и еще не записанного) объекта, которое будет назначено при записи в качестве ссылки. Значение не может равняться ссылке какого-либо из имеющихся в базе данных объекта данного типа. Уникальность ссылки проверяется при записи объекта.

Доступность:

Сервер, толстый клиент, внешнее соединение.
См. также:

СправочникМенеджер, метод ПолучитьСсылку
24 Икогнито
 
16.03.12
12:48
+(23) ни слова про строковый идентификатор типа b6b60de1-8b63-11e0-ab89-001e0bdd2030
25 Икогнито
 
16.03.12
12:50
Меня интересует вопрос, как создать элемент справочника Контрагенты с идентификатором "b6b60de1-8b63-11e0-ab89-001e0bdd2030".
26 Икогнито
 
16.03.12
12:51
+(25) имхо, в 1С это невозможно
27 fisher
 
16.03.12
12:58
(26) Ты таки чукча. Перечитай (12)
28 Kashemir
 
16.03.12
12:59
(26) Мда, как все запущено
НовыйКонтрагентОбъект.УстановитьСсылкуНового(Справочник.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор("b6b60de1-8b63-11e0-ab89-001e0bdd2030"))
29 Мыш
 
16.03.12
13:11
(25) Не делай так. Когда установишь элементу справочника точно такой же идентификатор - данные старого перезапишутся. Он не зря называется уникальным.
30 Мыш
 
16.03.12
13:12
+(29) А, хотя не прав. Тебе же в разных базах нужно.
31 Sammo
 
16.03.12
13:14
32 Мыш
 
16.03.12
13:14
Тогда элементарно. ОбъектСправочникаКонтрагенты = ПрочитатьXML(ЧтениеXML)
Идентификатор будет ровно такой же, как и в базе источнике.
33 Живой Ископаемый
 
16.03.12
13:15
2(32) при разных по составу реквизитов объектах выйдет ошибка.
34 Икогнито
 
16.03.12
13:22
(28) Спасибо, разобрался