через СОМ, передать ГУИД для нового документа |
Я |
13.12.17 — 07:07
Необходимо подключиться к базе через СОМ, и проверить существует ли документ Перемещения по гуиду, если не находит в подключенной базе тогда в ней же создает и присваивает гуид из базы источника и затем тянет данные в него. Проблема в присваивании гуида из базы источника для нового созданного документа.
ЗапросCom = ПодключеннаяБаза.NewObject(«Запрос»);
ЗапросCom.Текст = «ВЫБРАТЬ
| ПеремещениеТоваров.Ссылка КАК ДокМаркет
|ИЗ
| Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
|ГДЕ
| ПеремещениеТоваров.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И ПеремещениеТоваров.Проведен = ИСТИНА»;
ЗапросCom.УстановитьПараметр(«ДатаНач», ЭтотОбъект.ДатаНач);
ЗапросCom.УстановитьПараметр(«ДатаКон», КонецДня(ЭтотОбъект.ДатаКон));
Рез = ЗапросCom.Выполнить().Выбрать();
Пока Рез.Следующий() Цикл
ГУИДМаркет = ПодключеннаяБаза.String(Рез.ДокМаркет.УникальныйИдентификатор());
ИщемДокВУПП(ГУИДМаркет);
КонецЦикла;
ПодключеннаяБаза = Неопределено;
Сообщить(«Обработка завершена!»);
КонецПроцедуры
Функция ИщемДокВУПП(ГУИДМаркет)
Список = СписокЭкспорт.Выгрузить();
Для каждого Стр Из Список Цикл
ГуидДокЭкспорт = Стр.ДокЭкспорт.УникальныйИдентификатор();
ГУИДУПП = Строка(Стр.ДокЭкспорт.УникальныйИдентификатор());
Если ГУИДМаркет = ГУИДУПП Тогда
Продолжить;
Иначе
НовыйДок = ПодключеннаяБаза.Документы.ПеремещениеТоваров.СоздатьДокумент();
Ссылка = НовыйДок.ПолучитьСсылку(Новый УникальныйИдентификатор(ГуидДокЭкспорт));
НовыйДок.УстановитьСсылкуНового(Ссылка);
НовыйДок.ВидОперации = ПодключеннаяБаза.Перечисления.ВидыОперацийПеремещениеТоваров.ТоварыПродукция;
НовыйДок.Дата = Стр.ДокЭкспорт.Дата;
НовыйДок.ОтражатьВУправленческомУчете = Истина;
НовыйДок.ОтражатьВБухгалтерскомУчете = Истина;
********
Новыйдок.ОбменДанными.Загрузка = Истина;
НовыйДок.Записать();
*******
Метод объекта не обнаружен (ПолучитьСсылку)
Ссылка = НовыйДок.ПолучитьСсылку(Новый УникальныйИдентификатор(ГуидДокЭкспорт));
1 — 13.12.17 — 07:11
Ссылка = НовыйДок.ПолучитьСсылку(ПодключеннаяБаза.NewObject(«УникальныйИдентификатор»,СокрЛП(ГуидДокЭкспорт)));
2 — 13.12.17 — 07:13
+1
3 — 13.12.17 — 07:17
(1) Метод объекта не обнаружен (ПолучитьСсылку)
Ссылка = НовыйДок.ПолучитьСсылку(ПодключеннаяБаза.NewObject(«УникальныйИдентификатор», СокрЛП(ГуидДокЭкспорт)));
4 — 13.12.17 — 07:24
Если эту строку убрать
Для каждого Стр Из Список Цикл
ГуидДокЭкспорт = Стр.ДокЭкспорт.УникальныйИдентификатор();
ГУИДУПП = Строка(Стр.ДокЭкспорт.УникальныйИдентификатор());
Если ГУИДМаркет = ГУИДУПП Тогда
Продолжить;
Иначе
НовыйДок = ПодключеннаяБаза.Документы.ПеремещениеТоваров.СоздатьДокумент();
НовыйДок.УстановитьСсылкуНового(ГуидДокЭкспорт);
то выдает следующее Ошибка при вызове метода контекста (УстановитьСсылкуНового)
НовыйДок.УстановитьСсылкуНового(ГуидДокЭкспорт);
по причине:
Несоответствие типов (параметр номер ‘1’)
5 — 13.12.17 — 07:30
…в синтаксисе у метода ПолучитьСсылку() Доступность:
внешнее соединение
6 — 13.12.17 — 07:31
у меня работает:
ИД = СсылкаНаОбъект.УникальныйИдентификатор();
СсылкаОбъектаПриемника = Соединение.Документы[ИмяОбъекта].ПолучитьСсылку(Соединение.NewObject(«УникальныйИдентификатор»,СокрЛП(ИД)));
7 — 13.12.17 — 07:32
(4)Конечно будет ошибка, ты ему вместо гуила ком-объект даешь.
9 — 13.12.17 — 07:35
а может из за платформы? подключаюсь через 8.2.19.83 (7)
10 — 13.12.17 — 07:35
ИД = СсылкаНаОбъект.УникальныйИдентификатор();
СсылкаОбъектаПриемника = Соединение.Документы[ИмяОбъекта].ПолучитьСсылку(Соединение.NewObject(«УникальныйИдентификатор»,СокрЛП(ИД)));
ОбъектПриемника = СсылкаОбъектаПриемника.ПолучитьОбъект();
Если ОбъектПриемника = Неопределено Тогда
ОбъектПриемника = Соединение[ТипОбъекта][СокрЛП(ИмяОбъекта)].СоздатьДокумент();
ОбъектПриемника.УстановитьСсылкуНового(СсылкаОбъектаПриемника);
КонецЕсли;
11 — 13.12.17 — 07:35
всмысле в этой версии этот метод неизвестен
12 — 13.12.17 — 07:38
(11) потому что должно быть не
Ссылка = НовыйДок.ПолучитьСсылку(Новый УникальныйИдентификатор(ГуидДокЭкспорт));
а
Ссылка = ПодключеннаяБаза.Документы.ПеремещениеТоваров.ПолучитьСсылку((ПодключеннаяБаза.NewObject("УникальныйИдентификатор",СокрЛП(ГуидДокЭкспорт)));
это метод не объекта, а менеджера
13 — 13.12.17 — 07:43
(12) при таком коде выдает следующее
Для каждого Стр Из Список Цикл
ГуидДокЭкспорт = Стр.ДокЭкспорт.УникальныйИдентификатор();
ГУИДУПП = Строка(Стр.ДокЭкспорт.УникальныйИдентификатор());
Если ГУИДМаркет = ГУИДУПП Тогда
Продолжить;
Иначе
НовыйДок = ПодключеннаяБаза.Документы.ПеремещениеТоваров.СоздатьДокумент();
НовыйДокСсылка = ПодключеннаяБаза.Документы.ПеремещениеТоваров.ПолучитьСсылку(ПодключеннаяБаза.NewObject(«УникальныйИдентификатор», СокрЛП(ГуидДокЭкспорт)));
НовыйДок.УстановитьСсылкуНового(НовыйДокСсылка);
НовыйДок.ВидОперации = ПодключеннаяБаза.Перечисления.ВидыОперацийПеремещениеТоваров.ТоварыПродукция;
НовыйДок.Дата = Стр.ДокЭкспорт.Дата;
*************
НовыйДок.ОбменДанными.Загрузка = Истина;
НовыйДок.Записать();
/////
Ошибка при вызове метода контекста (Записать)
НовыйДок.Записать();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.2.19.83): Ошибка при попытке вставки записи с неуникальным значением ссылки.
таблица Document118.
14 — 13.12.17 — 07:50
(13) Погоди, так ГуидДокЭкспорт это ГУИД уже имеющегося документа в подключенной базе, как я понимаю (из кода мне неясно, что там в СписокЭкспорт) потому и ругается. Для нового объекта нужно новую уникальную ссылку типа ПодключеннаяБаза.NewObject(«УникальныйИдентификатор») без второго параметра
15 — 13.12.17 — 07:51
(13)не проще ли получить ссылку, потом получить объект, если его нет будет новый создан
НовыйДок = НовыйДокСсылка.ПолучитьОбъект();
16 — 13.12.17 — 07:57
(14) есть обработка выполняется в базе Источник, создает доки проводит их, следующий этап эти доки должны мигрировать в базу приемник, через сом создается подключение, далее запросом получаю существующие доки и проверяю их по гуиду из базы источника если гуид не совпал тогда в базе приемнике создаю новый док и присваиваю ему гиуд из источника, заполняю, записываю и провожу. Проблема только в присваивании гиуда из источника для созданного дока в базе приемнике.
17 — 13.12.17 — 08:11
(16) Ага, ясно. Такгуид из источника может просто не подойти к приемнику. Это же разные базы, в них одинаковые гуиды могут быть присвоены не соответствующим друг другу объектам. Это и есть тот случай — гуид из источника уже присвоен в приемнике какому-то другому объекту.
Коллизий с гуидами нет в базах, связанных планами обмена, где есть главный и подчиненные узлы, и подчиненные выгружены из главной, у них одна конфа, но это же не тот случай? Вот там уникальность поддерживается для каждой базы.
А так, у меня, например, отдельный регистр для ведения соответствия гуидов внешних баз объектам «центральной». И в типовых тоже бывает что-то вроде РС СоответствиеОбъектовДляОбмена — для случаев обмена между разными конфигурациями.
18 — 13.12.17 — 08:58
Вместо функции Строка() используй XMLСтрока()
lirt82
19 — 13.12.17 — 09:03
(17) (18) всем спасибо, буду делать в два этапа) двумя разными обработками)).
через СОМ, передать ГУИД для нового документа |
Я |
lirt82
13.12.17 — 07:07
Необходимо подключиться к базе через СОМ, и проверить существует ли документ Перемещения по гуиду, если не находит в подключенной базе тогда в ней же создает и присваивает гуид из базы источника и затем тянет данные в него. Проблема в присваивании гуида из базы источника для нового созданного документа.
ЗапросCom = ПодключеннаяБаза.NewObject(«Запрос»);
ЗапросCom.Текст = «ВЫБРАТЬ
| ПеремещениеТоваров.Ссылка КАК ДокМаркет
|ИЗ
| Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
|ГДЕ
| ПеремещениеТоваров.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И ПеремещениеТоваров.Проведен = ИСТИНА»;
ЗапросCom.УстановитьПараметр(«ДатаНач», ЭтотОбъект.ДатаНач);
ЗапросCom.УстановитьПараметр(«ДатаКон», КонецДня(ЭтотОбъект.ДатаКон));
Рез = ЗапросCom.Выполнить().Выбрать();
Пока Рез.Следующий() Цикл
ГУИДМаркет = ПодключеннаяБаза.String(Рез.ДокМаркет.УникальныйИдентификатор());
ИщемДокВУПП(ГУИДМаркет);
КонецЦикла;
ПодключеннаяБаза = Неопределено;
Сообщить(«Обработка завершена!»);
КонецПроцедуры
Функция ИщемДокВУПП(ГУИДМаркет)
Список = СписокЭкспорт.Выгрузить();
Для каждого Стр Из Список Цикл
ГуидДокЭкспорт = Стр.ДокЭкспорт.УникальныйИдентификатор();
ГУИДУПП = Строка(Стр.ДокЭкспорт.УникальныйИдентификатор());
Если ГУИДМаркет = ГУИДУПП Тогда
Продолжить;
Иначе
НовыйДок = ПодключеннаяБаза.Документы.ПеремещениеТоваров.СоздатьДокумент();
Ссылка = НовыйДок.ПолучитьСсылку(Новый УникальныйИдентификатор(ГуидДокЭкспорт));
НовыйДок.УстановитьСсылкуНового(Ссылка);
НовыйДок.ВидОперации = ПодключеннаяБаза.Перечисления.ВидыОперацийПеремещениеТоваров.ТоварыПродукция;
НовыйДок.Дата = Стр.ДокЭкспорт.Дата;
НовыйДок.ОтражатьВУправленческомУчете = Истина;
НовыйДок.ОтражатьВБухгалтерскомУчете = Истина;
********
Новыйдок.ОбменДанными.Загрузка = Истина;
НовыйДок.Записать();
*******
Метод объекта не обнаружен (ПолучитьСсылку)
Ссылка = НовыйДок.ПолучитьСсылку(Новый УникальныйИдентификатор(ГуидДокЭкспорт));
catena
1 — 13.12.17 — 07:11
Ссылка = НовыйДок.ПолучитьСсылку(ПодключеннаяБаза.NewObject(«УникальныйИдентификатор»,СокрЛП(ГуидДокЭкспорт)));
Antony8x
2 — 13.12.17 — 07:13
+1
lirt82
3 — 13.12.17 — 07:17
(1) Метод объекта не обнаружен (ПолучитьСсылку)
Ссылка = НовыйДок.ПолучитьСсылку(ПодключеннаяБаза.NewObject(«УникальныйИдентификатор», СокрЛП(ГуидДокЭкспорт)));
lirt82
4 — 13.12.17 — 07:24
Если эту строку убрать
Для каждого Стр Из Список Цикл
ГуидДокЭкспорт = Стр.ДокЭкспорт.УникальныйИдентификатор();
ГУИДУПП = Строка(Стр.ДокЭкспорт.УникальныйИдентификатор());
Если ГУИДМаркет = ГУИДУПП Тогда
Продолжить;
Иначе
НовыйДок = ПодключеннаяБаза.Документы.ПеремещениеТоваров.СоздатьДокумент();
НовыйДок.УстановитьСсылкуНового(ГуидДокЭкспорт);
то выдает следующее Ошибка при вызове метода контекста (УстановитьСсылкуНового)
НовыйДок.УстановитьСсылкуНового(ГуидДокЭкспорт);
по причине:
Несоответствие типов (параметр номер ‘1’)
lirt82
5 — 13.12.17 — 07:30
…в синтаксисе у метода ПолучитьСсылку() Доступность:
внешнее соединение
catena
6 — 13.12.17 — 07:31
у меня работает:
ИД = СсылкаНаОбъект.УникальныйИдентификатор();
СсылкаОбъектаПриемника = Соединение.Документы[ИмяОбъекта].ПолучитьСсылку(Соединение.NewObject(«УникальныйИдентификатор»,СокрЛП(ИД)));
catena
7 — 13.12.17 — 07:32
(4)Конечно будет ошибка, ты ему вместо гуила ком-объект даешь.
lirt82
9 — 13.12.17 — 07:35
а может из за платформы? подключаюсь через 8.2.19.83 (7)
catena
10 — 13.12.17 — 07:35
ИД = СсылкаНаОбъект.УникальныйИдентификатор();
СсылкаОбъектаПриемника = Соединение.Документы[ИмяОбъекта].ПолучитьСсылку(Соединение.NewObject(«УникальныйИдентификатор»,СокрЛП(ИД)));
ОбъектПриемника = СсылкаОбъектаПриемника.ПолучитьОбъект();
Если ОбъектПриемника = Неопределено Тогда
ОбъектПриемника = Соединение[ТипОбъекта][СокрЛП(ИмяОбъекта)].СоздатьДокумент();
ОбъектПриемника.УстановитьСсылкуНового(СсылкаОбъектаПриемника);
КонецЕсли;
lirt82
11 — 13.12.17 — 07:35
всмысле в этой версии этот метод неизвестен
Сти
12 — 13.12.17 — 07:38
(11) потому что должно быть не
Ссылка = НовыйДок.ПолучитьСсылку(Новый УникальныйИдентификатор(ГуидДокЭкспорт));
а
Ссылка = ПодключеннаяБаза.Документы.ПеремещениеТоваров.ПолучитьСсылку((ПодключеннаяБаза.NewObject("УникальныйИдентификатор",СокрЛП(ГуидДокЭкспорт)));
это метод не объекта, а менеджера
lirt82
13 — 13.12.17 — 07:43
(12) при таком коде выдает следующее
Для каждого Стр Из Список Цикл
ГуидДокЭкспорт = Стр.ДокЭкспорт.УникальныйИдентификатор();
ГУИДУПП = Строка(Стр.ДокЭкспорт.УникальныйИдентификатор());
Если ГУИДМаркет = ГУИДУПП Тогда
Продолжить;
Иначе
НовыйДок = ПодключеннаяБаза.Документы.ПеремещениеТоваров.СоздатьДокумент();
НовыйДокСсылка = ПодключеннаяБаза.Документы.ПеремещениеТоваров.ПолучитьСсылку(ПодключеннаяБаза.NewObject(«УникальныйИдентификатор», СокрЛП(ГуидДокЭкспорт)));
НовыйДок.УстановитьСсылкуНового(НовыйДокСсылка);
НовыйДок.ВидОперации = ПодключеннаяБаза.Перечисления.ВидыОперацийПеремещениеТоваров.ТоварыПродукция;
НовыйДок.Дата = Стр.ДокЭкспорт.Дата;
*************
НовыйДок.ОбменДанными.Загрузка = Истина;
НовыйДок.Записать();
/////
Ошибка при вызове метода контекста (Записать)
НовыйДок.Записать();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.2.19.83): Ошибка при попытке вставки записи с неуникальным значением ссылки.
таблица Document118.
Сти
14 — 13.12.17 — 07:50
(13) Погоди, так ГуидДокЭкспорт это ГУИД уже имеющегося документа в подключенной базе, как я понимаю (из кода мне неясно, что там в СписокЭкспорт) потому и ругается. Для нового объекта нужно новую уникальную ссылку типа ПодключеннаяБаза.NewObject(«УникальныйИдентификатор») без второго параметра
Efir12
15 — 13.12.17 — 07:51
(13)не проще ли получить ссылку, потом получить объект, если его нет будет новый создан
НовыйДок = НовыйДокСсылка.ПолучитьОбъект();
lirt82
16 — 13.12.17 — 07:57
(14) есть обработка выполняется в базе Источник, создает доки проводит их, следующий этап эти доки должны мигрировать в базу приемник, через сом создается подключение, далее запросом получаю существующие доки и проверяю их по гуиду из базы источника если гуид не совпал тогда в базе приемнике создаю новый док и присваиваю ему гиуд из источника, заполняю, записываю и провожу. Проблема только в присваивании гиуда из источника для созданного дока в базе приемнике.
Сти
17 — 13.12.17 — 08:11
(16) Ага, ясно. Такгуид из источника может просто не подойти к приемнику. Это же разные базы, в них одинаковые гуиды могут быть присвоены не соответствующим друг другу объектам. Это и есть тот случай — гуид из источника уже присвоен в приемнике какому-то другому объекту.
Коллизий с гуидами нет в базах, связанных планами обмена, где есть главный и подчиненные узлы, и подчиненные выгружены из главной, у них одна конфа, но это же не тот случай? Вот там уникальность поддерживается для каждой базы.
А так, у меня, например, отдельный регистр для ведения соответствия гуидов внешних баз объектам «центральной». И в типовых тоже бывает что-то вроде РС СоответствиеОбъектовДляОбмена — для случаев обмена между разными конфигурациями.
George Wheels
18 — 13.12.17 — 08:58
Вместо функции Строка() используй XMLСтрока()
lirt82
19 — 13.12.17 — 09:03
(17) (18) всем спасибо, буду делать в два этапа) двумя разными обработками)).
Содержание
- УстановитьСсылкуНового не работает
- УстановитьСсылкуНового() не работает
- УстановитьСсылкуНового или Как восстановить ссылку на объект
- УстановитьСсылкуНового() или «как узнать ссылку на объект до записи»
- Как узнать ссылку на объект до его записи
- Особенности получения ссылок на новые объекты при обмене данными
- УстановитьСсылкуНового() или «как узнать ссылку на объект до записи» : 2 комментария
- как установить ссылку нового?
УстановитьСсылкуНового не работает
Текст = ПодключеннаяИБ.string(ПодклДокумент.ref.УникальныйИдентификатор());
КлючУникальности = новый УникальныйИдентификатор(Текст);
ТекСсылка = ТипДокумента.ПолучитьСсылку(КлючУникальности));
НовыйДок = ТипДокумента.СоздатьДокумент();
НовыйДок.УстановитьСсылкуНового(ТекСсылка);
;сообщить(«НовыйДок.получитьссылкунового() = » + НовыйДок.получитьссылкунового());
;сообщить(«ПодклДокумент.УникальныйИдентификатор()) = » + ПодключеннаяИБ.string(ПодклДокумент.ref.УникальныйИдентификатор()));
НовыйДок.Записать();
;сообщить(«записан документ с уникальнымидентификатором = » + НовыйДок.ссылка.уникальныйидентификатор());
;Сообщить(«» + ТипДокумента.ПолучитьСсылку(КлючУникальности).ПолучитьОбъект());
НовыйДок.получитьссылкунового() = (37:a35548f3962946314732d5138994c3f5)
ПодклДокумент.УникальныйИдентификатор()) = 8994c3f5-d513-4732-a355-48f396294631
записан документ с уникальнымидентификатором = 7123649e-0de9-4330-a21b-6555a6499a26
неопределено
То есть ссылка после записи не равна той, которую я устанавливаю до записи.
Что я делаю не так?
Может конечно я не совсем точно выразился.
Суть:
Создаю документ, на основании взятого из другой базы уникального Идентификатора. Записываю документ, НО после записи он имеет другой уникальный идентификатор.
соответственно конструкция
ТипДокумента.ПолучитьСсылку(КлючУникальности).ПолучитьОбъект()
возращает «неопределено» вместо только что созданного документа.
Источник
УстановитьСсылкуНового() не работает
ДокументГуид = Новый УникальныйИдентификатор(ДокументГуидСтрока);
ДокументПоГуиду = Документы[Тип].ПолучитьСсылку(ДокументГуид);
ТекущийДокумент = Документы[Тип].СоздатьДокумент();
ТекущийДокумент.УстановитьСсылкуНового(ДокументПоГуиду);
после чего ТекущийДокумент.Ссылка.УникальныйИдентификатор() остается все таким же нулевым
ПолучитьСсылкуНового()
Возвращаемое значение:
Тип: ДокументСсылка. .
Описание:
Позволяет для нового (созданного и еще не записанного) объекта получить ранее установленное методом
УстановитьСсылкуНового значение ссылки.
Что тут не понятного?
Хотя может погорячился, я обмены через кд делаю и там с этим сталкиваюсь. Буквально в прошлом месяце пришлось попотеть придумывая как из 7-ки загружать в 8-ке и подсунуть ему свой гуид без правки обработки загрузки
Сейчас проверил на типовой бп на документах и справочниках. 1С только на справочнике сотруднике подменил гуид на свой, в остальных случаях гуид не менял
Справочники
3a1b8a23-c1c1-11e8-8464-00268332bca9
Контрагенты
3a1b8a27-c1c1-11e8-8464-00268332bca9
СтруктураПредприятия
Документы
ВводОстатков
3a1b8a30-c1c1-11e8-8464-00268332bca9
ВнутреннееПотреблениеТоваров
3a1b8a31-c1c1-11e8-8464-00268332bca9
p.S. Часть документов и справочников пропущены так как при записи ругались на незаполненые реквизиты
(65) Запустил поиск по БП3.0.64 текста «»СсылкаНового»», нашлось 3 строки. 2 связаны с (58). Ещё одна связана с справочником пользователи, как понял пользователь «по умолчанию» создается с фикс. ид:
Источник
УстановитьСсылкуНового или Как восстановить ссылку на объект
Каким-то образом был удален объект из базы. Цель Восстановить по » (124:820694de80c8cdb911e4ed4b0f3b6683)»
Собственно Сабж. Вероятно я некорректно передаю ГУИД объекту. Причина в том что Документ создаю. Но как была ссылка в других доках на него » (124:820694de80c8cdb911e4ed4b0f3b6683)», так и осталась. Подскажите братцы в чем моя проблема в данном случае?
ИначеЕсли ТипОбъекта = «Документ» Тогда
ОбъектСсылка = Документы[ИмяОбъекта].СоздатьДокумент();
ОбъектСсылка.УстановитьСсылкуНового(Документы[ИмяОбъекта].ПолучитьСсылку(УникальныйИд));
КонецЕсли;
попытка
ОбъектСсылка.ОбменДанными.Загрузка=Истина;
КонецПопытки;
Форма = ОбъектСсылка.ПолучитьФорму(«Документ.ОтчетОРозничныхПродажах.ФормаОбъекта»);
Форма.Открыть();
Нет, всё далеко не так, понимаю что делаю по аналогии с обычными формами. Но все же: 1) Создаю документ, 2) Присваиваю ему ГУДИ при помощи «УстановитьСсылкуНового()», 3) Открываю форму для редактирования и записи. Так вот я так понимаю что на УФ, ГУИД присваивается в момент записи? Как логически это обойти?
Пытался ПолучитьОбъект(), а затем записать(), Но Увы получать пока нечего же. Вот как бы вы эту ситуацию обошли?)
(4) В любом случае необходимо обработать обязательные реквизиты и корректно заполнить документ. Меня интересовал другой вопрос. И я разобрался. Дело в том что Если я записываю до Назначения ОбменДанными.Загрузка = Истина То программа игнорирует все что я стараюсь сделать и назначает свой ГУИД. Помогла запись объекта и установка даты после ОбменДанными.Загрузка = Истина.
Как имея тип объекта корректно передать сюда форму??
Ну хотя идея наверное ясна.. просто передам попробую передать вот так насколько жизненна будет идея?)
(11) Gонимаю, естественно. Я из этой записи при помощи нехитрого кода получаю ГУИД. Суть то ведь ясна. Код ниже прилагаю если кому пригодится.
(15) Вот как присваиваю ГУИД вновь созданному объекту
Источник
УстановитьСсылкуНового() или «как узнать ссылку на объект до записи»
Многие знают, что любому объекту ссылочного типа в 1С ссылка присваивается при записи в базу данных. То есть, если объект новый, то реквизит Ссылка у него пустой. Кстати, это один из способов узнать, работает пользователь с новым, только что созданным объектом, или же открыл уже существующий.
При записи объекта устанавливается случайная ссылка, так что предугадать ее у вас вряд ли получится. Тем не менее, существуют ситуации, когда полезно и даже необходимо знать ссылку на объект еще до записи этого объекта в базу. Приведем несколько примеров:
- При обмене данными необходимо программно создать некоторые записи в регистрах, включающие ссылку на объект обмена. При этом в базе-источнике таких регистров нет. Пример такой задачи мы подробно рассмотрим ниже.
- При оптимизации работы программного кода. Например, нужно программно создать контрагента, его договор и установить этот договор как Основной. Если идти классическим путем, то нужно сначала создать и записать элемент справочника Контрагенты, пройдя при этом все процедуры записи (а это может занять значительное время). Далее, нужно создать элемент справочника ДоговорыКонтрагентов, установив в качестве Владельца ссылку на контрагента. И наконец, получив заново объект элемента справочника Контрагенты, заполнить там реквизит ОсновнойДоговор и записать его, пройдя заново все процедуры записи.
Эту процедуру можно ускорить, зная заранее ссылку на еще не созданный ДоговорКонтрагента. В этом случае уже не требуется два раза получать и записывать Контрагента.
Как узнать ссылку на объект до его записи
- Сгенерировать уникальный идентификатор объекта.
- Зарезервировать ссылку по уникальному идентификатору
- Установить зарезервированную ссылку для нового объекта.
//Создаем уникальный идентификатор
УИД = новый УникальныйИдентификатор ;
//Создаем ссылку по этому идентификатору. Для этого нужно знать тип объекта
НоваяСсылка = Справочники . Контрагенты . ПолучитьСсылку ( УИД ) ;
//Устанавливаем ссылку для нового объекта
СправочникОбъект . УстановитьСсылкуНового ( НоваяСсылка ) ;
После этого объект можно записать. Будет установлена заранее известная ссылка.
Особенности получения ссылок на новые объекты при обмене данными
Рассмотрим, как получить ссылку на незаписанный объект на примере следующей задачи:
При обмене данными между двумя базами передается документ приобретения товаров. В базе источнике есть реквизит с типом Булево, показывающий получение оригиналов документов от поставщика. В базе-приемнике отметка о получении оригиналов реализована через регистр сведений с измерением — ссылкой на документ и ресурсом — ссылкой на перечисление.
Для решения этой задачи будет использоваться обработчик ПослеЗагрузки в правилах конвертации документа приобретения. Реквизит ОригиналыПолучены будет передаваться в виде параметра.
Код будет выглядеть так:
ОригиналыПолучены = ПараметрыОбъекта [ «ОригиналыПолучены» ] ;
Если ОригиналыПолучены Тогда
//Если записывается новый объект, создадим его ссылку
//В противном случае используем найденную
Если НЕ ОбъектНайден Тогда
СсылкаДокумента = Документы . ПоступлениеТоваровУслуг . ПолучитьСсылку ( новый УникальныйИдентификатор ) ;
Объект . УстановитьСсылкуНового ( СсылкаДокумента ) ;
Иначе
СсылкаДокумента = Ссылка ;
КонецЕсли ;
МЗ = РегистрыСведений . СтатусыДокументов . СоздатьМенеджерЗаписи ( ) ;
МЗ . Организация = Объект . Организация ;
//Устанавливаем в записи регистра сведений ссылку, полученную для еще не записанного объекта
МЗ . Документ = СсылкаДокумента ;
МЗ . Статус = Перечисления . СтатусыДокументовПоступления . ОригиналПолучен ;
МЗ . Записать ( ) ;
КонецЕсли ;
ВАЖНО. Если в обмене участвуют другие объекты, имеющие ссылки на наш документ приобретения товаров (например, счета-фактуры), то в них вы скорее всего получите , т.к. мы заменили ссылку на документ. Для того чтобы этого избежать, нужно в правилах конвертации документа на вкладке Настройки установить флаг Не запоминать выгруженные объекты. При использовании этого флага система не будет сохранять документы в специальной таблице кеширования, а каждый раз будет подбирать ссылку этого объекта заново, уже с учетом внесенных нами изменений.
УстановитьСсылкуНового() или «как узнать ссылку на объект до записи» : 2 комментария
а как быть если нужно создать с тем же УИД, как и в исходной базе, как этот самый УИД получить?
УИД объекта можно получить с помощью функции УникальныйИдентификатор()
Чтобы задать объекту конкретный УИД нужно сделать так:
Новый_UID = Новый УникальныйИдентификатор(«1014270d-d794-11df-825c-001517542b78»);
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый _UID);
НашаНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НашаНоменклатура.УстановитьСсылкуНового(НоваяСсылка);
Если нужно заменить УИД уже существующего объекта, то все равно создают новый объект — копию существующего, а потом выполняют поиск и замену ссылок по всей базе. Есть такая обработка даже. Если этого не сделать, получите везде вместо ссылки на объект с новым УИД .
Только при обмене не обязательно делать одинаковые УИД в базах. Сопоставление объектов происходит через регистр сведений Соответствия объектов информационных баз.
Источник
как установить ссылку нового?
Код в управляемой форме:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Ключ.Пустая() Тогда
УИД = Новый УникальныйИдентификатор;
СсылкаНового = Документы.ФормированиеЗадач.ПолучитьСсылку(УИД);
ДокументФормированиеЗадач = ДанныеФормыВЗначение(Объект, Тип(«ДокументОбъект.ФормированиеЗадач»));
ДокументФормированиеЗадач.УстановитьСсылкуНового(СсылкаНового);
ЗначениеВДанныеФормы(ДокументФормированиеЗадач, Объект);
Не срабатывает, при записи формирует другую ссылку.
Синтаксис:
ПолучитьСсылкуНового()
Возвращаемое значение:
Тип: ДокументСсылка.
Описание:
Позволяет для нового (созданного и еще не записанного) объекта получить ранее установленное методом УстановитьСсылкуНового значение ссылки.
Доступность:
Сервер, толстый клиент, внешнее соединение.
См. также:
ДокументМенеджер, метод ПолучитьСсылку
(5) Не совсем понятно, какие могут быть исключения при загрузке из произвольного XML-файла. А загрузка с идентификаторами даже из 8.1 работает на ура.
Но, в свете (5), на правах тыканья пальцем в небо, для (0): проверь неинтерактивное создание с твоей ссылкой. Если всё норм, то стоит посмотреть на саму форму — может, Параметры.Ключ сразу задать, например?
Ключ формы — это идентификатор основного реквизита формы. По логике — это должен быть УИД основного реквизита, в данном случае, элемента справочника.
Параметры формы доступны на чтение/запись, это структура. Не в курсе, касается ли это Параметры.Ключ, но не вижу причин, почему нет.
TitanLuchs, наверное, глубже копал, хочется его мнение услышать.
например вот УИДЫ, которые по коду в (0) генерятся, т.е. в форме:
f7a0fa12-3774-46d0-b230-5aa25e42468a
abefebd7-79f3-4dd0-9b36-d5df851d9fd2
b97d7f22-fc09-4148-845c-987499bb7e7b
207f5797-8d1e-4a1e-b5f7-c9409793fbdc
а вот примеры уже после записи объектов:
ee3c0e75-e584-11de-af44-001e379f1bef
ee3c0e76-e584-11de-af44-001e379f1bef
ee3c0e77-e584-11de-af44-001e379f1bef
Источник
Многие знают, что любому объекту ссылочного типа в 1С ссылка присваивается при записи в базу данных. То есть, если объект новый, то реквизит Ссылка у него пустой. Кстати, это один из способов узнать, работает пользователь с новым, только что созданным объектом, или же открыл уже существующий.
Если Ссылка = Справочники.Контрагенты.ПустаяСсылка() Тогда
//Это новый контрагент
Иначе
//Это ранее записанный контрагент
КонецЕсли;
При записи объекта устанавливается случайная ссылка, так что предугадать ее у вас вряд ли получится. Тем не менее, существуют ситуации, когда полезно и даже необходимо знать ссылку на объект еще до записи этого объекта в базу. Приведем несколько примеров:
- При обмене данными необходимо программно создать некоторые записи в регистрах, включающие ссылку на объект обмена. При этом в базе-источнике таких регистров нет. Пример такой задачи мы подробно рассмотрим ниже.
- При оптимизации работы программного кода. Например, нужно программно создать контрагента, его договор и установить этот договор как Основной. Если идти классическим путем, то нужно сначала создать и записать элемент справочника Контрагенты, пройдя при этом все процедуры записи (а это может занять значительное время). Далее, нужно создать элемент справочника ДоговорыКонтрагентов, установив в качестве Владельца ссылку на контрагента. И наконец, получив заново объект элемента справочника Контрагенты, заполнить там реквизит ОсновнойДоговор и записать его, пройдя заново все процедуры записи.
Эту процедуру можно ускорить, зная заранее ссылку на еще не созданный ДоговорКонтрагента. В этом случае уже не требуется два раза получать и записывать Контрагента.
Как узнать ссылку на объект до его записи
Последовательность действий:
- Сгенерировать уникальный идентификатор объекта.
- Зарезервировать ссылку по уникальному идентификатору
- Установить зарезервированную ссылку для нового объекта.
//Создаем уникальный идентификатор
УИД = новый УникальныйИдентификатор;
//Создаем ссылку по этому идентификатору. Для этого нужно знать тип объекта
НоваяСсылка = Справочники.Контрагенты.ПолучитьСсылку(УИД);
//Устанавливаем ссылку для нового объекта
СправочникОбъект.УстановитьСсылкуНового(НоваяСсылка);
После этого объект можно записать. Будет установлена заранее известная ссылка.
Особенности получения ссылок на новые объекты при обмене данными
Рассмотрим, как получить ссылку на незаписанный объект на примере следующей задачи:
При обмене данными между двумя базами передается документ приобретения товаров. В базе источнике есть реквизит с типом Булево, показывающий получение оригиналов документов от поставщика. В базе-приемнике отметка о получении оригиналов реализована через регистр сведений с измерением — ссылкой на документ и ресурсом — ссылкой на перечисление.
Для решения этой задачи будет использоваться обработчик ПослеЗагрузки в правилах конвертации документа приобретения. Реквизит ОригиналыПолучены будет передаваться в виде параметра.
Код будет выглядеть так:
ОригиналыПолучены = ПараметрыОбъекта[«ОригиналыПолучены»];
Если ОригиналыПолучены Тогда
//Если записывается новый объект, создадим его ссылку
//В противном случае используем найденную
Если НЕ ОбъектНайден Тогда
СсылкаДокумента = Документы.ПоступлениеТоваровУслуг.ПолучитьСсылку(новый УникальныйИдентификатор);
Объект.УстановитьСсылкуНового(СсылкаДокумента);
Иначе
СсылкаДокумента = Ссылка;
КонецЕсли;
МЗ=РегистрыСведений.СтатусыДокументов.СоздатьМенеджерЗаписи();
МЗ.Организация = Объект.Организация;
//Устанавливаем в записи регистра сведений ссылку, полученную для еще не записанного объекта
МЗ.Документ = СсылкаДокумента;
МЗ.Статус = Перечисления.СтатусыДокументовПоступления.ОригиналПолучен;
МЗ.Записать();
КонецЕсли;
ВАЖНО!!! Если в обмене участвуют другие объекты, имеющие ссылки на наш документ приобретения товаров (например, счета-фактуры), то в них вы скорее всего получите <Объект не найден>, т.к. мы заменили ссылку на документ. Для того чтобы этого избежать, нужно в правилах конвертации документа на вкладке Настройки установить флаг Не запоминать выгруженные объекты. При использовании этого флага система не будет сохранять документы в специальной таблице кеширования, а каждый раз будет подбирать ссылку этого объекта заново, уже с учетом внесенных нами изменений.
Jackshi 59 / 59 / 6 Регистрация: 16.01.2013 Сообщений: 162 |
||||
1 |
||||
Несоответствие типов14.05.2014, 12:23. Показов 16069. Ответов 5 Метки нет (Все метки)
Доброго времени суток. Помогите решить задачу в Бух 3.0
Докум = Ссылка(<Объект не найден> (170:8cde001e6759045111e3b5045af92b08)) {Форма.Форма.Форма(405)}: Ошибка при вызове метода контекста (УстановитьСсылкуНового) Вроде первый раз не ругается, а вот второй раз….. Почему?
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
14.05.2014, 12:23 |
Ответы с готовыми решениями: Несоответствие типов Несоответствие типов Несоответствие типов Несоответствие типов begin 5 |
SPR1TE89 21 / 21 / 3 Регистрация: 22.04.2014 Сообщений: 112 |
||||
14.05.2014, 12:36 |
2 |
|||
Jackshi, А если так попробовать?
И еще возможно битая ссылка. Поэтому и ругается.
1 |
59 / 59 / 6 Регистрация: 16.01.2013 Сообщений: 162 |
|
14.05.2014, 12:42 [ТС] |
3 |
Работает, Спасибо! А есть возможность избавиться от битой ссылки?
0 |
21 / 21 / 3 Регистрация: 22.04.2014 Сообщений: 112 |
|
14.05.2014, 14:06 |
4 |
Jackshi, Вообще есть, но лучше пока не заморачивайтесь).
0 |
multirum 0 / 0 / 0 Регистрация: 14.09.2020 Сообщений: 6 |
||||
30.11.2020, 14:07 |
5 |
|||
{Обработка.ИзменениеЦеныПоКодуЭлемента.Форма.Форма.Форма(4)}: Ошибка при вызове метода контекста (Выбрать)
0 |
polax 1884 / 1289 / 460 Регистрация: 16.01.2015 Сообщений: 5,633 |
||||
30.11.2020, 18:44 |
6 |
|||
multirum, Есть такая штука СП — синтакс помощник называется. Обращайтесь к нему чаще. СправочникМенеджер.<Имя справочника> (CatalogManager.<Catalog name>)
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
30.11.2020, 18:44 |
Помогаю со студенческими работами здесь Несоответствие типов Несоответствие типов if then else несоответствие типов interface uses Несоответствие типов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 6 |
Что я не так делаю то? Выходит ошибка: {ВнешняяОбработка.КОМ_ПереносДокументов}: Ошибка при вызове метода контекста (УстановитьСсылкуНового): Несоответствие типов (параметр номер ‘1’) ТекУникальныйИдентификатор = «008c9fc7-dd58-11dd-8bdf-005056000045»;
СП сперли? Синтаксис: УстановитьСсылкуНового(<Ссылка>) Параметры: <Ссылка> (обязательный) Тип: ДокументСсылка. Ссылка, которая будет назначена при записи нового объекта. Ссылка, а не уникальный идентификатор. См. ПолучитьСсылкуНового
ТекОбъектДокумент.УстановитьСсылкуНового(Документы.ПоступлениеТоваровУслуг.ПолучитьСсылку(Новый УникальныйИдентификатор(ТекУникальныйИдентификатор)));
Тэги:
Комментарии доступны только авторизированным пользователям
Содержание
- УстановитьСсылкуНового не работает
- УстановитьСсылкуНового() не работает
- УстановитьСсылкуНового или Как восстановить ссылку на объект
- УстановитьСсылкуНового() или «как узнать ссылку на объект до записи»
- Как узнать ссылку на объект до его записи
- Особенности получения ссылок на новые объекты при обмене данными
- УстановитьСсылкуНового() или «как узнать ссылку на объект до записи» : 2 комментария
- как установить ссылку нового?
УстановитьСсылкуНового не работает
Текст = ПодключеннаяИБ.string(ПодклДокумент.ref.УникальныйИдентификатор());
КлючУникальности = новый УникальныйИдентификатор(Текст);
ТекСсылка = ТипДокумента.ПолучитьСсылку(КлючУникальности));
НовыйДок = ТипДокумента.СоздатьДокумент();
НовыйДок.УстановитьСсылкуНового(ТекСсылка);
;сообщить(«НовыйДок.получитьссылкунового() = » + НовыйДок.получитьссылкунового());
;сообщить(«ПодклДокумент.УникальныйИдентификатор()) = » + ПодключеннаяИБ.string(ПодклДокумент.ref.УникальныйИдентификатор()));
НовыйДок.Записать();
;сообщить(«записан документ с уникальнымидентификатором = » + НовыйДок.ссылка.уникальныйидентификатор());
;Сообщить(«» + ТипДокумента.ПолучитьСсылку(КлючУникальности).ПолучитьОбъект());
НовыйДок.получитьссылкунового() = (37:a35548f3962946314732d5138994c3f5)
ПодклДокумент.УникальныйИдентификатор()) = 8994c3f5-d513-4732-a355-48f396294631
записан документ с уникальнымидентификатором = 7123649e-0de9-4330-a21b-6555a6499a26
неопределено
То есть ссылка после записи не равна той, которую я устанавливаю до записи.
Что я делаю не так?
Может конечно я не совсем точно выразился.
Суть:
Создаю документ, на основании взятого из другой базы уникального Идентификатора. Записываю документ, НО после записи он имеет другой уникальный идентификатор.
соответственно конструкция
ТипДокумента.ПолучитьСсылку(КлючУникальности).ПолучитьОбъект()
возращает «неопределено» вместо только что созданного документа.
Источник
УстановитьСсылкуНового() не работает
ДокументГуид = Новый УникальныйИдентификатор(ДокументГуидСтрока);
ДокументПоГуиду = Документы[Тип].ПолучитьСсылку(ДокументГуид);
ТекущийДокумент = Документы[Тип].СоздатьДокумент();
ТекущийДокумент.УстановитьСсылкуНового(ДокументПоГуиду);
после чего ТекущийДокумент.Ссылка.УникальныйИдентификатор() остается все таким же нулевым
ПолучитьСсылкуНового()
Возвращаемое значение:
Тип: ДокументСсылка. .
Описание:
Позволяет для нового (созданного и еще не записанного) объекта получить ранее установленное методом
УстановитьСсылкуНового значение ссылки.
Что тут не понятного?
Хотя может погорячился, я обмены через кд делаю и там с этим сталкиваюсь. Буквально в прошлом месяце пришлось попотеть придумывая как из 7-ки загружать в 8-ке и подсунуть ему свой гуид без правки обработки загрузки
Сейчас проверил на типовой бп на документах и справочниках. 1С только на справочнике сотруднике подменил гуид на свой, в остальных случаях гуид не менял
Справочники
3a1b8a23-c1c1-11e8-8464-00268332bca9
Контрагенты
3a1b8a27-c1c1-11e8-8464-00268332bca9
СтруктураПредприятия
Документы
ВводОстатков
3a1b8a30-c1c1-11e8-8464-00268332bca9
ВнутреннееПотреблениеТоваров
3a1b8a31-c1c1-11e8-8464-00268332bca9
p.S. Часть документов и справочников пропущены так как при записи ругались на незаполненые реквизиты
(65) Запустил поиск по БП3.0.64 текста «»СсылкаНового»», нашлось 3 строки. 2 связаны с (58). Ещё одна связана с справочником пользователи, как понял пользователь «по умолчанию» создается с фикс. ид:
Источник
УстановитьСсылкуНового или Как восстановить ссылку на объект
Каким-то образом был удален объект из базы. Цель Восстановить по » (124:820694de80c8cdb911e4ed4b0f3b6683)»
Собственно Сабж. Вероятно я некорректно передаю ГУИД объекту. Причина в том что Документ создаю. Но как была ссылка в других доках на него » (124:820694de80c8cdb911e4ed4b0f3b6683)», так и осталась. Подскажите братцы в чем моя проблема в данном случае?
ИначеЕсли ТипОбъекта = «Документ» Тогда
ОбъектСсылка = Документы[ИмяОбъекта].СоздатьДокумент();
ОбъектСсылка.УстановитьСсылкуНового(Документы[ИмяОбъекта].ПолучитьСсылку(УникальныйИд));
КонецЕсли;
попытка
ОбъектСсылка.ОбменДанными.Загрузка=Истина;
КонецПопытки;
Форма = ОбъектСсылка.ПолучитьФорму(«Документ.ОтчетОРозничныхПродажах.ФормаОбъекта»);
Форма.Открыть();
Нет, всё далеко не так, понимаю что делаю по аналогии с обычными формами. Но все же: 1) Создаю документ, 2) Присваиваю ему ГУДИ при помощи «УстановитьСсылкуНового()», 3) Открываю форму для редактирования и записи. Так вот я так понимаю что на УФ, ГУИД присваивается в момент записи? Как логически это обойти?
Пытался ПолучитьОбъект(), а затем записать(), Но Увы получать пока нечего же. Вот как бы вы эту ситуацию обошли?)
(4) В любом случае необходимо обработать обязательные реквизиты и корректно заполнить документ. Меня интересовал другой вопрос. И я разобрался. Дело в том что Если я записываю до Назначения ОбменДанными.Загрузка = Истина То программа игнорирует все что я стараюсь сделать и назначает свой ГУИД. Помогла запись объекта и установка даты после ОбменДанными.Загрузка = Истина.
Как имея тип объекта корректно передать сюда форму??
Ну хотя идея наверное ясна.. просто передам попробую передать вот так насколько жизненна будет идея?)
(11) Gонимаю, естественно. Я из этой записи при помощи нехитрого кода получаю ГУИД. Суть то ведь ясна. Код ниже прилагаю если кому пригодится.
(15) Вот как присваиваю ГУИД вновь созданному объекту
Источник
УстановитьСсылкуНового() или «как узнать ссылку на объект до записи»
Многие знают, что любому объекту ссылочного типа в 1С ссылка присваивается при записи в базу данных. То есть, если объект новый, то реквизит Ссылка у него пустой. Кстати, это один из способов узнать, работает пользователь с новым, только что созданным объектом, или же открыл уже существующий.
При записи объекта устанавливается случайная ссылка, так что предугадать ее у вас вряд ли получится. Тем не менее, существуют ситуации, когда полезно и даже необходимо знать ссылку на объект еще до записи этого объекта в базу. Приведем несколько примеров:
- При обмене данными необходимо программно создать некоторые записи в регистрах, включающие ссылку на объект обмена. При этом в базе-источнике таких регистров нет. Пример такой задачи мы подробно рассмотрим ниже.
- При оптимизации работы программного кода. Например, нужно программно создать контрагента, его договор и установить этот договор как Основной. Если идти классическим путем, то нужно сначала создать и записать элемент справочника Контрагенты, пройдя при этом все процедуры записи (а это может занять значительное время). Далее, нужно создать элемент справочника ДоговорыКонтрагентов, установив в качестве Владельца ссылку на контрагента. И наконец, получив заново объект элемента справочника Контрагенты, заполнить там реквизит ОсновнойДоговор и записать его, пройдя заново все процедуры записи.
Эту процедуру можно ускорить, зная заранее ссылку на еще не созданный ДоговорКонтрагента. В этом случае уже не требуется два раза получать и записывать Контрагента.
Как узнать ссылку на объект до его записи
- Сгенерировать уникальный идентификатор объекта.
- Зарезервировать ссылку по уникальному идентификатору
- Установить зарезервированную ссылку для нового объекта.
//Создаем уникальный идентификатор
УИД = новый УникальныйИдентификатор ;
//Создаем ссылку по этому идентификатору. Для этого нужно знать тип объекта
НоваяСсылка = Справочники . Контрагенты . ПолучитьСсылку ( УИД ) ;
//Устанавливаем ссылку для нового объекта
СправочникОбъект . УстановитьСсылкуНового ( НоваяСсылка ) ;
После этого объект можно записать. Будет установлена заранее известная ссылка.
Особенности получения ссылок на новые объекты при обмене данными
Рассмотрим, как получить ссылку на незаписанный объект на примере следующей задачи:
При обмене данными между двумя базами передается документ приобретения товаров. В базе источнике есть реквизит с типом Булево, показывающий получение оригиналов документов от поставщика. В базе-приемнике отметка о получении оригиналов реализована через регистр сведений с измерением — ссылкой на документ и ресурсом — ссылкой на перечисление.
Для решения этой задачи будет использоваться обработчик ПослеЗагрузки в правилах конвертации документа приобретения. Реквизит ОригиналыПолучены будет передаваться в виде параметра.
Код будет выглядеть так:
ОригиналыПолучены = ПараметрыОбъекта [ «ОригиналыПолучены» ] ;
Если ОригиналыПолучены Тогда
//Если записывается новый объект, создадим его ссылку
//В противном случае используем найденную
Если НЕ ОбъектНайден Тогда
СсылкаДокумента = Документы . ПоступлениеТоваровУслуг . ПолучитьСсылку ( новый УникальныйИдентификатор ) ;
Объект . УстановитьСсылкуНового ( СсылкаДокумента ) ;
Иначе
СсылкаДокумента = Ссылка ;
КонецЕсли ;
МЗ = РегистрыСведений . СтатусыДокументов . СоздатьМенеджерЗаписи ( ) ;
МЗ . Организация = Объект . Организация ;
//Устанавливаем в записи регистра сведений ссылку, полученную для еще не записанного объекта
МЗ . Документ = СсылкаДокумента ;
МЗ . Статус = Перечисления . СтатусыДокументовПоступления . ОригиналПолучен ;
МЗ . Записать ( ) ;
КонецЕсли ;
ВАЖНО. Если в обмене участвуют другие объекты, имеющие ссылки на наш документ приобретения товаров (например, счета-фактуры), то в них вы скорее всего получите , т.к. мы заменили ссылку на документ. Для того чтобы этого избежать, нужно в правилах конвертации документа на вкладке Настройки установить флаг Не запоминать выгруженные объекты. При использовании этого флага система не будет сохранять документы в специальной таблице кеширования, а каждый раз будет подбирать ссылку этого объекта заново, уже с учетом внесенных нами изменений.
УстановитьСсылкуНового() или «как узнать ссылку на объект до записи» : 2 комментария
а как быть если нужно создать с тем же УИД, как и в исходной базе, как этот самый УИД получить?
УИД объекта можно получить с помощью функции УникальныйИдентификатор()
Чтобы задать объекту конкретный УИД нужно сделать так:
Новый_UID = Новый УникальныйИдентификатор(«1014270d-d794-11df-825c-001517542b78»);
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый _UID);
НашаНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НашаНоменклатура.УстановитьСсылкуНового(НоваяСсылка);
Если нужно заменить УИД уже существующего объекта, то все равно создают новый объект — копию существующего, а потом выполняют поиск и замену ссылок по всей базе. Есть такая обработка даже. Если этого не сделать, получите везде вместо ссылки на объект с новым УИД .
Только при обмене не обязательно делать одинаковые УИД в базах. Сопоставление объектов происходит через регистр сведений Соответствия объектов информационных баз.
Источник
как установить ссылку нового?
Код в управляемой форме:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Ключ.Пустая() Тогда
УИД = Новый УникальныйИдентификатор;
СсылкаНового = Документы.ФормированиеЗадач.ПолучитьСсылку(УИД);
ДокументФормированиеЗадач = ДанныеФормыВЗначение(Объект, Тип(«ДокументОбъект.ФормированиеЗадач»));
ДокументФормированиеЗадач.УстановитьСсылкуНового(СсылкаНового);
ЗначениеВДанныеФормы(ДокументФормированиеЗадач, Объект);
Не срабатывает, при записи формирует другую ссылку.
Синтаксис:
ПолучитьСсылкуНового()
Возвращаемое значение:
Тип: ДокументСсылка.
Описание:
Позволяет для нового (созданного и еще не записанного) объекта получить ранее установленное методом УстановитьСсылкуНового значение ссылки.
Доступность:
Сервер, толстый клиент, внешнее соединение.
См. также:
ДокументМенеджер, метод ПолучитьСсылку
(5) Не совсем понятно, какие могут быть исключения при загрузке из произвольного XML-файла. А загрузка с идентификаторами даже из 8.1 работает на ура.
Но, в свете (5), на правах тыканья пальцем в небо, для (0): проверь неинтерактивное создание с твоей ссылкой. Если всё норм, то стоит посмотреть на саму форму — может, Параметры.Ключ сразу задать, например?
Ключ формы — это идентификатор основного реквизита формы. По логике — это должен быть УИД основного реквизита, в данном случае, элемента справочника.
Параметры формы доступны на чтение/запись, это структура. Не в курсе, касается ли это Параметры.Ключ, но не вижу причин, почему нет.
TitanLuchs, наверное, глубже копал, хочется его мнение услышать.
например вот УИДЫ, которые по коду в (0) генерятся, т.е. в форме:
f7a0fa12-3774-46d0-b230-5aa25e42468a
abefebd7-79f3-4dd0-9b36-d5df851d9fd2
b97d7f22-fc09-4148-845c-987499bb7e7b
207f5797-8d1e-4a1e-b5f7-c9409793fbdc
а вот примеры уже после записи объектов:
ee3c0e75-e584-11de-af44-001e379f1bef
ee3c0e76-e584-11de-af44-001e379f1bef
ee3c0e77-e584-11de-af44-001e379f1bef
Источник