Имя: Пароль:
1C
 
Как сериализовать ссылку в XML?
0 Гений 1С
 
гуру
22.01.21
07:40
Ну что то типа Справочник.Номенклатура.Гуид?
1 Ненавижу 1С
 
гуру
22.01.21
07:41
Гений уже не торт
2 ДенисЧ
 
22.01.21
07:42
Мдя...
Продам СП. Очень дорого.
Вылечу от мании величия. Очень-очень дорого.
3 Mankubus
 
22.01.21
07:47
xmlСтрока(Ссылка)
УникальныйИдентификатор()
4 Гений 1С
 
гуру
22.01.21
07:56
(3) а обратно, товарищ Богачев?
5 Гений 1С
 
гуру
22.01.21
07:56
(1) ты зато смотрю всё калорийнее!
6 Гений 1С
 
гуру
22.01.21
08:01
XMLЗначение(<Тип>, <СтрокаXML>) - требует Тип, зачем?
Это мне надо вручную тип определить?
А еще пишут: "Выполняет действие обратное действию метода XMLСтрока."
7 Mankubus
 
22.01.21
08:17
(4) ууу я подумал что гуид нужен
если сериализация то читай про СериализаторXDTO
8 Гений 1С
 
гуру
22.01.21
08:47
(7) ты лучше за XMLЗначение ответь
9 Кирпич
 
22.01.21
09:01
ЗначениеВСтрокуВнутр()
10 Гений 1С
 
гуру
22.01.21
09:03
(9) я про XML
11 Кирпич
 
22.01.21
09:05
(10) А XML это не строка что ли?
12 Гений 1С
 
гуру
22.01.21
09:29
(11) не юродствуй, это не строка  в формате ЗначениеВСтрокуВнутр.
13 Кирпич
 
22.01.21
09:34
(12) Тупой чтоли
14 Гений 1С
 
гуру
22.01.21
09:36
(13) истину ищу
15 Kassern
 
22.01.21
09:38
(12) Онли фо ю
Синтаксис:
ЗначениеВСтрокуВнутр(<Значение>)
Параметры:
<Значение> (обязательный)
Тип: Произвольный.
Преобразуемое значение.
Возвращаемое значение:
Тип: Строка.
Системное представление значения в информационной базе.
Описание:
Получает системное строковое представление переданного значения.
16 Гений 1С
 
гуру
22.01.21
09:40
(13)(15)
ЗначениеВСтрокуВнутр(xmlСтрока(Справочники.Валюты.НайтиПоНаименованию("Руб"))) - на юг
17 Кирпич
 
22.01.21
09:43
Точно тупой
18 Кирпич
 
22.01.21
09:44
xmlСтрока(ЗначениеВСтрокуВнутр(Справочники.Валюты.НайтиПоНаименованию("Руб")))
или так
ЗначениеВСтрокуВнутр(Справочники.Валюты.НайтиПоНаименованию("Руб"))
19 GANR
 
22.01.21
10:00
(0) легко) не верю что ты это не сумеешь
20 Leonardo1c
 
22.01.21
10:07
(0) умею
скидывай 12тр
21 ДенисЧ
 
22.01.21
10:14
(20) Откуда у него такие деньги?
22 Кирпич
 
22.01.21
10:15
(21) Стартмани продаст
23 Гений 1С
 
гуру
22.01.21
10:19
(19) в строку умею. из строки не умею вот так сразу. Можно как-то через фабрику или тупо разбор строки по точкам, но ведь есть же XMLЗначение, какого хуанхэ оно не работает без типа?
24 Гений 1С
 
гуру
22.01.21
10:19
(20) если 100500 раз предложить, то старания окупятся, глядишь кто-то рубль за тыщу и купит, да?
25 Stephen Ordo
 
22.01.21
10:23
Внешнюю компоненту смотрю уже не предлагают? На си шарпе...
26 Кирпич
 
22.01.21
10:30
(23) "какого хуанхэ оно не работает без типа?"
потому что в XML всё представлено строками. Как 1с догадается, что у тебя там не просто строка, а ссылка?
Вон тебе придумали умные люди сериализацию. Пользуйся.
https://1c-programmer-blog.ru/programmirovanie/xdto-serializaciya-v-1s.html
27 Leonardo1c
 
