Имя: Пароль:
1C
1С v8
Не получается создать элемент справочника с заданным GUID
,
0 Gorr
 
05.09.19
15:47
НовыйОбъект = Справочники.ВнешниеОбработки.СоздатьЭлемент();
НоваяСсылка = Справочники.ВнешниеОбработки.ПолучитьСсылку(Новый УникальныйИдентификатор(НовыйGUIDОбъекта));
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
гуид = XMLСтрока(НовыйОбъект.ПолучитьСсылкуНового());//здесь НовыйGUIDОбъекта = гуид    
НовыйОбъект.Записать();
фактгуид = XMLСтрока(НовыйОбъект.Ссылка);//а вот после записи уже так:фактгуид <> гуид

В этой же базе следующий код вызывает открытие формы создание нового элемента:

        НайденныйОбъект = Справочники.ВнешниеОбработки.ПолучитьСсылку(Новый УникальныйИдентификатор(НовыйGUIDОбъекта));
        Если ЗначениеЗаполнено(НайденныйОбъект) Тогда
            //Предупреждение("Объект найден");
            ОткрытьЗначение(НайденныйОбъект);
        Иначе
            Предупреждение("Объект не найден");
        КонецЕсли;

Почему и что не так? есть идеи?
1 palsergeich
 
05.09.19
15:50
XMLСтрока(НовыйОбъект.ПолучитьСсылкуНового());//здесь НовыйGUIDОбъекта = гуид  
Это лишнее
XMLСтрока(НовыйОбъект.Ссылка)
Сделай так
2 Gorr
 
05.09.19
15:51
(1) у нового элемента ссылки нет.
3 Gorr
 
05.09.19
15:52
(1)2. и вопрос не в этом эта строка для отладки кода
4 palsergeich
 
05.09.19
15:53
Ты сначала устанавливает ссылку из гуид этими строками

    
НовыйОбъект = Справочники.ВнешниеОбработки.СоздатьЭлемент();
НоваяСсылка = Справочники.ВнешниеОбработки.ПолучитьСсылку(Новый УникальныйИдентификатор(НовыйGUIDОбъекта));
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка)
А потом загемняешь его здесь
НовыйОбъект.ПолучитьСсылкуНового()
5 Aleksey
 
05.09.19
15:53
Смотри подписки. В типовой у некоторых справочников происходит подмена гуид при записи. Т.е. типа если это новый, то принудительно присваиваем новый гуид
6 palsergeich
 
05.09.19
15:53
(2) после строки
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка)
Гуид уже есть
7 palsergeich
 
05.09.19
15:55
(6) в том и суть этого метода, что при установке ссылки нового пустая ссылка меняется на то что ты передаешь в метод
8 palsergeich
 
05.09.19
15:55
А вот этим ты свой же код ломаешь
НовыйОбъект.ПолучитьСсылкуНового()
9 palsergeich
 
05.09.19
15:56
Верь мне и просто сделай как я говорю
10 palsergeich
 
05.09.19
15:57
(5) нет, он ставится, если пустой, если заполнен - не устанавливается.
Проблема в этом
НовыйОбъект.ПолучитьСсылкуНового()
11 palsergeich
 
05.09.19
15:59
Просто вбей в табло xmlстрока(новыйобъект.Ссылка) и пошагово пройдись в отладчике и ты увидишь
12 Gorr
 
05.09.19
16:03
(5) это бы все объяснило. спасибо.
(6) вы не правы - попытка получения гуида от не записанного еще объекта всегда возращает пустой гуид ("00000000-0000-0000-0000-000000000000")
13 Gorr
 
05.09.19
16:12
(5) единственная подписка - ПриУстановкеНовогоКодаСправочника:
Процедура ПриУстановкеНовогоКодаСправочникаПриУстановкеНовогоКода(Источник, СтандартнаяОбработка, Префикс) Экспорт
    ДобавитьПрефиксУзла(Префикс);
КонецПроцедуры
Уже в ней ЭтоНовый() возвращает истина, а
XMLСтрока(Источник.ПолучитьСсылкуНового()) уже не та.
14 Gorr
 
05.09.19
16:27
Добавил код установки новой ссылки в обработчик этой самой единственной подписки и ВУАЛЯ - требуемый ГУИД записался в базу!!!
15 Gorr
 
05.09.19
16:30
Видимо, в процессе генерации кода справочника платформа задает не только код, но и так же ГУИД объекта.
16 unenu
 
05.09.19
16:33
(12) и зачем было бредокодить с получением гуида от не записанного объекта, тем паче что переменная говорит  сама за себя НовыйОбъект?

в СП можно было посмотреть методы установки и все
17 Максим Нижегородец
 
05.09.19
16:34
(0) ЕСЛИ ВОПРОС: Почему и что не так? есть идеи?

ОТВЕТ: Все, что написал - ВСЕ НЕ ТАК. (это все как умножать на ноль)

Похоже не понимаешь разницу между ОБЪЕКТом и Ссылкой на объект и между УникальнымИдентификатором и Ссылкой. Все это разные вещи и просто так эти понятия подменять нельзя.
18 Gorr
 
05.09.19
16:41
(16) была предпринята попытка понять почему объект записывается не с тем гуид.
какая она до записи? а устанавливается ли вообще?
в данном случае наблюдаемое противоречило СП.
19 Gorr
 
05.09.19
16:42
(17) если вы не в состоянии понять вопрос))
20 RomanYS
 
05.09.19
16:51
(13) замер делал, другой код точно не выполняется?
21 RomanYS
 
05.09.19
16:52
(0) конфигурация какая?
22 RomanYS
 
05.09.19
16:52
(15) скорее ты пропустил другую подписку
23 Gorr
 
05.09.19
17:07
(22) ЗУП 2.5. Поиск ссылок на объект рулит.
24 RomanYS
 
05.09.19
17:11
(23) ни капли не рулит. Подписка может быть общая для справочников
25 RomanYS
 
05.09.19
17:16
(0) В этой же базе следующий код вызывает открытие формы создание нового элемента:

        НайденныйОбъект = Справочники.ВнешниеОбработки.ПолучитьСсылку(Новый УникальныйИдентификатор(НовыйGUIDОбъекта));
        Если ЗначениеЗаполнено(НайденныйОбъект) Тогда
            //Предупреждение("Объект найден");
            ОткрытьЗначение(НайденныйОбъект);
...

А тут всё очевидно НайденныйОбъект не пустая ссылка, поэтому ЗначениеЗаполнено(НайденныйОбъект) всегда истина. Вы неправильно проверяете наличие ссылки в таблице
26 Gorr
 
05.09.19
17:19
(24) нет, общей нет.
(25) верно.
27 RomanYS
 
05.09.19
17:20
(26) Замер то сделал?
28 Максим Нижегородец
 
05.09.19
17:20
(25) А если так:

НайденныйОбъект = Новый Структура("Один,Два",1,2);
Если ЗначениеЗаполнено(НайденныйОбъект) Тогда
            ОткрытьЗначение(НайденныйОбъект);
КонецЕсли;

Подскажите, что в этом случае должно открыться?
29 Gorr
 
05.09.19
17:23
(15) Ответ на вопрос я нашел. Тема закрыта.
30 Gorr
 
05.09.19
17:23
(27) а зачем?
31 RomanYS
 
05.09.19
17:25
(29) это не ответ.
32 RomanYS
 
05.09.19
17:26
НастройкаПравДоступа.ПередЗаписьюНовогоОбъектаСПравамиДоступаПользователей(ЭтотОбъект, Отказ, Родитель);
33 spiller26
 
05.09.19
17:31
(29) Не поставишь ГУИД, я тоже как то пытался.
34 Gorr
 
05.09.19
17:34
(27)
+ можно даже задать код явно тем самым избежать события ПриУстановкеНовогоКода и генерации платформой нового ГУИДа...
(32) и что? там идет получение ссылки нового для запись в регист сведений прав доступа пользователей. Саму ссылку нового там никто не устанавливает.
(33) у меня все получилось.
35 Gorr
 
05.09.19
17:34
Все работает.
36 Gorr
 
05.09.19
17:38
Уважаемый администратор форума, просьба закрыть тему.
37 RomanYS
 
05.09.19
17:39
(35) понятно, что работает. От этого (15) не перестает быть бредом
38 Gorr
 
05.09.19
17:42
(37) Вы что-то хотели?)
39 Gorr
 
05.09.19
18:09
(37) а вы таки правы.
вообще, можно было бы и проверять устанавливалась ли уже ссылка, но кого это...
40 RomanYS
 
05.09.19
18:19
(39) так где кривой код-то. В УПП вроде красиво:

    Если ЭтотОбъект.ЭтоНовый() Тогда
        
        СсылкаНового = ЭтотОбъект.ПолучитьСсылкуНового();
        Если НЕ ЗначениеЗаполнено(СсылкаНового) Тогда
            СсылкаНового = Справочники[ЭтотОбъект.Метаданные().Имя].ПолучитьСсылку();
        КонецЕсли;
        
        ПолныеПрава.ЗарегистрироватьПраваДоступаПользователяКОбъекту(СсылкаНового, Родитель, Отказ);

        Если НЕ Отказ И НЕ ЗначениеЗаполнено(ЭтотОбъект.ПолучитьСсылкуНового()) Тогда
            ЭтотОбъект.УстановитьСсылкуНового(СсылкаНового);
        КонецЕсли;
    КонецЕсли;
41 Gorr
 
05.09.19
19:48
(40) наверное в УПП не просто так код другой нежели в зуп,
но я славо богу не в упп))
42 RomanYS
 
05.09.19
20:18
(41) Этот код в УПП и ЗУП2.5 наверняка одинаков. Вероятно у тебя какая-то древняя версия, в который этот код с багом.
43 Gorr
 
05.09.19
20:36
2.5.139.1
всего одна строка
СсылкаНового = Справочники[ЭтотОбъект.Метаданные().Имя].ПолучитьСсылку();
вместо

        СсылкаНового = ЭтотОбъект.ПолучитьСсылкуНового();
        Если НЕ ЗначениеЗаполнено(СсылкаНового) Тогда
            СсылкаНового = Справочники[ЭтотОбъект.Метаданные().Имя].ПолучитьСсылку();
        КонецЕсли;
почему-то я думаю что там все так и в последних версиях.