Имя: Пароль:
1C
1С v8
Явное преобразование к заранее неизвестному типу
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)нормализуй входящее. А то бардак развел...