22.01.21
10:31
(24) сколько за последние 2 года было куплено курсов у коучей? а сколько книжек по 1с прочитано и курсов пройдено?
28 Leonardo1c
 
22.01.21
10:33
(26) это очень сложно для него
надо хотя бы видео где это ему зачтет радислав гандапас
29 Ненавижу 1С
 
гуру
22.01.21
10:39
(28) а также Зимбицкий
30 Leonardo1c
 
22.01.21
10:45
(29) это тот кто научил гения 1с переливать из пустого в порожнее..
в сериализации строк он не силен..
31 Kassern
 
22.01.21
10:51
(23) Показываю на пальцах, чтобы было понятно на примере из СП. Вот ты решил выгрузить дату в xml и такой пишешь ЗаписьXML.ЗаписатьТекст(XMLСтрока(ДатаПлатежа)); Крутяк, а дальше берешь в базе приемнике пишешь Дата = XMLЗначение(Тип("Дата"), ЧтениеXML.Значение); А все почему? Потому что в файлике у тебя <date>2021-01-22T10:49:47</date> к примеру. Откуда базе приемнику знать, что строка "2021-01-22T10:49:47" это дата пришла, а не гуид номенклатуры к примеру? Теперь понятней?)
32 Leonardo1c
 
22.01.21
10:59
(26) круто - статью писал такой же гений
"На самом деле, я не знаю, как выполнить эту задачу при помощи объекта «СериализаторXDTO», я пользуюсь только фабрикой, но продолжаю считать этот процесс XDTO-сериализацией. Если Вы знаете более правильный способ, то я с удовольствием его изучу."
33 Ненавижу 1С
 
гуру
22.01.21
11:19
Значение = МояСсылка;

    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение);
    СтрокаXML = ЗаписьXML.Закрыть();
    
    Сообщить(СтрокаXML);
    
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.УстановитьСтроку(СтрокаXML);
    Значение = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);    
    
    Сообщить(Значение);
34 Leonardo1c
 
22.01.21
11:22
(33) работает тока в одной и той же базе
35 Ненавижу 1С
 
гуру
22.01.21
11:23
(34) поверь мне, ему это и надо
36 Гений 1С
 
гуру
22.01.21
11:36
(34) в смысле, почему в одной и той же базе. Там разве тип объекта не строкой задается?
37 Гений 1С
 
гуру
22.01.21
11:37
(31) читать умеем? У меня произвольная ссылка, я ее тип не знаю.
38 Kassern
 
22.01.21
11:39
(37) Я как раз таки умею читать и на вопрос "но ведь есть же XMLЗначение, какого хуанхэ оно не работает без типа?" дал тебе подробный ответ
39 Гений 1С
 
гуру
22.01.21
11:42
Погонял код:

Значение = МояСсылка;

    Сообщить(XMLСтрока(Значение));

    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение);
    СтрокаXML = ЗаписьXML.Закрыть();
    
    Сообщить(СтрокаXML);
    
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.УстановитьСтроку(СтрокаXML);
    Значение = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);    
    
    Сообщить(Значение);

Вы будете смеяться, но результаты такие:

95a99866-6c6d-11de-b4b4-00195b6993ba
<CatalogRef.Номенклатура xmlns="http://v8.1c.ru/8.1/data/enterprise/current-config"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">95a99866-6c6d-11de-b4b4-00195b6993ba</CatalogRef.Номенклатура>;
Бейсболка

То бишь XMLстрока просто сериализирует в GUID, это пушной зверек, друзья мои.
40 Гений 1С
 
гуру
22.01.21
11:44
Ну ладно, Решение нашлось благодаря ненавижну, только с Сериализатором он перемудрил, старый буквоед. Все проще:

Значение = МояСсылка;

    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.УстановитьСтроку();
    ЗаписатьXML(ЗаписьXML, Значение);
    СтрокаXML = ЗаписьXML.Закрыть();
    
    Сообщить(СтрокаXML);
    
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.УстановитьСтроку(СтрокаXML);
    Значение = ПрочитатьXML(ЧтениеXML);    
    
    Сообщить(Значение);


<CatalogRef.Номенклатура>95a99866-6c6d-11de-b4b4-00195b6993ba</CatalogRef.Номенклатура>
Бейсболка
41 Вафель
 
22.01.21
11:44
может тебе таки объект нужен?
42 Гений 1С
 
гуру
22.01.21
11:45
Хотя все же жаль, что нет компактного преобразования в CatalogRef.Номенклатура.95a99866-6c6d-11de-b4b4-00195b6993ba
Хоть самому пиши, будет лишнее место засираться в базе
(41) нет, ссылка.
43 Вафель
 
22.01.21
11:46
обычно тип как атрибут идет
44 Вафель
 
22.01.21
11:47
<Номенклатура type="CatalogRef.Номенклатура">95a99866-6c6d-11de-b4b4-00195b6993ba</Номенклатура >
45 Leonardo1c
 
22.01.21
11:48
с сайта что ли номенклатуру в базе ищешь?
46 Гений 1С
 
гуру
22.01.21
11:49
(43) обычно это где?
я сам сериализирую в регистре.

(44) Шах и мат, господа:

Значение = МояСсылка;

    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.УстановитьСтроку();
    ЗаписатьXML(ЗаписьXML, Значение);
    СтрокаXML = ЗаписьXML.Закрыть();
    
    Сообщить(СтрокаXML);

    СтрокаСЖ = СтрокаXML;
    СтрокаСЖ = СтрЗаменить(СтрокаСЖ, "<", "");
    СтрокаСЖ = СтрЗаменить(СтрокаСЖ, ">", ".");
    Поз = Найти(СтрокаСЖ, "/");
    СтрокаСЖ = Лев(СтрокаСЖ, Поз-1);
    Сообщить(СтрокаСЖ);


    
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.УстановитьСтроку(СтрокаXML);
    Значение = ПрочитатьXML(ЧтениеXML);    
    
    Сообщить(Значение);



CatalogRef.Номенклатура.95a99866-6c6d-11de-b4b4-00195b6993ba
<CatalogRef.Номенклатура>95a99866-6c6d-11de-b4b4-00195b6993ba</CatalogRef.Номенклатура>
Бейсболка
47 Гений 1С
 
гуру
22.01.21
11:50
ну осталось еще раскодировку написать, но это мелочи.
Поисковая обработка быстрее операций с метаданными, наверное
48 Вафель
 
22.01.21
11:50
(46) выгрузка загрузка xml, когда реквизит составного типа
49 Вафель
 
22.01.21
11:51
CatalogRef.Номенклатура можно и попроще получить
50 Гений 1С
 
гуру
22.01.21
11:53
(49) как? (без сарказма, рили скоро кодить это дело буду)
51 Кирпич
 
22.01.21
11:56
XMLТипЗнч(Значение).ИмяТипа
52 Fragster
 
гуру
22.01.21
12:00
если ползоваться сериализатором xdto, то он сам атрибут с типом подставит при сериализации и десериализации
53 DrShad
 
22.01.21
12:00
(50) с = XMLСтрока(Ссылка);
т = XMLТипЗнч(Ссылка);
тСтр = т.ИмяТипа;
54 Fragster
 
гуру
22.01.21
12:01
главное, чтобы в пакете в импорте был http://v8.1c.ru/8.1/data/current-config
55 Кирпич
 
22.01.21
12:24
(54) Да ему это не надо. Он просто не знал как сделать строку типа "CatalogRef.Номенклатура.95a99866-6c6d-11de-b4b4-00195b6993ba", а наплел про сериализацию и XML.
Какой коуч ему внушил, что 1С должна всё делать как, как он только что придумал? Не нужно искать какой то подвох или глубинный смысл в его вопросах. Если мысленно заменить "Гений" на "Дятел", то суть вопроса проясняется быстрее.
56 Гений 1С
 
гуру
22.01.21
12:31
(53) Бро, спаасибо от души:

Значение = МояСсылка;
    ТипXML = XMLТипЗнч(Значение);
    Сообщить(ТипXML.ИмяТипа + "." + Значение.УникальныйИдентификатор());


Но вот вопрос, как это добро обратно десериализовывать?
57 DrShad
 
22.01.21
12:33
(56) XMLЗначение
58 Вафель
 
22.01.21
12:34
XMLЗначение(<Тип>, <СтрокаXML>)
59 DrShad
 
22.01.21
12:42
XMLЗначение(Тип(ТипXML), XMLСтрока(Значение))
60 Кирпич
 
22.01.21
12:44
(56) "Но вот вопрос, как это добро обратно десериализовывать?"
Видимо, найти точку в тексте
61 Leonardo1c
 
22.01.21
12:46
(60) написать компоненту на C#
62 DrShad
 
22.01.21
12:46
(61) толстый троллинг
63 mikecool
 
22.01.21
12:49
все не читал, с сабжем разобрались? а то у меня аналогичная проблема
64 Кирпич
 
22.01.21
12:52
(63) в (40) всё готово
65 Гений 1С
 
гуру
22.01.21
13:22
(58) (59) (60) Вот именно, что надо искать вторую точку, иначе никак.
66 Гений 1С
 
гуру
22.01.21
13:23
(64) не вполне, значение из ссылки как оптимально выковыривать, не понятно. только с поиском точки.
67 DrShad
 
22.01.21
13:23
(65) не ищи, разложи строку в массив подстрок и работай с ним
68 Гений 1С
 
гуру
22.01.21
13:25
(67) нет проблема даже в другом: нужна обратная для XMLТипЗнч функция.
то бишь из строки CatalogRef.Номенклатура как получить тип СправочникСсылка.Номенклатура?
69 Leonardo1c
 
22.01.21
13:29
(68)  СтрРазделить() если компоненту писать не хочешь
70 Гений 1С
 
гуру
22.01.21
13:30
(69) да проблема не в разделителе, а в восстановлении типа. 1С опять не написала обратной функции для XMLТипЗнч
71 DrShad
 
22.01.21
13:41
(68) Тип(ТипXML)
72 Кирпич
 
22.01.21
14:02
(66) Так у тебя же в (40) Бейсболку выдает
73 Leonardo1c
 
22.01.21
14:04
(72)    СтрокаСЖ = СтрокаXML;
    СтрокаСЖ = СтрЗаменить(СтрокаСЖ, "<", "");
    СтрокаСЖ = СтрЗаменить(СтрокаСЖ, ">", ".");
    Поз = Найти(СтрокаСЖ, "/");
    СтрокаСЖ = Лев(СтрокаСЖ, Поз-1);
    Сообщить(СтрокаСЖ);
у него конвертиться в строку - а обратно не хочет
74 Гений 1С
 
гуру
22.01.21
14:13
(72) посмотри внимательнее. обратно можно через ЖО, т.е. через ЧтениеXML с плясками и бубнами
75 Кирпич
 
22.01.21
14:31
(74) Не знаю. У меня бейсболка.
76 Кирпич
 
22.01.21
14:32
(73) Так не надо так делать. Надо делать как в (40)
77 Кирпич
 
22.01.21
14:41
Ну или просто ЗначениеВСтрокуВнутр вместо изпальцавысосанного "CatalogRef.Номенклатура.95a99866-6c6d-11de-b4b4-00195b6993ba"
78 Гений 1С
 
гуру
22.01.21
14:55
(77) там внутренние ID объекта используются, как-то не комильфо и нечитаемо
79 Гений 1С
 
гуру
22.01.21
14:56
(76) Не, ну в принципе CatalogRef.Номенклатура.95a99866-6c6d-11de-b4b4-00195b6993ba можно превратить в:
<CatalogRef.Номенклатура>95a99866-6c6d-11de-b4b4-00195b6993ba</CatalogRef.Номенклатура>

А далее уже через ЧтениеXML.
В принципе, решаемо.
80 Гений 1С
 
гуру
22.01.21
14:57
Но твою ж мать, почему функции 1С не замкнуты, почему нет обратной функции к XMLТипЗнч ?
(глас вопиющего в пустыне)
81 Ненавижу 1С
 
гуру
22.01.21
15:00
(80) ИзXMLТипа
82 Ненавижу 1С
 
