Имя: Пароль:
1C
1С v8
На входе текст, надо вернуть либо дату, либо число, как?
0 RomaH
 
naïve
18.01.13
09:41
На входе имею строку в виде либо даты, либо числа
"01.01.2012" или "115.5654"
как правильно получить на выходе сотвествующий тип данных?

число в попытку?
Попытка Число(Строка);

а дату?
1 shuhard
 
18.01.13
09:42
(0) дата(2012,01,01)
2 Анатолий Никитин
 
18.01.13
09:42
Может быть Дата(Строка)?
3 RomaH
 
naïve
18.01.13
09:46
(2) не - исключение получается
4 RomaH
 
naïve
18.01.13
09:46
(1) это надо сначала строку привести к такому виду
а проще?

а нормально число получать через попытку?
5 Юный 1С
 
18.01.13
09:48
просто формат даты не тот. надо вначале преобразовать строку
"01.01.2012" в 20120101
6 DrShad
 
18.01.13
09:48
REGEXP? для выявления маски
7 DrShad
 
18.01.13
09:48
(5) вьюноша, садитесь, двойка!
8 Юный 1С
 
18.01.13
09:49
(7) почему?
9 DrShad
 
18.01.13
09:49
(8) читай параметры Дата()
10 and2
 
18.01.13
09:50
(0) 2 точки - дата
1 или 0  - число
11 RomaH
 
naïve
18.01.13
09:51
(10) долго, найти, вырезать опять найти
12 andreymongol82
 
18.01.13
09:51
(8) Потому что
Параметры:

<Значение> (обязательный)

Тип: Строка.
Исходное значение даты.
Строка должна содержать дату в локальном формате даты или в каноническом виде YYYYMMDDHHMMSS.
13 MSII
 
18.01.13
09:51
Если точка во входящей строке одна - это число, если больше одной - дата. Дальше понятно.
14 and2
 
18.01.13
09:52
(11) не об этом - ты сначала получи к какому типу преобразовывать, имхо
15 samozvanec
 
18.01.13
09:53
(11) про СтрЧислоВхождений() не слыхал?
16 hhhh
 
18.01.13
09:53
(3) вроде так можно

Дата(Строка + " 0:00:00")
17 samozvanec
 
18.01.13
09:54
Если СтрЧислоВхождений(ТвояСтрокаНепонятноСЧем, ".") = 2 Тогда
   Возврат Дата(ТвояСтрокаНепонятноСЧем + " 00:00:00");
Иначе
   Возврат Число(ТвояСтрокаНепонятноСЧем);
КонецЕсли;
18 Юный 1С
 
18.01.13
09:55
(12) Вы хотите сказать что если я напишу так:

ДатаСтрокой = "20120101";
ИскомаяДата = Дата(ДатаСтрокой);

То вывалиться с ошибкой?
19 andreymongol82
 
18.01.13
09:59
(18) Я хочу сказать, что не важно как строку с датой "01.01.2012" или "20120101". Поэтому учимся пользоваться справкой
20 RomaH
 
naïve
18.01.13
10:03
(15) нет :(
21 RomaH
 
naïve
18.01.13
10:03
вот так работает:

Дата(ЯчейкаТаблицы.ТекстовоеСодержимое + " 00:00:00")
22 RomaH
 
naïve
18.01.13
10:04
получается:

Попытка
Число(ЯчейкаТаблицы.ТекстовоеСодержимое)
Исключение
Попытка

Дата(ЯчейкаТаблицы.ТекстовоеСодержимое + " 00:00:00")
Исключение
КонецПопытки
КонецПопытки
23 Reset
 
18.01.13
10:13
(22) А теперь посмотри  (17) :)
24 Ayvengo
 
29.01.13
10:18
Чет какой-то не красивый код ... решили пойти простым путем? :D
25 RomaH
 
naïve
29.01.13
10:22
(24) предложи красивее
суть - на входе можем получить (не исключается) любую строку
на выходе надо получить либо дату, либо число либо сообщение что все плохо
26 RomaH
 
naïve
29.01.13
10:23
27 Ayvengo
 
29.01.13
11:18
(25) да я пока что сам ищу вариант поинтереснее :)
28 Aprobator
 
29.01.13
11:32
хватит на Юный 1С наезжать. Дата("20120101") отрабатывает на ура. Так что сами учимся пользоваться справкой.
Выдержка из СП
......
Дата (Date)
Вариант синтаксиса: По строке

Синтаксис:

Дата(<Значение>)
Параметры:

<Значение> (обязательный)

Тип: Строка.
Исходное значение даты.
Строка должна содержать дату в локальном формате даты или в каноническом виде YYYYMMDDHHMMSS.
29 Ayvengo
 
29.01.13
11:33
(28) ну знаток, чо :D
30 Aprobator
 
29.01.13
11:35
(29) владею отладчиком и СП со словарем, только и всего )
31 Ayvengo
 
29.01.13
11:36
(30) боюсь, что этого мало :P
32 Reset
 
29.01.13
11:36
(30) Нужно еще владеть умением чиать темы ;)
33 Reset
 
29.01.13
11:38
+(32) к тому, что в (0) не "20120101", а ""01.01.2012""

+ (25) вообще утверждается что любая строка.

Так что или (6) или (22)
34 Fragster
 
гуру
29.01.13
11:44
вот это:

Дата(ТвояСтрокаНепонятноСЧем + " 00:00:00");

