В версии 8.3 уже заложен функционал, который преобразует строку любого формата в дату, но в 8.2 имеется ряд ограничений. В статье я приведу функцию для 1с 8.2, которая выполняет преобразование строки в дату и/или время
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
Функция ПреобразоватьВДату(ИсхСтр) Стр = СокрЛП(ИсхСтр); ЭтоДата = Найти(Стр,".") или Найти(Стр,"-") или Найти(Стр,"/"); ЭтоВремя = Найти(Стр,":"); Если Не ЭтоДата и Не ЭтоВремя Тогда Возврат Дата(1,1,1,1,1,1); КонецЕсли; МассивДат = Новый Массив; МассивВремени = Новый Массив; врСтр = ""; Для а = 1 По СтрДлина(Стр) Цикл Если (Сред(Стр,а,1) = "." или Сред(Стр,а,1) = "-" или Сред(Стр,а,1) = "/") и ЭтоДата Тогда МассивДат.Добавить(Число(врСтр)); врСтр = ""; ИначеЕсли Сред(Стр,а,1) = ":" и Не ЭтоДата Тогда МассивВремени.Добавить(Число(врСтр)); врСтр = ""; ИначеЕсли Сред(Стр,а,1) = " " или КодСимвола(Сред(Стр,а,1))<48 или КодСимвола(Сред(Стр,а,1))>57 Тогда Если МассивДат.Количество()>0 и МассивДат.Количество()<3 и врСтр <> "" Тогда МассивДат.Добавить(Число(врСтр)); КонецЕсли; ЭтоДата = Ложь; врСтр = ""; Иначе врСтр = врСтр + Сред(Стр,а,1); КонецЕсли; КонецЦикла; Если МассивВремени.Количество()>0 и МассивВремени.Количество()<3 и врСтр <> "" Тогда МассивВремени.Добавить(Число(врСтр)); ИначеЕсли МассивДат.Количество()>0 и МассивДат.Количество()<3 и врСтр <> "" Тогда МассивДат.Добавить(Число(врСтр)); КонецЕсли; врДень = 0; врМесяц = 0; врГод = 0; Для Каждого дСтр из МассивДат Цикл Если врДень <> 0 и врМесяц <> 0 Тогда врГод = дСтр; ИначеЕсли врГод <> 0 и врМесяц <> 0 Тогда врДень = дСтр; ИначеЕсли врГод <> 0 или врДень <> 0 Тогда врМесяц = дСтр; КонецЕсли; Если дСтр/100>1 Тогда врГод = дСтр; КонецЕсли; Если врГод = 0 и врДень = 0 Тогда врДень = дСтр; КонецЕсли; КонецЦикла; врЧас = 0; врМин = 0; врСек = 0; Для Каждого вСтр из МассивВремени Цикл Если врЧас = 0 Тогда врЧас = вСтр; ИначеЕсли врМин = 0 Тогда врМин = вСтр; ИначеЕсли врСек = 0 Тогда врСек = вСтр; КонецЕсли; КонецЦикла; Если врГод = 0 или врГод > 9999 Тогда врГод = 1; ИначеЕсли врГод/100<1 Тогда врГод = врГод + 2000; КонецЕсли; Если врМесяц = 0 или врМесяц>12 Тогда врМесяц = 1; КонецЕсли; Если врДень = 0 или врДень>31 Тогда врДень = 1; КонецЕсли; Если врЧас>23 Тогда врЧас = 0; КонецЕсли; Если врМин>59 Тогда врМин = 0; КонецЕсли; Если врСек>59 Тогда врСек = 0; КонецЕсли; Возврат Дата(врГод,врМесяц,врДень,врЧас,врМин,врСек); КонецФункции |
Функцию можно вызывать и в купе с методом АвтоПодборТекста. Она различает почти все возможные форматы записи даты и времени.
2 комментария
[…] к своей же статье я сделал эти две замечательные функции. Вот […]
В языке запросов отсутствуют встроенные функции преобразования одних типов данных в другие, например, строк в числа или даты и наоборот. В работе Выразить строку как число и строку как дату в запросе были предложены достаточно компактные способы преобразований из строки . Теперь дошла очередь до обратных к ним преобразований в строку .