гуру
22.01.21
15:02
+(81) конечно это необратная функция, потому что здесь нет биекции
83 Кирпич
 
22.01.21
15:04
(78) Ну читать ты вряд ли будешь, а быстродействие не помешает
84 Вафель
 
22.01.21
15:06
(82) пример можно когда не биекция?
85 Гений 1С
 
гуру
22.01.21
15:06
(82) не выражайся. если есть преобразование в XML типа то и обратное должно быть.
(83) не, там не критично. обмен по API с другой системой, HTTP на порядок тормознутее 1с-базы
86 DrShad
 
22.01.21
15:09
(80) чем тебе не подходит (71)?
87 Кирпич
 
22.01.21
15:11
(80) Тебе же писали уже
Тип("CatalogRef.Номенклатура")
88 Кирпич
 
22.01.21
15:17
Осталось научиться откусить от строки 36 символов с конца. А то и правда начнет точку искать
89 mikecool
 
22.01.21
15:21
(42) подсмотри, как TormozIT в ИР это делает
90 Гений 1С
 
гуру
22.01.21
15:21
(87) гм, пропустил, реально работает.
91 Кирпич
 
22.01.21
15:32
(90) В 1с дофига функций, которые работают
92 DrShad
 
22.01.21
15:38
(91) еще больше, которые не работают, если их неверно применять или не знать о них )))
93 Гений 1С
 
гуру
26.01.21
10:53
Может кому пригодится, выкладываю:

Функция СсылкаВXML(Ссылка) Экспорт
    //Сериализирует ссылку в формат вида:
    //CatalogRef.Номенклатура.95a99866-6c6d-11de-b4b4-00195b6993ba
    Если НЕ ЗначениеЗаполнено(Ссылка) Тогда
        Возврат "";
    КонецЕсли;
    
    Возврат
    XMLТипЗнч(Ссылка).ИмяТипа
    + "."
    + XMLСтрока(Ссылка);
КонецФункции

Функция СсылкаИзXML(XML) Экспорт
    Если XML = "" Тогда
        Возврат Неопределено;
    КонецЕсли;
    //Десериализирует в ссылку из формат вида:
    //CatalogRef.Номенклатура.95a99866-6c6d-11de-b4b4-00195b6993ba
    Поз = Найти(XML, ".");
    Ч1 = Лев(XML, Поз - 1);
    Ч2 = Сред(XML, Поз + 1);
    Поз = Найти(Ч2, ".");
    Ч3 = Сред(Ч2, Поз + 1);
    Ч2 = Лев(Ч2, Поз - 1);
    
    Возврат XMLЗначение(Тип(Ч1 + "." + Ч2), Ч3);
КонецФункции
94 dangerouscoder
 
26.01.21
15:10
(93) А так
Возврат  Справочники[Ч2].ПолучитьСсылку(Новый УникальныйИдентификатор(Ч3)));
95 DrShad
 
26.01.21
15:21
(94) а если это будет не справочник?
96 Salimbek
 
26.01.21
15:22
(0) Я игрался со всем этим, когда Шаблонизатор писал. Тут: http://catalog.mista.ru/public/1260777/
Кстати, недавно выяснил, что он и Хранилище тоже в код превращает, только там что-то типа Base64-строки получается.
97 Kassern
 
26.01.21
15:39
(93) Зачем такая портянка, когда есть СтрРазделить(XML,".")?
98 Гений 1С
 
гуру
26.01.21
16:37
(97) для общности, не во всех релизах
99 Гений 1С
 
гуру
26.01.21
16:37
(95) гыгыгы
100 acht
 
26.01.21
17:56
(98) СтрПолучитьСтроку, Геня. И Символы.ПС вместо второй точки при "сериализации".

Гыгыгыгы.
101 Кирпич
 
26.01.21
18:51

Функция СсылкаИзXML(XML) Экспорт
    Если XML = "" Тогда
        Возврат Неопределено;
    КонецЕсли;
    Возврат XMLЗначение(Тип(Лев(XML,СтрДлина(XML)-37)), Прав(XML,36));
КонецФункции
102 Кирпич
 
26.01.21
18:52
Гыгыгыгы