неправильно так как зависит от региональных установок
35 RomaH
 
naïve
29.01.13
11:56
(34) а как уйти от региональных установок?
36 DrShad
 
29.01.13
11:59
(33) в (6) тайный скрытый навык :))))
37 John D
 
29.01.13
12:04
Лучше посимвольно разбирать. А то приедет потом в эту функцию из какого-нибудь файла запись вида, например, "22/7/11" и опаньки!
38 Лефмихалыч
 
29.01.13
12:06
Которые тут предлагают юзать метод Дата(Строка), неправы напрочь. Нельзя эту пакость использовать - она работает адски медленно, в разы медленнее, чем кодом разобрать строку на день, месяц и год, преобразовать это в число и потом использовать Дата(число, число, число).
Сомневающиеся могут сравнить замером производительности
39 DrShad
 
29.01.13
12:10
(38) тут дело не в методе и скорости, а совершенно в другом
40 Лефмихалыч
 
29.01.13
12:12
(39) да ладно! это в чем же?
41 MaxS
 
29.01.13
12:14
На входе текст. Окада текст берётся? На него можно повлиять и провести в однозначный вид, понятный 1С? Если нет, то может ли поменяться формат текста? Если нет, то преобразовать текст с известным форматом в понятный для 1С формат - дело техники.
42 DrShad
 
29.01.13
12:20
(40) в том что на входе произвольный текст, а преобразовать его нужно либо в дату либо в число, а по-сему до [кодом разобрать строку на день, месяц и год, преобразовать это в число и потом использовать Дата(число, число, число)] еще дойти нужно
43 Kreont
 
29.01.13
12:21
(41)+10000, я б тоже сначала дал пинок тому прогу что дает текст непонятно какой непонятно чем заполненый :)
44 DrShad
 
29.01.13
12:44
(43) иногда его уже нет в живых :)))
45 Reset
 
29.01.13
12:58
В копилку вариантов.

Вот так можно преобразовывать без попытки:

   МассивТипов=Новый Массив;
   МассивТипов.Добавить(Тип("Число"));
   МассивТипов.Добавить(Тип("Дата"));
   ОписаниеТипов=Новый ОписаниеТипов(МассивТипов);
   ЧислоИлиДата=ОписаниеТипов.ПривестиЗначение(ИсходнаяСтрока);


Если из строки можно получить дату, будет получена дата, иначе, если возможно получить число, будет получено число, иначе получим Неопределено
46 Ayvengo
 
29.01.13
13:09
(45) вот он красивый вариант ;) Респект ;)
47 Aprobator
 
29.01.13
13:27
(33) я собственно не по теме, а по поводу товарища из (5).
48 Aprobator
 
29.01.13
13:29
(45) интересно только "01.01.2012" взлетит ли в данном случае. Насколько я помню, дата не проходила данным способом. Все равно ее подготавливать приходилось.
49 Reset
 
29.01.13
13:39
(38)
"Сомневающиеся могут сравнить замером производительности"




Стр="20120101";

Использовал цикл на 1 млн итераций


Вариант "она работает адски медленно, в разы медленнее"

Дата=Дата(Стр);    //    5,595063 сек


Вариант: "кодом разобрать строку на день, месяц и год, преобразовать это в число и потом использовать Дата(число, число, число)."

Дата=Дата(Число(Лев(Стр,4)),Число(Сред(Стр,5,2)),Число(Прав(Стр,2))); // 6,332702


ну и до кучи

Дата=Дата(Лев(Стр,4),Сред(Стр,5,2),Прав(Стр,2));  // 5,434488
50 Reset
 
29.01.13
13:40
(48) Не взлетит, конечно. Дополнительной гибкости в форматах такой вариант не дает
51 Reset
 
29.01.13
13:41
(47) А, я просто Юный 1С как ник не воспринял. Тогда да, твой комент понятен ;)
52 Ayvengo
 
29.01.13
13:41
(49) еще условие на количество символов? :)
53 Reset
 
29.01.13
13:42
(52) Это детали, мне утверждение из (38) "в разы медленнее" показалось любопытным
54 Ayvengo
 
29.01.13
13:44
(53) ну с ним еще на долю секунд дольше делаться будет :)
55 Aprobator
 
29.01.13
13:47
(49) осталось еще проверит вариант ТипДата.ПривестиЗначение(...).
56 Ayvengo
 
29.01.13
13:48
(49) кстати в таком варианте, может все-равно вылететь ошибка, допустим месяц 13 ;) Так что вариант с перебором - это не вариант ...
57 Aprobator
 
29.01.13
13:49
Как то так я в свое время делал:

ТипДата = Новый ОписаниеТипов("Дата");
ЗначениеДата = ТипДата.ПривестиЗначение(ЗначениеДляПреобразования);
58 Reset
 
29.01.13
13:54
(55) Он заведомо медленней будет. У него плюс в том что не будет исключения при ошибке в формате.
59 samozvanec
 
29.01.13
13:58
(58) в разы медленнее?)
60 Aprobator
 
29.01.13
13:58
(58) это очевидно? )))
61 Reset
 
29.01.13
14:00
+ (58) 7,344334 сек в тех же условиях

(разумеется, создание описания типа (простого, с одной датой) - вне цикла)
62 iceman2112
 
29.01.13
14:01
эх были бы регулярный варажения
63 DrShad
 
29.01.13
14:57
(62) а они есть
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший