|
Явное преобразование к заранее неизвестному типу | ☑ | ||
---|---|---|---|---|
0
live in sky dreams
14.11.16
✎
17:10
|
Есть определенная строка.
Поместим ее в пременную ИсходноеЗначение. Может принимать значения: - "1", "15", "226",.... - "Иванов ИП", "ООО Тополек",.... - "Истина", "Ложь" - "01.02.2016", "03.05.2017",.... В ходе выполнения программного кода мне необходимо привести значение переменной ИсходноеЗначение к типу, который может быть или булево или дата или строка или число... Примитивные вобщем. Сам тип, к которому необходимо привести, на этот момент задан в переменной "ТребуемыйТип" Можно сделать через попытка...исключение.. Например: Попытка НовоеЗначение = Строка(ИсходнойЗначение) Исключение Сообщаем об ошибке преобразования КонецПопытки Но тут явно задано "Строка(...)" а может быть и не строка вовсе, а "Булево(...)", "Число(...)" и т.д. Можно ли написать универсальный код для преобразвания значения к типу в зависимости от содержания переменной ТребуемыйТип? |
|||
1
Garykom
гуру
14.11.16
✎
17:11
|
Если ... Тогда ... ИначеЕсли ... Тогда ... ИначаЕсли ... Тогда ...
|
|||
2
Лефмихалыч
14.11.16
✎
17:11
|
по очереди пытаться преобразовать к каждому типу, кроме строки
|
|||
3
Господин ПЖ
14.11.16
✎
17:12
|
функция есть... нештатная
ИменемБорисаНуралиева() |
|||
4
Масянька
14.11.16
✎
17:13
|
(3) Не всем доступна :(
|
|||
5
Масянька
14.11.16
✎
17:13
|
(0) А когда станет известно к какому типу приводить-то надо?
|
|||
6
aleks_default
14.11.16
✎
17:14
|
XMLЗначение?
|
|||
7
НЕА123
14.11.16
✎
17:14
|
"Истина" строка или булево?
|
|||
8
Масянька
14.11.16
✎
17:15
|
(7) А 1 или 0 - не?
|
|||
9
Лефмихалыч
14.11.16
✎
17:16
|
Функция ПривестиВочтобытонистало(Строка)
Для каждого КлючЗначение Из Новый Структура("Дата, Число, Булево") Цикл ОписаниеТипа = Новый ОписаниеТипов(КлючЗначение.Ключ); Значение = ОписаниеТипа.ПривестиЗначение(Строка); Если Значение <> Неопределено Тогда Возврат Значение; КонецЕсли; КонецЦикла; Возврат Строка; КонецФункции |
|||
10
youalex
14.11.16
✎
17:19
|
ОписаниеТипов.ПривестиЗначение() ?
|
|||
11
Fragster
гуру
14.11.16
✎
17:21
|
развлекайся:
ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Значение"); ТЗ.Колонки.Добавить("Строка"); ТЗ.Колонки.Добавить("Число"); ТЗ.Колонки.Добавить("Булево"); ТЗ.Колонки.Добавить("Дата"); МассивЗначений = Новый Массив(); МассивЗначений.Добавить("1"); МассивЗначений.Добавить("Истина"); МассивЗначений.Добавить("01.01.2016"); МассивЗначений.Добавить("20160101"); Для каждого Значение Из МассивЗначений Цикл Стр = ТЗ.Добавить(); Стр.Значение = Значение; Для каждого Колонка Из ТЗ.Колонки Цикл КолонкаИмя = Колонка.Имя; Если КолонкаИмя = "Значение" Тогда Продолжить КонецЕсли; Попытка Описание = Новый ОписаниеТипов(КолонкаИмя); Стр[КолонкаИмя] = Описание.ПривестиЗначение(Значение); Исключение КонецПопытки; КонецЦикла; КонецЦикла; |
|||
12
Лефмихалыч
14.11.16
✎
17:22
|
есть 10 и 24 строки. Кто больше?
|
|||
13
Fragster
гуру
14.11.16
✎
17:23
|
МассивЗначений.Добавить("01.01.2016 00:00:00");
|
|||
14
Fragster
гуру
14.11.16
✎
17:24
|
но на самом деле надо идти глубже и понять, откуда у автора такие строки
|
|||
15
Fragster
гуру
14.11.16
✎
17:25
|
очень похоже на самопальный парсер чего-то. причем в случае csv или xml - все уже давно придумано
|
|||
16
Лефмихалыч
14.11.16
✎
17:25
|
||||
17
Вафель
14.11.16
✎
17:26
|
можно через вычислить()
|
|||
18
Лефмихалыч
14.11.16
✎
17:26
|
(15) самопальным бы он был, если бы автор сам с ним справился
|
|||
19
Garykom
гуру
14.11.16
✎
17:34
|
3. ТЗ с типизированными колонками
4. ХМLТип()/ИзХМLТипа() |
|||
20
Fragster
гуру
14.11.16
✎
17:38
|
(19) 4 попутал
|
|||
21
Fragster
гуру
14.11.16
✎
17:39
|
кстати, правила XML и правила описания типов отличаются
|
|||
22
newbling
14.11.16
✎
17:45
|
(18) Коллективнопальный
|
|||
23
live in sky dreams
14.11.16
✎
17:45
|
В момент отладки 2 переменных:
ЗначениеСтрокой = "01.01.20015" (Тип: Строка) ОписаниеТипаРеквизита = Дата (Тип: Тип) http://prntscr.com/d75f9r Для "Тип"а нет метода ПривестиЗначение(), так бы использовал, конечно. Значение переменной ОписаниеТипаРеквизита получил из РеквизитДокумента.Тип.Типы()[0] Вместо Дата (Тип: Тип) засунуть в переменную ОписаниеТипаРеквизита "Дата" (Тип: Строка) я могу. Интерес чисто познавательный, можно ли имея переменную со значением типа Тип попытаться привести произвольное значениек этому типу.. |
|||
24
Garykom
гуру
14.11.16
✎
17:46
|
(21) XSLT и вперед
|
|||
25
live in sky dreams
14.11.16
✎
17:47
|
(22) это как то делает полученные знания хреновыми? Или меня как человека хреновым?
Или к чему вы это сказали? |
|||
26
Лефмихалыч
14.11.16
✎
17:52
|
(23)> Для "Тип"а нет метода ПривестиЗначение(),
зато этот метод есть у ОписаниеТипов. (25) это - не делает. Но как случилось, что тебе тут привели два разных куска аналогичного ГОТОВОГО кода, а ты все еще задачу не решил? |
|||
27
live in sky dreams
14.11.16
✎
18:04
|
(26)я знаю что есть у ОписаниеТипов.
Но чтобы узнать какое описание типа создавать, - мне необходимо выполнять Строка(ОписаниеТипаРеквизита). И в случае с примитивами это сработает. ОписаниеТипа = Новый ОписаниеТипов(Строка(ОписаниеТипаРеквизита)); Попытка ПриведенноеЗначение = ОписаниеТипа.ПривестиЗначение(ЗначениеСтрокой) Исключение Сообщить(ОписаниеОшибки()) КонецПопытки Этот кусок кода выполнится и отработает так как нужно, но только для примитива. И да, изначально задача так и ставилась. Но что если мне придется в будущем расширить этот код и до обработки к примеру ссылочных типов? http://prntscr.com/d75qql |
|||
28
Вафель
14.11.16
✎
18:05
|
делай через ЕслиТогда
|
|||
29
Fragster
гуру
14.11.16
✎
18:05
|
"В ходе выполнения программного кода мне необходимо привести значение переменной ИсходноеЗначение к типу, который может быть или булево или дата или строка или число... Примитивные вобщем. Сам тип, к которому необходимо привести, на этот момент задан в переменной "ТребуемыйТип"
" (с) live in sky dreams |
|||
30
Вафель
14.11.16
✎
18:06
|
Для ссылочных типов еще нужно указывать по каким реквизитам искать
|
|||
31
Fragster
гуру
14.11.16
✎
18:06
|
ну а про "выполнять Строка(ОписаниеТипаРеквизита)" - СП - не наш путь?
|
|||
32
live in sky dreams
14.11.16
✎
18:08
|
(31) а что СП?
http://prntscr.com/d75swi |
|||
33
Dmitry77
14.11.16
✎
18:11
|
Попытка
Новое значение = число (старое значение) Исключение Конец попытки Попытка Новое значение =дата (старое значение) Исключение Конецпопытки Попытка Новоезначение = булевой(старое значение) Исключение Конец попытки |
|||
35
Fragster
гуру
14.11.16
✎
18:12
|
(33) печалька
|
|||
36
KAO111
14.11.16
✎
19:32
|
XMLТип(Тип).ИмяТипа
|
|||
37
Torquader
14.11.16
✎
23:16
|
Если мы у реквизита в метаданных получаем значение Тип, то это и есть описание типа - и оно нам дано для того, чтобы от него вызвать привести значение - мы сразу же получаем значение, которое можно сохранить в реквизит.
Наверное - автор именно это и хотел ? |
|||
38
dmpl
15.11.16
✎
07:31
|
(27) Нафига строка? Для ОписаниеТипов есть конструктор на основании массива типов. Вот помещай ТребуемыйТип в массив и создавай ОписаниеТипов.
|
|||
39
Рэйв
15.11.16
✎
08:06
|
(0)нормализуй входящее. А то бардак развел...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |