Вход | Регистрация
    1  2   

Как сериализовать ссылку в XML?

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

    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение);
    СтрокаXML = ЗаписьXML.Закрыть();
    
    Сообщить(СтрокаXML);
    
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.УстановитьСтроку(СтрокаXML);
    Значение = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);    
    
    Сообщить(Значение);
   Leonardo1c
 
34 - 22.01.21 - 11:22
(33) работает тока в одной и той же базе
   Ненавижу 1С
 
35 - 22.01.21 - 11:23
(34) поверь мне, ему это и надо
   Гений 1С
 
36 - 22.01.21 - 11:36
(34) в смысле, почему в одной и той же базе. Там разве тип объекта не строкой задается?
   Гений 1С
 
37 - 22.01.21 - 11:37
(31) читать умеем? У меня произвольная ссылка, я ее тип не знаю.
   Kassern
 
38 - 22.01.21 - 11:39
(37) Я как раз таки умею читать и на вопрос "но ведь есть же XMLЗначение, какого хуанхэ оно не работает без типа?" дал тебе подробный ответ
   Гений 1С
 
39 - 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, это пушной зверек, друзья мои.
   Гений 1С
 
40 - 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
может тебе таки объект нужен?
   Гений 1С
 
42 - 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</Номенклатура >
   Leonardo1c
 
45 - 22.01.21 - 11:48
с сайта что ли номенклатуру в базе ищешь?
   Гений 1С
 
46 - 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.Номенклатура>
Бейсболка
   Гений 1С
 
47 - 22.01.21 - 11:50
ну осталось еще раскодировку написать, но это мелочи.
Поисковая обработка быстрее операций с метаданными, наверное
   Вафель
 
48 - 22.01.21 - 11:50
(46) выгрузка загрузка xml, когда реквизит составного типа
   Вафель
 
49 - 22.01.21 - 11:51
CatalogRef.Номенклатура можно и попроще получить
   Гений 1С
 
50 - 22.01.21 - 11:53
(49) как? (без сарказма, рили скоро кодить это дело буду)
   Кирпич
 
51 - 22.01.21 - 11:56
XMLТипЗнч(Значение).ИмяТипа
   Fragster
 
52 - 22.01.21 - 12:00
если ползоваться сериализатором xdto, то он сам атрибут с типом подставит при сериализации и десериализации
   DrShad
 
53 - 22.01.21 - 12:00
(50) с = XMLСтрока(Ссылка);
т = XMLТипЗнч(Ссылка);
тСтр = т.ИмяТипа;
   Fragster
 
54 - 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С должна всё делать как, как он только что придумал? Не нужно искать какой то подвох или глубинный смысл в его вопросах. Если мысленно заменить "Гений" на "Дятел", то суть вопроса проясняется быстрее.
   Гений 1С
 
56 - 22.01.21 - 12:31
(53) Бро, спаасибо от души:

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


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

А далее уже через ЧтениеXML.
В принципе, решаемо.
   Гений 1С
 
80 - 22.01.21 - 14:57
Но твою ж мать, почему функции 1С не замкнуты, почему нет обратной функции к XMLТипЗнч ?
(глас вопиющего в пустыне)
   Ненавижу 1С
 
81 - 22.01.21 - 15:00
(80) ИзXMLТипа
   Ненавижу 1С
 
82 - 22.01.21 - 15:02
+(81) конечно это необратная функция, потому что здесь нет биекции
   Кирпич
 
83 - 22.01.21 - 15:04
(78) Ну читать ты вряд ли будешь, а быстродействие не помешает
   Вафель
 
84 - 22.01.21 - 15:06
(82) пример можно когда не биекция?
   Гений 1С
 
85 - 22.01.21 - 15:06
(82) не выражайся. если есть преобразование в XML типа то и обратное должно быть.
(83) не, там не критично. обмен по API с другой системой, HTTP на порядок тормознутее 1с-базы
   DrShad
 
86 - 22.01.21 - 15:09
(80) чем тебе не подходит (71)?
   Кирпич
 
87 - 22.01.21 - 15:11
(80) Тебе же писали уже
Тип("CatalogRef.Номенклатура")
   Кирпич
 
88 - 22.01.21 - 15:17
Осталось научиться откусить от строки 36 символов с конца. А то и правда начнет точку искать
   mikecool
 
89 - 22.01.21 - 15:21
(42) подсмотри, как TormozIT в ИР это делает
   Гений 1С
 
90 - 22.01.21 - 15:21
(87) гм, пропустил, реально работает.
   Кирпич
 
91 - 22.01.21 - 15:32
(90) В 1с дофига функций, которые работают
   DrShad
 
92 - 22.01.21 - 15:38
(91) еще больше, которые не работают, если их неверно применять или не знать о них )))
   Гений 1С
 
93 - 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);
КонецФункции
   dangerouscoder
 
94 - 26.01.21 - 15:10
(93) А так
Возврат  Справочники[Ч2].ПолучитьСсылку(Новый УникальныйИдентификатор(Ч3)));
   DrShad
 
95 - 26.01.21 - 15:21
(94) а если это будет не справочник?
   Salimbek
 
96 - 26.01.21 - 15:22
(0) Я игрался со всем этим, когда Шаблонизатор писал. Тут: http://catalog.mista.ru/public/1260777/
Кстати, недавно выяснил, что он и Хранилище тоже в код превращает, только там что-то типа Base64-строки получается.
   Kassern
 
97 - 26.01.21 - 15:39
(93) Зачем такая портянка, когда есть СтрРазделить(XML,".")?
   Гений 1С
 
98 - 26.01.21 - 16:37
(97) для общности, не во всех релизах
   Гений 1С
 
99 - 26.01.21 - 16:37
(95) гыгыгы
   acht
 
100 - 26.01.21 - 17:56
(98) СтрПолучитьСтроку, Геня. И Символы.ПС вместо второй точки при "сериализации".

Гыгыгыгы.
  1  2   

Список тем форума
Рекламное место пустует  Рекламное место пустует
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.