Ошибка при вызове метода контекста установитьссылкунового

через СОМ, передать ГУИД для нового документа

Я
   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) всем спасибо, буду делать в два этапа) двумя разными обработками)).

через СОМ, передать ГУИД для нового документа

Я

  

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) всем спасибо, буду делать в два этапа) двумя разными обработками)).

Содержание

  1. УстановитьСсылкуНового не работает
  2. УстановитьСсылкуНового() не работает
  3. УстановитьСсылкуНового или Как восстановить ссылку на объект
  4. УстановитьСсылкуНового() или «как узнать ссылку на объект до записи»
  5. Как узнать ссылку на объект до его записи
  6. Особенности получения ссылок на новые объекты при обмене данными
  7. УстановитьСсылкуНового() или «как узнать ссылку на объект до записи» : 2 комментария
  8. как установить ссылку нового?

УстановитьСсылкуНового не работает

Текст = ПодключеннаяИБ.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С ссылка присваивается при записи в базу данных. То есть, если объект новый, то реквизит Ссылка у него пустой. Кстати, это один из способов узнать, работает пользователь с новым, только что созданным объектом, или же открыл уже существующий.

При записи объекта устанавливается случайная ссылка, так что предугадать ее у вас вряд ли получится. Тем не менее, существуют ситуации, когда полезно и даже необходимо знать ссылку на объект еще до записи этого объекта в базу. Приведем несколько примеров:

  1. При обмене данными необходимо программно создать некоторые записи в регистрах, включающие ссылку на объект обмена. При этом в базе-источнике таких регистров нет. Пример такой задачи мы подробно рассмотрим ниже.
  2. При оптимизации работы программного кода. Например, нужно программно создать контрагента, его договор и установить этот договор как Основной. Если идти классическим путем, то нужно сначала создать и записать элемент справочника Контрагенты, пройдя при этом все процедуры записи (а это может занять значительное время). Далее, нужно создать элемент справочника ДоговорыКонтрагентов, установив в качестве Владельца ссылку на контрагента. И наконец, получив заново объект элемента справочника Контрагенты, заполнить там реквизит ОсновнойДоговор и записать его, пройдя заново все процедуры записи.
    Эту процедуру можно ускорить, зная заранее ссылку на еще не созданный ДоговорКонтрагента. В этом случае уже не требуется два раза получать и записывать Контрагента.

Как узнать ссылку на объект до его записи

  1. Сгенерировать уникальный идентификатор объекта.
  2. Зарезервировать ссылку по уникальному идентификатору
  3. Установить зарезервированную ссылку для нового объекта.

//Создаем уникальный идентификатор
УИД = новый УникальныйИдентификатор ;

//Создаем ссылку по этому идентификатору. Для этого нужно знать тип объекта
НоваяСсылка = Справочники . Контрагенты . ПолучитьСсылку ( УИД ) ;

//Устанавливаем ссылку для нового объекта
СправочникОбъект . УстановитьСсылкуНового ( НоваяСсылка ) ;

После этого объект можно записать. Будет установлена заранее известная ссылка.

Особенности получения ссылок на новые объекты при обмене данными

Рассмотрим, как получить ссылку на незаписанный объект на примере следующей задачи:

При обмене данными между двумя базами передается документ приобретения товаров. В базе источнике есть реквизит с типом Булево, показывающий получение оригиналов документов от поставщика. В базе-приемнике отметка о получении оригиналов реализована через регистр сведений с измерением — ссылкой на документ и ресурсом — ссылкой на перечисление.

Для решения этой задачи будет использоваться обработчик ПослеЗагрузки в правилах конвертации документа приобретения. Реквизит ОригиналыПолучены будет передаваться в виде параметра.

Код будет выглядеть так:

ОригиналыПолучены = ПараметрыОбъекта [ «ОригиналыПолучены» ] ;

Если ОригиналыПолучены Тогда

//Если записывается новый объект, создадим его ссылку
//В противном случае используем найденную
Если НЕ ОбъектНайден Тогда
СсылкаДокумента = Документы . ПоступлениеТоваровУслуг . ПолучитьСсылку ( новый УникальныйИдентификатор ) ;
Объект . УстановитьСсылкуНового ( СсылкаДокумента ) ;
Иначе
СсылкаДокумента = Ссылка ;
КонецЕсли ;

МЗ = РегистрыСведений . СтатусыДокументов . СоздатьМенеджерЗаписи ( ) ;
МЗ . Организация = Объект . Организация ;

//Устанавливаем в записи регистра сведений ссылку, полученную для еще не записанного объекта
МЗ . Документ = СсылкаДокумента ;

МЗ . Статус = Перечисления . СтатусыДокументовПоступления . ОригиналПолучен ;
МЗ . Записать ( ) ;
КонецЕсли ;

ВАЖНО. Если в обмене участвуют другие объекты, имеющие ссылки на наш документ приобретения товаров (например, счета-фактуры), то в них вы скорее всего получите , т.к. мы заменили ссылку на документ. Для того чтобы этого избежать, нужно в правилах конвертации документа на вкладке Настройки установить флаг Не запоминать выгруженные объекты. При использовании этого флага система не будет сохранять документы в специальной таблице кеширования, а каждый раз будет подбирать ссылку этого объекта заново, уже с учетом внесенных нами изменений.

УстановитьСсылкуНового() или «как узнать ссылку на объект до записи» : 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С ссылка присваивается при записи в базу данных. То есть, если объект новый, то реквизит Ссылка у него пустой. Кстати, это один из способов узнать, работает пользователь с новым, только что созданным объектом, или же открыл уже существующий.

Если Ссылка = Справочники.Контрагенты.ПустаяСсылка() Тогда
//Это новый контрагент
Иначе
//Это ранее записанный контрагент
КонецЕсли;

При записи объекта устанавливается случайная ссылка, так что предугадать ее у вас вряд ли получится. Тем не менее, существуют ситуации, когда полезно и даже необходимо знать ссылку на объект еще до записи этого объекта в базу. Приведем несколько примеров:

  1. При обмене данными необходимо программно создать некоторые записи в регистрах, включающие ссылку на объект обмена. При этом в базе-источнике таких регистров нет. Пример такой задачи мы подробно рассмотрим ниже.
  2. При оптимизации работы программного кода. Например, нужно программно создать контрагента, его договор и установить этот договор как Основной. Если идти классическим путем, то нужно сначала создать и записать элемент справочника Контрагенты, пройдя при этом все процедуры записи (а это может занять значительное время). Далее, нужно создать элемент справочника ДоговорыКонтрагентов, установив в качестве Владельца ссылку на контрагента. И наконец, получив заново объект элемента справочника Контрагенты, заполнить там реквизит ОсновнойДоговор и записать его, пройдя заново все процедуры записи.
    Эту процедуру можно ускорить, зная заранее ссылку на еще не созданный ДоговорКонтрагента. В этом случае уже не требуется два раза получать и записывать Контрагента.

Как узнать ссылку на объект до его записи

Последовательность действий:

  1. Сгенерировать уникальный идентификатор объекта.
  2. Зарезервировать ссылку по уникальному идентификатору
  3. Установить зарезервированную ссылку для нового объекта.

//Создаем уникальный идентификатор
УИД = новый УникальныйИдентификатор;

//Создаем ссылку по этому идентификатору. Для этого нужно знать тип объекта
НоваяСсылка = Справочники.Контрагенты.ПолучитьСсылку(УИД);

//Устанавливаем ссылку для нового объекта
СправочникОбъект.УстановитьСсылкуНового(НоваяСсылка);

После этого объект можно записать. Будет установлена заранее известная ссылка.

Особенности получения ссылок на новые объекты при обмене данными

Рассмотрим, как получить ссылку на незаписанный объект на примере следующей задачи:

При обмене данными между двумя базами передается документ приобретения товаров. В базе источнике есть реквизит с типом Булево, показывающий получение оригиналов документов от поставщика. В базе-приемнике отметка о получении оригиналов реализована через регистр сведений с измерением — ссылкой на документ и ресурсом — ссылкой на перечисление.

Для решения этой задачи будет использоваться обработчик ПослеЗагрузки в правилах конвертации документа приобретения. Реквизит ОригиналыПолучены будет передаваться в виде параметра.

Код будет выглядеть так:

ОригиналыПолучены = ПараметрыОбъекта[«ОригиналыПолучены»];

Если ОригиналыПолучены Тогда

//Если записывается новый объект, создадим его ссылку
//В противном случае используем найденную
Если НЕ ОбъектНайден Тогда
СсылкаДокумента = Документы.ПоступлениеТоваровУслуг.ПолучитьСсылку(новый УникальныйИдентификатор);
Объект.УстановитьСсылкуНового(СсылкаДокумента);
Иначе
СсылкаДокумента = Ссылка;
КонецЕсли;

МЗ=РегистрыСведений.СтатусыДокументов.СоздатьМенеджерЗаписи();
МЗ.Организация = Объект.Организация;

//Устанавливаем в записи регистра сведений ссылку, полученную для еще не записанного объекта
МЗ.Документ = СсылкаДокумента;

МЗ.Статус = Перечисления.СтатусыДокументовПоступления.ОригиналПолучен;
МЗ.Записать();
КонецЕсли;

ВАЖНО!!! Если в обмене участвуют другие объекты, имеющие ссылки на наш документ приобретения товаров (например, счета-фактуры), то в них вы скорее всего получите <Объект не найден>, т.к. мы заменили ссылку на документ. Для того чтобы этого избежать, нужно в правилах конвертации документа на вкладке Настройки установить флаг Не запоминать выгруженные объекты. При использовании этого флага система не будет сохранять документы в специальной таблице кеширования, а каждый раз будет подбирать ссылку этого объекта заново, уже с учетом внесенных нами изменений.Не запоминать выгруженные объекты при установке ссылки нового

Jackshi

59 / 59 / 6

Регистрация: 16.01.2013

Сообщений: 162

1

Несоответствие типов

14.05.2014, 12:23. Показов 16069. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Доброго времени суток. Помогите решить задачу в Бух 3.0

1C
1
2
3
4
5
6
7
8
9
10
11
12
Докум = Документы.ПоступлениеТоваровУслуг.ПолучитьСсылку(новый УникальныйИдентификатор(мОбъект.id));
Если не ЗначениеЗаполнено(Докум) Тогда
    Док = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
    Док.УстановитьСсылкуНового(новый УникальныйИдентификатор(мОбъект.id));
Иначе 
    Если Докум.ПолучитьОбъект() = Неопределено Тогда
        Док = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
        Док.УстановитьСсылкуНового(новый УникальныйИдентификатор(мОбъект.id));// в этом месте Ошибка
    Иначе
        Док = Докум.ПолучитьОбъект();
    КонецЕсли;
КонецЕсли;

Докум = Ссылка(<Объект не найден> (170:8cde001e6759045111e3b5045af92b08))

{Форма.Форма.Форма(405)}: Ошибка при вызове метода контекста (УстановитьСсылкуНового)
Док.УстановитьСсылкуНового(новый УникальныйИдентификатор(мОбъект.id));
по причине:
Несоответствие типов (параметр номер ‘1’)

Вроде первый раз не ругается, а вот второй раз….. Почему?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

14.05.2014, 12:23

Ответы с готовыми решениями:

Несоответствие типов
Подскажите пожалуйста мне надо написать программу автоматического формирования кода справочника по…

Несоответствие типов
Помогите исправить пожайлуста.
uses crt,graph;
var
a:array of integer;

Несоответствие типов
Всем привет, выдает ошибку о несоответствие типов хотя в БД стоит тип текстовый
cmd.CommandText =…

Несоответствие типов
var s1,s2,s3:string;
ss1,ss2,ss3 :set of byte;
y:integer;
H:char;

begin
readln(s1);

5

SPR1TE89

21 / 21 / 3

Регистрация: 22.04.2014

Сообщений: 112

14.05.2014, 12:36

2

Jackshi, А если так попробовать?

1C
1
2
НоваяСсылка = Документы.ПоступлениеТоваровУслуг.ПолучитьСсылку(новый УникальныйИдентификатор(мОбъект.id))
Док.УстановитьСсылкуНового(новаяСсылка);

И еще возможно битая ссылка. Поэтому и ругается.



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

1C
1
2
3
4
5
6
7
Процедура ИзменитьНаСервере()
    КодЭлемента = Справочники.Номенклатура.Выбрать(000000003);
    ИзменениеЦены = КодЭлемента.ПолучитьОбъект();
    ИзменениеЦены.ЦенаПродажи = 30000;
    ИзменениеЦены.Записать();
    Сообщить("Готово");
КонецПроцедуры

{Обработка.ИзменениеЦеныПоКодуЭлемента.Форма.Форма.Форма(4)}: Ошибка при вызове метода контекста (Выбрать)
КодЭлемента = Справочники.Номенклатура.Выбрать(000000003);
по причине:
Несоответствие типов (параметр номер ‘1’)
как исправить ?



0



polax

1884 / 1289 / 460

Регистрация: 16.01.2015

Сообщений: 5,633

30.11.2020, 18:44

6

multirum, Есть такая штука СП — синтакс помощник называется. Обращайтесь к нему чаще.

