Имя: Пароль:
1C
1С v8
УстановитьСсылкуНового() не работает
0 ASimonova
 
26.09.18
16:09
ДокументГуид = Новый УникальныйИдентификатор(ДокументГуидСтрока);
ДокументПоГуиду = Документы[Тип].ПолучитьСсылку(ДокументГуид);        
ТекущийДокумент = Документы[Тип].СоздатьДокумент();
ТекущийДокумент.УстановитьСсылкуНового(ДокументПоГуиду);

после чего ТекущийДокумент.Ссылка.УникальныйИдентификатор() остается все таким же нулевым
1 Вафель
 
26.09.18
16:13
ПолучитьСсылкуНового()
2 ASimonova
 
26.09.18
16:16
(1) ???
3 ASimonova
 
26.09.18
16:17
может быть я непонятно выразилась чего я хочу. я хочу загрузить из одной базы в другую документ. и чтобы этот документ не перезаписывался много раз, я устанавливаю его гуид таким же, как и в исходной базе. и вот, в какой-то момент этот код перестал работать
4 Вафель
 
26.09.18
16:18
(2) ну уж прочитай описание в СП
5 ASimonova
 
26.09.18
16:18
(4) я почитала, не знаю как мне это может помочь
6 Вафель
 
26.09.18
16:18
(3) он не перестал, он никогда не работал
7 s03
 
26.09.18
16:18
(2) ПолучитьСсылку() позволяет получить ссылку по GUID для документа в базе, а надо для нового, поэтому (1)
8 Вафель
 
26.09.18
16:19
ПолучитьСсылкуНового()
Возвращаемое значение:
Тип: ДокументСсылка.<Имя документа>.
Описание:
Позволяет для нового (созданного и еще не записанного) объекта получить ранее установленное методом
УстановитьСсылкуНового значение ссылки.

Что тут не понятного?
9 ASimonova
 
26.09.18
16:20
(8) поняла, я неправильно проверяю. вот так:
ТекущийДокумент.ПолучитьСсылкуНового().УникальныйИдентификатор()
так тоже по нулям
10 rozer76
 
26.09.18
16:26
(0)
>>ТекущийДокумент.Ссылка.УникальныйИдентификатор() остается все таким же нулевым

это после записи ТекущийДокумент ?
11 ASimonova
 
26.09.18
16:32
(10) нет, я уже поняла, что неправильно проверяла. до загрузки документа и это и вот это ТекущийДокумент .ПолучитьСсылкуНового(). УникальныйИдентификатор() по нулям. а после записи не, не по нулям, просто создается новый гуид, не имеющий отношения к ДокументГуидСтрока
12 Вафель
 
26.09.18
16:34
сделай

ДокументГуид = Новый УникальныйИдентификатор(ДокументГуидСтрока);
Сообщить(ДокументГуид);
ДокументПоГуиду = Документы[Тип].ПолучитьСсылку(ДокументГуид);        
ТекущийДокумент = Документы[Тип].СоздатьДокумент();
ТекущийДокумент.УстановитьСсылкуНового(ДокументПоГуиду);
Сообщить(ТекущийДокумент.ПолучитьСсылкуНового().УникальныйИдентификатор());
13 ASimonova
 
26.09.18
16:35
(12) а без сообщить, через отладчик можно?)
1) 023b773e-bd74-11e8-ac15-e839355ac280
2) 00000000-0000-0000-0000-000000000000
14 rozer76
 
26.09.18
16:36
ндя
15 Вафель
 
26.09.18
16:37
(13) скорее всего ты что-то не  так смотришь в отладчике
16 ASimonova
 
26.09.18
16:37
(14) что? какая-то совсем совсем глупая ошибка? не тяните, что там?
17 ASimonova
 
26.09.18
16:38
(15) я и ошибку то заметила без отладчика. когда мне база начала выдавать "номер документа неуникален"
18 ASimonova
 
26.09.18
16:38
(15) в отладичке только подтвердила. да и сообщить могу сделать, мне не лень, ща
19 Вафель
 
26.09.18
16:38
(17) так у тебя изначально другая ошибка была
20 rozer76
 
26.09.18
16:40
>>а после записи не, не по нулям, просто создается новый гуид, не имеющий отношения к ДокументГуидСтрока

и что ДокументПоГуиду = Документы[Тип].ПолучитьСсылку(ДокументГуид);  

ДокументПоГуиду - что тут ? Чего на Неопределено не проверяете? а вдруг есть такая ссыль ?
21 Вафель
 
26.09.18
16:42
(20) ДокументПоГуиду никогда не будет неопределно
22 ASimonova
 
26.09.18
16:44
(20) проверяю, конечно. вот так:
Если Лев(Строка(ДокументПоГуиду),7) = "<Объект" Тогда ...

(18) ну точно, в отладчике чего-то не то смотрю. выходит вот так:
023b773e-bd74-11e8-ac15-e839355ac280
023b773e-bd74-11e8-ac15-e839355ac280

НО!

отдельно проверила:

Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Новый УникальныйИдентификатор("023b773e-bd74-11e8-ac15-e839355ac280"))

выдает объект не найден
23 ASimonova
 
26.09.18
16:45
(19) да, изначально была другая ошибка, а когда начала копать, оказалось, что в итоге все сходится к тому, что не устанавливается гуид
24 Fram
 
26.09.18
16:45
Мне кажется или автор пытается существующий документ таким образом получить?
25 Fram
 
26.09.18
16:46
И вообще велосипед изобретает, по моему
26 ASimonova
 
26.09.18
16:46
(24) да, именно так, автор пытается получить существующий, и если база его находит, то просто перезаписывает, а если не находит, то создает новый
27 rozer76
 
26.09.18
16:47
(21) сорри ДокументПоГуиду.ПолучитьОбъект() проверять
28 ASimonova
 
26.09.18
16:47
(25) а как по-другому сделать загрузку из другой базы так, чтобы документ не создавался новый при каждой перезагрузке?
29 ASimonova
 
26.09.18
16:48
(27) а зачем его проверять, когда срабатывает Лев(Строка(ДокументПоГуиду),7) = "<Объект"? там точно ничего нет
30 rozer76
 
26.09.18
16:50
(28)

НовыйДок = Ложь;

Ид    = Новый УникальныйИдентификатор(Идентификатор);
    
        ПромДок = Документы.ЗаявкаПокупателя.ПолучитьСсылку(Ид);
        Если ПромДок.ПолучитьОбъект() = Неопределено Тогда
            Ссылка = ПромДок;
            Док = Документы.ЗаявкаПокупателя.СоздатьДокумент();
            Док.УстановитьСсылкуНового(Ссылка);
            НовыйДок = Истина;
        КонецЕсли;
31 Fram
 
26.09.18
16:51
(26) по моему декрет не пошел вам на пользу? )
32 Fram
 
26.09.18
16:52
(30) ну вот, такую ветку испортил
33 Fram
 
26.09.18
16:54
(28) существующие механизмы использовать? КД
34 ASimonova
 
26.09.18
16:56
(30) так вы же то же самое написали?
(32) конечно, приходится чем-то жертвовать ради детей) не, КД у нас было раньше. огромная неповоротливая махина, а у нас изменения в выгрузках по разу в неделю.
35 Вафель
 
26.09.18
16:57
Для проверки существующего есть типовой метод
ОбщегоНазначения.СсылкаСуществует(Ссылка)
36 Вафель
 
26.09.18
16:58
ПолучитьОбъект() крайне не рекомендуется, ибо ссыла может существовать и там быть тч на тыщу строк
37 rozer76
 
26.09.18
17:00
(36) это согласен )
38 rozer76
 
26.09.18
17:01
(35) + 1
39 ASimonova
 
26.09.18
17:02
(30) блин это кое-что поменяло. я переназвала все переменные и ТекущийДокумент. ПолучитьСсылкуНового(). УникальныйИдентификатор() стало какое нужно. а после записи обратно поменялось на новый гуид вместо нужного мне
(35) ок, спс
40 ASimonova
 
26.09.18
17:05
я поняла ошибку. всем спасибо, мой косяк в дальнейшем коде. ну зато про СсылкаСуществует(Ссылка) узнала
41 ASimonova
 
26.09.18
17:08
(40) а нет, не то. сохраняется ошибка
42 ASimonova
 
26.09.18
17:08
(41) гуид меняется в момент записи
43 ASimonova
 
26.09.18
17:10
(42) удалила объект по той ссылке и создала новый, и ошибка пропала. то есть ошибка не решена, но просто пропала
44 Aleksey
 
26.09.18
18:33
(42) Это стандартное поведения типовых конфигураций. Они при записи проверяют, если это новый объект, то назначают ему новую ссылку.
Для обхода этого "подарка" от разработчиков используй конструкцию
ТекущийДокумент.ОбменДанными.Загрузка = истина;

Это типа ссылка прилетела с обменом и поэтому таким ссылкам гуид не меняют
45 Cyberhawk
 
26.09.18
18:55
"Если Лев(Строка(ДокументПоГуиду),7) = "<Объект" Тогда" // Садись, два
46 Cyberhawk
 
26.09.18
18:58
(44) Назови пож-та конфу и объект МД, при записи которого можно наблюдать описанное поведение (что ссылка нового заменяется принудительно в типовом коде - правильно понял?)
47 Aleksey
 
26.09.18
19:39
(46) например БП
48 Aleksey
 
26.09.18
20:19
Хотя может погорячился, я обмены через кд делаю и там с этим сталкиваюсь. Буквально в прошлом месяце пришлось попотеть придумывая как из 7-ки загружать в 8-ке и подсунуть ему свой гуид без правки обработки загрузки

Сейчас проверил на типовой бп на документах и справочниках. 1С только на справочнике сотруднике подменил гуид на свой, в остальных случаях гуид не менял
49 youalex
 
26.09.18
20:24
(30) >> Если ПромДок.ПолучитьОбъект() = Неопределено