СправочникМенеджер.<Имя справочника> (CatalogManager.<Catalog name>)
Выбрать (Select)
Синтаксис:
Выбрать(<Родитель>, <Владелец>, <Отбор>, <Порядок>)
Параметры:
<Родитель> (необязательный)
Тип: СправочникСсылка.<Имя справочника>.
Отбор по родителю. Имеет смысл только для многоуровневых справочников. Если параметр не задан, то отбор по родителю не производится. Чтобы отобрать элементы верхнего уровня, нужно в качестве данного параметра указать пустую ссылку на элемент справочника.
<Владелец> (необязательный)
Тип: СправочникСсылка.<Имя справочника>.
Отбор по владельцу. Имеет смысл только для подчиненных справочников. Если параметр не задан, то отбор по владельцу не производится.
<Отбор> (необязательный)
Тип: Структура.
Задает поле и значение отбора открываемой выборки. Ключ структуры описывает имя поля, а значение структуры — значение отбора по этому полю. В качестве полей для отбора могут задаваться только поля «Код», «Наименование» и реквизиты справочника, для которых в конфигураторе признак индексирования установлен в значение «Индексировать» или в значение «Индексировать с доп. упорядоч.».
Важно! Структура может содержать только один элемент.
Если параметр не указан, то отбор не используется.
<Порядок> (необязательный)
Тип: Строка.
Строка с именем реквизита справочника, определяющая упорядочивание элементов в выборке. Может быть указано «Код», «Наименование» или имя одного из реквизитов примитивного типа (Число, Строка, Дата, Булево), для которого установлен признак «Индексирование» в значение «Индексировать» или в «Индексировать с дополнительным упорядочиванием» в конфигураторе. После имени реквизита через пробел может быть указано направление сортировки. Направление определяется: «Убыв» («Desc») — упорядочивать по убыванию; «Возр» («Asc») — упорядочивать по возрастанию. По умолчанию сортировка производится по возрастанию. Если параметр не указан, то порядок определяется основным представлением справочника.
Значение по умолчанию: Пустая строка.
Возвращаемое значение:
Тип: СправочникВыборка.<Имя справочника>.
Описание:
Формирует выборку элементов справочника по заданным условиям.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Пример:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Номенклатура = Справочники.Номенклатура;
Отбор = Новый Структура("ТипНоменклатуры");
Пусто = Перечисления.ТипыНоменклатуры.ПустаяСсылка();
Отбор.ТипНоменклатуры = Пусто;
Выборка = Номенклатура.Выбрать(,,Отбор, "Наименование Убыв");
Пока Выборка.Следующий()  Цикл
    Объект = Выборка.ПолучитьОбъект();
    Объект.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар;
    Попытка
        Объект.Записать();
    Исключение
        Предупреждение(НСтр("ru = 'Невозможно записать объект';"
           + " en = 'Can't write object'")
           +" '" + Объект + '"
           |" + ОписаниеОшибки(),60);
    КонецПопытки;
КонецЦикла;



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

30.11.2020, 18:44

Помогаю со студенческими работами здесь

Несоответствие типов
Добрый день, ни как не могу победить несоответствие типов.
То есть, есть некая форма с полем…

Несоответствие типов
— в этом файле две базы данных, которые должны синхронизироваться. Главная база с названием &quot;а&quot;,…

if then else несоответствие типов
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,…

Несоответствие типов
Делаю прогу, в которой программа ищет — существует ли ряд файлов. Например 153 файла текстi.txt,…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

6

Что я не так делаю то? Выходит ошибка: {ВнешняяОбработка.КОМ_ПереносДокументов}: Ошибка при вызове метода контекста (УстановитьСсылкуНового): Несоответствие типов (параметр номер ‘1’) ТекУникальныйИдентификатор = «008c9fc7-dd58-11dd-8bdf-005056000045»;

СП сперли? Синтаксис: УстановитьСсылкуНового(<Ссылка>) Параметры: <Ссылка> (обязательный) Тип: ДокументСсылка. Ссылка, которая будет назначена при записи нового объекта. Ссылка, а не уникальный идентификатор. См. ПолучитьСсылкуНового

ТекОбъектДокумент.УстановитьСсылкуНового(Документы.ПоступлениеТоваровУслуг.ПолучитьСсылку(Новый УникальныйИдентификатор(ТекУникальныйИдентификатор)));

Тэги:

Комментарии доступны только авторизированным пользователям

Содержание

  1. УстановитьСсылкуНового не работает
  2. УстановитьСсылкуНового() не работает
  3. УстановитьСсылкуНового или Как восстановить ссылку на объект
  4. УстановитьСсылкуНового() или «как узнать ссылку на объект до записи»
  5. Как узнать ссылку на объект до его записи
  6. Особенности получения ссылок на новые объекты при обмене данными
  7. УстановитьСсылкуНового() или «как узнать ссылку на объект до записи» : 2 комментария
  8. как установить ссылку нового?

УстановитьСсылкуНового не работает

Текст = ПодключеннаяИБ.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С ссылка присваивается при записи в базу данных. То есть, если объект новый, то реквизит Ссылка у него пустой. Кстати, это один из способов узнать, работает пользователь с новым, только что созданным объектом, или же открыл уже существующий.

При записи объекта устанавливается случайная ссылка, так что предугадать ее у вас вряд ли получится. Тем не менее, существуют ситуации, когда полезно и даже необходимо знать ссылку на объект еще до записи этого объекта в базу. Приведем несколько примеров:

  1. При обмене данными необходимо программно создать некоторые записи в регистрах, включающие ссылку на объект обмена. При этом в базе-источнике таких регистров нет. Пример такой задачи мы подробно рассмотрим ниже.
  2. При оптимизации работы программного кода. Например, нужно программно создать контрагента, его договор и установить этот договор как Основной. Если идти классическим путем, то нужно сначала создать и записать элемент справочника Контрагенты, пройдя при этом все процедуры записи (а это может занять значительное время). Далее, нужно создать элемент справочника ДоговорыКонтрагентов, установив в качестве Владельца ссылку на контрагента. И наконец, получив заново объект элемента справочника Контрагенты, заполнить там реквизит ОсновнойДоговор и записать его, пройдя заново все процедуры записи.
    Эту процедуру можно ускорить, зная заранее ссылку на еще не созданный ДоговорКонтрагента. В этом случае уже не требуется два раза получать и записывать Контрагента.

Как узнать ссылку на объект до его записи

  1. Сгенерировать уникальный идентификатор объекта.
  2. Зарезервировать ссылку по уникальному идентификатору
  3. Установить зарезервированную ссылку для нового объекта.

//Создаем уникальный идентификатор
УИД = новый УникальныйИдентификатор ;

//Создаем ссылку по этому идентификатору. Для этого нужно знать тип объекта
НоваяСсылка = Справочники . Контрагенты . ПолучитьСсылку ( УИД ) ;

//Устанавливаем ссылку для нового объекта
СправочникОбъект . УстановитьСсылкуНового ( НоваяСсылка ) ;

После этого объект можно записать. Будет установлена заранее известная ссылка.

Особенности получения ссылок на новые объекты при обмене данными

Рассмотрим, как получить ссылку на незаписанный объект на примере следующей задачи:

При обмене данными между двумя базами передается документ приобретения товаров. В базе источнике есть реквизит с типом Булево, показывающий получение оригиналов документов от поставщика. В базе-приемнике отметка о получении оригиналов реализована через регистр сведений с измерением — ссылкой на документ и ресурсом — ссылкой на перечисление.

Для решения этой задачи будет использоваться обработчик ПослеЗагрузки в правилах конвертации документа приобретения. Реквизит ОригиналыПолучены будет передаваться в виде параметра.

Код будет выглядеть так:

ОригиналыПолучены = ПараметрыОбъекта [ «ОригиналыПолучены» ] ;

Если ОригиналыПолучены Тогда

//Если записывается новый объект, создадим его ссылку
//В противном случае используем найденную
Если НЕ ОбъектНайден Тогда
СсылкаДокумента = Документы . ПоступлениеТоваровУслуг . ПолучитьСсылку ( новый УникальныйИдентификатор ) ;
Объект . УстановитьСсылкуНового ( СсылкаДокумента ) ;
Иначе
СсылкаДокумента = Ссылка ;
КонецЕсли ;

МЗ = РегистрыСведений . СтатусыДокументов . СоздатьМенеджерЗаписи ( ) ;
МЗ . Организация = Объект . Организация ;

//Устанавливаем в записи регистра сведений ссылку, полученную для еще не записанного объекта
МЗ . Документ = СсылкаДокумента ;

МЗ . Статус = Перечисления . СтатусыДокументовПоступления . ОригиналПолучен ;
МЗ . Записать ( ) ;
КонецЕсли ;

ВАЖНО. Если в обмене участвуют другие объекты, имеющие ссылки на наш документ приобретения товаров (например, счета-фактуры), то в них вы скорее всего получите , т.к. мы заменили ссылку на документ. Для того чтобы этого избежать, нужно в правилах конвертации документа на вкладке Настройки установить флаг Не запоминать выгруженные объекты. При использовании этого флага система не будет сохранять документы в специальной таблице кеширования, а каждый раз будет подбирать ссылку этого объекта заново, уже с учетом внесенных нами изменений.

УстановитьСсылкуНового() или «как узнать ссылку на объект до записи» : 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

Источник

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода контекста установитьсоединение
  • Ошибка при вызове метода контекста что это означает
  • Ошибка при вызове метода контекста установитьмонопольныйрежим
  • Ошибка при вызове метода контекста что это значит
  • Ошибка при вызове метода контекста установить соединение