не комильфо, лучше запросом
50 youalex
 
26.09.18
20:29
(46) думаю, речь идет про синхронизацию по ссылке
51 Cyberhawk
 
26.09.18
21:28
(48) "1С только на справочнике сотруднике подменил гуид на свой, в остальных случаях гуид не менял" // Я правильно понял, что ты программно создаешь этот справочник-объект, устанавливаешь ему ссылку нового, вызываешь Записать() не в режиме загрузки (ОбменДанными.Загрузка = Ложь) и после этого у созданного объекта УИД не тот, что ты установил?
52 Aleksey
 
26.09.18
21:36
(51) угу

    Для Каждого Мен Из Справочники Цикл
           Тип=Мен.Пустаяссылка().Метаданные().Имя;
        ГуидСтрока = "023b773e-bd74-11e8-ac15-e839355ac280";
        Сообщить(ГуидСтрока);
        УИД = Новый УникальныйИдентификатор(ГуидСтрока);
        СсылкаПоУиду = Справочники[Тип].ПолучитьСсылку(УИД);        
        ТекущийОбъект = Справочники[Тип].СоздатьЭлемент();
        ТекущийОбъект.УстановитьСсылкуНового(СсылкаПоУиду);
        Попытка
            ТекущийОбъект.Записать();
        Исключение
            Сообщить(""+тип+" "+ОписаниеОшибки());
            Продолжить;
        КонецПопытки;    
        
    
        Если строка(ТекущийОбъект.Ссылка.УникальныйИдентификатор()) <> ГуидСтрока тогда
            Сообщить(ТекущийОбъект.Ссылка.УникальныйИдентификатор());
            Сообщить(тип);
        КонецЕсли;    
    КонецЦикла;
53 Cyberhawk
 
26.09.18
21:40
Релиз бы еще назвал. Мне охота проверить. Если это взаправду так, то это ахтунг какой-то.
54 Cyberhawk
 
26.09.18
21:43
Ну а так все просто: пади все сеансы завершаются, а в коде не вызывается метод, создающий менеджер заданий
55 Cyberhawk
 
26.09.18
21:43
(не туда)
56 Aleksey
 
26.09.18
22:06
(53) тестил на
Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.65.69)
57 Aleksey
 
26.09.18
22:25
Запустил этот код в УТ 11.4.5.71

Справочники
3a1b8a23-c1c1-11e8-8464-00268332bca9
Контрагенты
3a1b8a27-c1c1-11e8-8464-00268332bca9
СтруктураПредприятия

Документы
ВводОстатков
3a1b8a30-c1c1-11e8-8464-00268332bca9
ВнутреннееПотреблениеТоваров
3a1b8a31-c1c1-11e8-8464-00268332bca9

p.S. Часть документов и справочников пропущены так как при записи ругались на незаполненые реквизиты
58 Cyberhawk
 
26.09.18
22:35
Охереть. Проверил в "Бухгалтерия предприятия, редакция 3.0 (3.0.42.85)".
В ПередЗаписью следующий код:

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

Т.е. ребяткам просто пох, что ссылка может быть до этого установлена через "УстановитьСсылкуНового" - теперь надо еще и в доп. свойства (свойство "СсылкаНового") ее запихать.
59 Fram
 
27.09.18
01:08
(58) видать по другому они могли создать ссылку на самого себя
61 Fram
 
27.09.18
01:17
* НЕ могли
62 Fram
 
27.09.18
01:22
при этом тебе дали назначить свою ссылку
63 Fram
 
27.09.18
01:23
*дали возможность
64 Cyberhawk
 
27.09.18
09:08
(62) Возможность назначить свою ссылку мне дает платформенный метод УстановитьСсылкуНового. А ребятки-писатели типовых почему-то забили болт на это, но навесили сверху уже прикладной код.
65 TormozIT
 
гуру
29.09.18
11:16
Это только в одном справочнике одной конфигурации или еще где то есть?
66 RomanYS
 
29.09.18
11:56
(65) Запустил поиск по БП3.0.64 текста ""СсылкаНового"", нашлось 3 строки. 2 связаны с (58). Ещё одна связана с справочником пользователи, как понял пользователь "по умолчанию" создается с фикс. ид:

    Свойства.Вставить("СтандартнаяСсылка", Справочники.Пользователи.ПолучитьСсылку(
        Новый УникальныйИдентификатор("aa00559e-ad84-4494-88fd-f0826edc46f0")));
    
    Свойства.Вставить("ПолноеИмяДляПоиска", НСтр("ru = '<Не указан>'"));
67 Cyberhawk
 
30.09.18
09:59
(65) Смотри (48) и (57), например
68 TormozIT
 
гуру
01.10.18
10:03
(67) Об этом надо сообщать разработчикам типовых решений. Пока  вижу что масштабы проблемы не большие. Поэтому надо писать в 1С багрепорты. Думаю это быстро исправят, исключая места, где логика на это опирается.
Ошибка? Это не ошибка, это системная функция.