Функция преобразования СТРОКИ в ДАТУ

29.11.11

Разработка - Универсальные функции

Функция преобразование всяких вариантов строк в дату. Искал, но не нашел на сайте.
Преобразовывает СТРОКИ вида "01/10/13","01-10-2013","10,13","10.13","01.03.2013 0:00:00" к типу ДАТА
Может, кому пригодится.
В обработке используется стандартная функция разложить строку, указываю ее ниже.

	 ФункцияПолучитьДатуИзСтроки(Стр) 

	     Д = Дата("00010101000000");

	     ЕслиПустаяСтрока(Стр) Тогда
	         Возврат Д;
	     КонецЕсли;

	     ЕслиНайти(Стр,".") > 0 Тогда

	         Если Найти(Стр,":") > 0 И Найти(Стр," ") > 0 Тогда 
	             М = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр," ");
	             ВозвратПолучитьДатуИзСтроки(М[0]);
	         КонецЕсли;

	         М = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр,".");

	     ИначеЕсли Найти(Стр,"/")>0 Тогда

	         М = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр,"/");

	     ИначеЕсли Найти(Стр,",")>0 Тогда

	         М = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр,",");

	     ИначеЕсли Найти(Стр,"-")>0 Тогда

	         М = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр,"-");

	     КонецЕсли; 

	     Попытка

	         Если М.Количество() = 3 Тогда //"01.02.13" или "01.02.2013"
	             Год = ?(СтрДлина(М[2]) = 2,2000 + М[2],М[2]);
	             Д = Дата(Год,М[1],М[0]);
	         ИначеЕсли М.Количество() = 2 Тогда //"02.13" или "02.2013";
	             Год = ?(СтрДлина(М[1]) = 2,2000 + М[1],М[1]);
	             Д = Дата(Год,М[0],1);
	         КонецЕсли;

	     Исключение
	     КонецПопытки; 

	     ВозвратД; 

	 КонецФункции

	 // Функция "расщепляет" строку на подстроки, используя заданный
	 //        разделитель. Разделитель может иметь любую длину.
	 //        Если в качестве разделителя задан пробел, рядом стоящие пробелы
	 //        считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
	 //        игнорируются.
	 //        Например,
	 //        РазложитьСтрокуВМассивПодстрок(",ку,,,му", ",") возвратит массив значений из пяти элементов,
	 //        три из которых - пустые строки, а
	 //        РазложитьСтрокуВМассивПодстрок(" ку   му", " ") возвратит массив значений из двух элементов
	 //
	 //    Параметры:
	 //        Стр -  строка, которую необходимо разложить на подстроки.
	 //                        Параметр передается по значению.
	 //        Разделитель -     строка-разделитель, поумолчанию - запятая.
	 //
	 //
	 //    Возвращаемое значение:
	 //        массив значений, элементы которого - подстроки
	 //

	 ФункцияРазложитьСтрокуВМассивПодстрок(ЗначСтр, Разделитель = ",") Экспорт

	     МассивСтрок = НовыйМассив();

	     ЕслиРазделитель = " " Тогда

	         Стр = СокрЛП(Стр);

	         Пока Истина Цикл

	             Поз = Найти(Стр,Разделитель);

	             Если Поз = 0 Тогда
	                 МассивСтрок.Добавить(Стр);
	                 Возврат МассивСтрок;
	             КонецЕсли;

	             МассивСтрок.Добавить(Лев(Стр,Поз - 1));
	             Стр = СокрЛ(Сред(Стр,Поз));

	         КонецЦикла;

	     Иначе

	         ДлинаРазделителя = СтрДлина(Разделитель);

	         Пока Истина Цикл

	             Поз = Найти(Стр,Разделитель);

	             Если Поз = 0 Тогда
	                 МассивСтрок.Добавить(Стр);
	                 Возврат МассивСтрок;
	             КонецЕсли;

	             МассивСтрок.Добавить(Лев(Стр,Поз - 1));
	             Стр = Сред(Стр,Поз + ДлинаРазделителя);

	         КонецЦикла;
	     КонецЕсли;

	 КонецФункции

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    20147    dimanich70    81    

144

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    4091    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    18086    atdonya    24    

56

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    5503    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14745    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3581    56    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18480    171    sapervodichka    112    

135
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
0. maxtomsk 158 30.09.11 09:23 Сейчас в теме
Функция преобразование всяких вариантов строк в дату. Искал, но не нашел на сайте.
Преобразовывает СТРОКИ вида "01/10/13","01-10-2013","10,13","10.13","01.03.2013 0:00:00" к типу ДАТА
Может, кому пригодится.
В обработке используется стандартная функция разложить строку, указываю ее ниже.



Перейти к публикации

1. dv2008 30.09.11 13:40 Сейчас в теме
неплохо, только можно было бы разделитель сделать параметром, и код бы упростился
2. maxtomsk 158 30.09.11 15:39 Сейчас в теме
(1) dv2008, Я уже думал, но у меня с разных мест идет дата в разных форматах, поэтому чтоб не гадать, поставил все на проверку...
karnilaev; +1 Ответить
3. tdr1225 37 06.10.11 10:53 Сейчас в теме
(1),(2)
по поводу параметра-разделителя
а он нужен?
попробуйте такое:
Код
ст = "01-10-2013";
сообщить(Дата(ст)); 
Показать полностью

попробуйте вместо минуса использовать другой символ, букву
попробуйте разные символы, напр., "01{10}2013"
будете приятно удивлены
4. maxtomsk 158 29.11.11 04:12 Сейчас в теме
(3) tdr1225,
попробовал Ваш код, у меня выдает ошибку. что с фигурными скобками, что с минусом:
{(2)}: Преобразование значения к типу Дата не может быть выполнено
5. tdr1225 37 29.11.11 08:10 Сейчас в теме
6. abc2000 83 30.11.11 05:13 Сейчас в теме
Побробуйте, передать строку 01.10/2013 или 01-10/2011. Ваша Функция не совершена.
16. Nata 8 21.05.13 01:46 Сейчас в теме
Спасибо. Очень пригодилась.
(6) Хочу сказать, что вся 1С далека от совершенства.
Согласна с (7) - Отдельное спасибо за открытость.
simuljakr; +1 Ответить
48. kotov2000 5 14.02.20 11:56 Сейчас в теме
(6) А где такие даты встречаются?
7. dumal 30.11.11 17:04 Сейчас в теме
Как правило, необходимость перевода строки в дату возникает при загрузке информации откуда-нибудь (например, из текстового файла, или Экселя). В таком случае, написать парсер для даты совсем несложно - потому что все строки одного вида. Таким образом, универсальность здесь оказывается не то чтобы лишней, но может заметно замедлить загрузку. Тем не менее, безусловно, полезная вещь. Отдельное спасибо за открытость
8. askorn 20 01.12.11 09:19 Сейчас в теме
вот пример с меньшей функциональностью и с меньшим временем выполнения:

Функция ДатаИзСтроки10(стрДата) экспорт // "01.12.2011" преобразует в '01.12.2011 0:00:00'
Попытка
возврат Дата(Сред(стрДата,7,4)+Сред(стрДата,4,2)+Лев(стрДата,2))
Исключение
возврат '00010101'
КонецПопытки;
КонецФункции // ДатаИзСтроки10()
link_l; LeXXeR; TSSV; Amara; Alalexey; imbaZeratul; enoty200shtyk; denis83; shunk; Tash.B; Idris1204; Happy_yahoo; NCHRobert; by_1Cnik; elephant_x; ASV085; s0u1; Неопределено; nekit_rdx; DataReducer; simgo83; eugenek27; stroga; Irwin; PSKMOL; user721122; Hamma; edesyatov; paxanb; N2; rayastar; Jon2011; surr; codename-s; b00ker; wau8824ru; CatNotDog; Alex_IT; freeek; PhoenixAOD; Somebody1; jobkostya1c_ERP; SP2000; PokerFace; Brook; klinval; Doomino; angelochekss666; Gremlin; illUMI; Km91; MonteCriZto; bugagashenka; anig99; sanfoto; verad; TeploU; killovolt; +58 Ответить
50. Stylo 07.09.20 16:20 Сейчас в теме
(8) Можно вместо "Сред(стрДата,7,4)" Использовать "Прав(стрДата, 4)". И тогда время выполнения уменьшится еще сильнее.
9. SERJ_1CC 50 06.12.11 09:50 Сейчас в теме
10. finder10 16.12.11 19:41 Сейчас в теме
Только что преогромно выручил. Преогромное же спасибо. Нет, вернее, СПАСИБО!
11. hr7095 54 20.01.12 12:13 Сейчас в теме
Спасибо, пригодилось. Сэкономил время.
12. petrovaUL 01.02.12 12:52 Сейчас в теме
Спасибо. Пригодилось.
13. ponaroshku 24.07.12 05:15 Сейчас в теме
14. Созинов 09.08.12 14:08 Сейчас в теме
Спасибо, интересная реализация, жаль время не учитывает.
15. ula1c 12.03.13 12:46 Сейчас в теме
Спасибо. Делала импорт отсканированных Товарных чеков из EXCEL в авансовый отчет. Для этого сначала в EXCEL дату входящего документа преобразовывала из формата Текст в формат Дата, а затем в формат число. Далее при импорте в 1с необходимо было преобразовать это число-дату в дату 1с - при этом учесть и то, что в EXCEL исчисление даты начинается с 01.01.1900 и то, что в EXCEL 1900год - высокосный год. Выглядело это так:
ДатаВходящегоДокумента = Дата('19000101')+(86400*(Число(ДатаВходящегоДокумента)-2)
с вашей функцией как-то лаконичней:
ДатаВходящегоДокумента = ПолучитьДатуИзСтроки(ДатаВходящегоДокумента)
К тому же избавилась от ненужных преобразований даты в EXCEL .
17. Sasha255n 04.07.13 15:05 Сейчас в теме
Спсибо Долго рассказывать для чего но пригодилась
18. _n26__ 12.08.13 08:04 Сейчас в теме
Большое спасибо! Очень нужная и полезная вещица! Пригодилась вовремя! Спасибо!
19. Lo1jke 20.08.13 19:48 Сейчас в теме
Даже не пришлось думать, спасибо. Очень помогает постоянно.
20. Kaavan 97 09.09.13 05:35 Сейчас в теме
21. Kaavan 97 09.09.13 05:37 Сейчас в теме
Понадобилось доработать функцию, т.к. требовалось разобрать дату с буржуйским форматом "mm/dd/yyyy".
Вот моя версия, с указанием формата даты:
Функция ПолучитьДатуИзСтроки(Стр, ФорматДаты="")
    Д = Дата("00010101000000");
    Если ПустаяСтрока(Стр) Тогда
        Возврат Д;
	КонецЕсли;
	
	Если Не ПустаяСтрока(ФорматДаты) Тогда
	    Если Найти(ФорматДаты,".")>0 Тогда
	        Если Найти(ФорматДаты,":")>0 И Найти(ФорматДаты," ")>0 Тогда 
	            МассивФормат = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ФорматДаты," ");
	            Возврат ПолучитьДатуИзСтроки(МассивФормат[0]);
	        КонецЕсли;
	        МассивФормат = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ФорматДаты,".");
	    ИначеЕсли Найти(ФорматДаты,"/")>0 Тогда
	        МассивФормат = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ФорматДаты,"/");
	    ИначеЕсли Найти(ФорматДаты,",")>0 Тогда
	        МассивФормат = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ФорматДаты,",");
	    ИначеЕсли Найти(ФорматДаты,"-")>0 Тогда
	        МассивФормат = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ФорматДаты,"-");
	    КонецЕсли;
        Если МассивФормат.Количество()<>3 Тогда
			ФорматДаты = "";
        КонецЕсли;
	КонецЕсли;

    Если Найти(Стр,".")>0 Тогда
        Если Найти(Стр,":")>0 И Найти(Стр," ")>0 Тогда 
            МассивДата = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Стр," ");
            Возврат ПолучитьДатуИзСтроки(МассивДата[0]);
        КонецЕсли;
        МассивДата = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Стр,".");
    ИначеЕсли Найти(Стр,"/")>0 Тогда
        МассивДата = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Стр,"/");
    ИначеЕсли Найти(Стр,",")>0 Тогда
        МассивДата = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Стр,",");
    ИначеЕсли Найти(Стр,"-")>0 Тогда
        МассивДата = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Стр,"-");
    КонецЕсли;

    Попытка
		Если МассивДата.Количество()=3 Тогда //"01.02.13" или "01.02.2013"
			Если ФорматДаты <> "" Тогда
				Для й = 0 ПО МассивФормат.Количество()-1 Цикл
					ЭлементФормата = МассивФормат[й];
					Если Найти(ЭлементФормата, "д")>0 ИЛИ Найти(ЭлементФормата, "Д")>0 ИЛИ Найти(ЭлементФормата, "D")>0 ИЛИ Найти(ЭлементФормата, "d")>0 Тогда
						День = Число(МассивДата[й]);
					КонецЕсли;
					Если Найти(ЭлементФормата, "м")>0 ИЛИ Найти(ЭлементФормата, "М")>0 ИЛИ Найти(ЭлементФормата, "M")>0 ИЛИ Найти(ЭлементФормата, "m")>0 Тогда
						Месяц = Число(МассивДата[й]);
					КонецЕсли;
					Если Найти(ЭлементФормата, "г")>0 ИЛИ Найти(ЭлементФормата, "Г")>0 ИЛИ Найти(ЭлементФормата, "Y")>0 ИЛИ Найти(ЭлементФормата, "y")>0 Тогда
						Год = МассивДата[й];
						Если СтрДлина(Год)=2 Тогда
							Если Число(Год) > 50 Тогда
								Год = 1900 + Год;
							Иначе	
								Год = 2000 + Год;
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;
				КонецЦикла;
            	Д = Дата(Год, Месяц, День);
			Иначе
				Год = ?(СтрДлина(МассивДата[2])=2,2000+МассивДата[2],МассивДата[2]);
           		Д = Дата(Год, МассивДата[1], МассивДата[0]);
			КонецЕсли;			
        ИначеЕсли МассивДата.Количество()=2 Тогда //"02.13" или "02.2013";
            Год = ?(СтрДлина(МассивДата[1])=2,2000+МассивДата[1],МассивДата[1]);
            Д = Дата(Год,МассивДата[0],1);
        КонецЕсли;
    Исключение
    КонецПопытки;

    Возврат Д;
КонецФункции
Показать


upd:
Для годов больше 50 (94, например) плюсуется сдвиг 1900, иначе 2000
talych; b00ker; +2 Ответить
22. ITAlex 26.09.13 17:54 Сейчас в теме
Вот спасибо!
а если в переданной строке заменить разделитель на некий стандартный (напр. "%"), тогда код можно сделать компактнее, т.е. только для стандартного разделителя.
23. JLaikova 01.10.13 15:58 Сейчас в теме
Спасибо! Помогла очень функция!!!!
24. victor_k 95 11.10.13 07:42 Сейчас в теме
Спасибо. свою делать лень. пригодилась.
25. ssa 21.11.13 14:25 Сейчас в теме
Спасибо, пригодилось.
26. ololoanonim 3 05.05.14 07:05 Сейчас в теме
Спасибо. Оооооочень полезная вещь.
27. kentavr27 97 10.07.14 15:08 Сейчас в теме
Может кому понадобится без длинных функций... так вот, как ни странно, но работает такая конструкция:
Дата("03.06.2014 0:15:55"); =>  03.06.2014 0:15:55	//Тип("Дата")

равно как
Дата("3.6.2014 0:15:55"); =>  03.06.2014 0:15:55	//Тип("Дата")
perepetulichka; Manticor; freeek; flyer; fvr2000; GetNight; AndreykO; madfox; CeHbKA; +9 Ответить
30. AndreykO 8 12.01.15 08:22 Сейчас в теме
(27) kentavr27, при чём Дата("03.06.2014"); не сработает, вызовет исключение, а Дата("03.06.2014 00:00:00"); - сработает. Хотя это и странно, ведь в СП именно год на первом месте...
max_zhilin; +1 Ответить
28. sanja 153 22.09.14 09:24 Сейчас в теме
Спасибо, пригодилась функция.
29. Vodoley 2 10.12.14 14:44 Сейчас в теме
а нет у кого варианта преобразовать из строки вида 06 ноября 2014 г.
а то ничего путного в голову не приходит: придется все имена месяцев перебирать (
31. ildarovich 7930 12.01.15 09:14 Сейчас в теме
(29) Vodoley, вот тут Минимализмы в примере под номером 13 есть нужное вам решение. На всякий случай приведу его здесь полностью
Функция СтрокаВДату(Знач ФорматДаты, Знач Дано, Ошибка = Ложь) Экспорт 
    Попытка 
        ё = Формат('00010101', "ДФ=" + ФорматДаты) // - необязательная проверка первого правильности параметра 
    Исключение 
        Ошибка = Истина; 
        Возврат '00010101' 
    КонецПопытки; 
    Ч = Новый Соответствие; 
    Для ё = 1 По СтрДлина(ФорматДаты) + 7 Цикл 
        Ч[Сред(ФорматДаты + "dMyHhms", ё, 1)] = 0    // - инициализация частей даты 
    КонецЦикла; 
    Для ё = 1 По 12 Цикл 
        Дано = СтрЗаменить(Дано, Формат(Дата(1, ё, 1), "ДФ=MMММ"), Формат(ё, "ЧЦ=4; ЧВН=")); // - замена названий месяцев числами 
        Дано = СтрЗаменить(Дано, Формат(Дата(1, ё, 1), "ДФ=MMМ" ), Формат(ё, "ЧЦ=3; ЧВН=")) 
    КонецЦикла; 
    Для ё = 1 По СтрДлина(ФорматДаты) Цикл 
        Ч[Сред(ФорматДаты, ё, 1)] = 10 * Ч[Сред(ФорматДаты, ё, 1)] + Найти("123456789", Сред(Дано, ё, 1)); // - накопление частей даты 
        Ошибка = Ошибка ИЛИ Найти("dMyHhms", Сред(ФорматДаты, ё, 1)) И НЕ Найти("0123456789", Сред(Дано, ё, 1)) // - необязательная проверка на цифры 
    КонецЦикла; 
    Ч["y"] = Ч["y"] + ?(Ч["y"] < 50, 2000, ?(Ч["y"] < 100, 1900, 0)); // - дополнение двух цифр года до четырех 
    Попытка 
        Возврат Дата(Ч["y"], Ч["M"], Ч["d"], Ч["H"] + Ч["h"], Ч["m"], Ч["s"]) 
    Исключение 
        Ошибка = Истина; 
        Возврат '00010101' 
    КонецПопытки 
КонецФункции
Показать
Это универсальная функция - работает с любым форматом даты. В том числе с тем, где месяц написан прописью. Дни недели разве что словами нельзя (в данной реализации) называть.
Cmapnep; as7bs; simuljakr; dour-dead; AllexSoft; Stivens; Irwin; 🅵🅾️🆇; philya; DoctorRoza; invertercant; +11 Ответить
33. DrBlack 24 03.12.15 11:57 Сейчас в теме
(31) ildarovich, с любым форматом даты как раз-таки не работает )
Уж не спрашивайте меня о специфике, но в общем, я пытался сопротивляться... :)

Доработал предложенный Вами алгоритм для формата данных без даты (только время), пример формата: "ДФ=HH:mm:ss"

Функция СтрокаВДату(Знач ФорматДаты, Знач Дано, Ошибка = Ложь) 
	ФорматДаты = СтрЗаменить(ФорматДаты, "ДФ=",  "");
	Попытка 
        ё = Формат('00010101', "ДФ=" + ФорматДаты); // - необязательная проверка первого правильности параметра 
    Исключение 
        Ошибка = Истина; 
        Возврат '00010101'; 
	КонецПопытки;
	ЭтоВремяБезДаты = Найти(ФорматДаты, "y") = 0;
	Ч = Новый Соответствие; 
    Для ё = 1 По СтрДлина(ФорматДаты) + 7 Цикл 
        Ч[Сред(ФорматДаты + "dMyHhms", ё, 1)] = 0;    // - инициализация частей даты 
    КонецЦикла; 
    Для ё = 1 По 12 Цикл 
        Дано = СтрЗаменить(Дано, Формат(Дата(1, ё, 1), "ДФ=MMММ"), Формат(ё, "ЧЦ=4; ЧВН=; ЧГ=0")); // - замена названий месяцев числами 
        Дано = СтрЗаменить(Дано, Формат(Дата(1, ё, 1), "ДФ=MMМ" ), Формат(ё, "ЧЦ=3; ЧВН=; ЧГ=0")); 
    КонецЦикла; 
    Для ё = 1 По СтрДлина(ФорматДаты) Цикл 
        Ч[Сред(ФорматДаты, ё, 1)] = 10 * Ч[Сред(ФорматДаты, ё, 1)] + Найти("123456789", Сред(Дано, ё, 1)); // - накопление частей даты 
        Ошибка = Ошибка ИЛИ Найти("dMyHhms", Сред(ФорматДаты, ё, 1)) И НЕ Найти("0123456789", Сред(Дано, ё, 1)); // - необязательная проверка на цифры 
	КонецЦикла;
	Если НЕ ЭтоВремяБезДаты Тогда
    		Ч["y"] = Ч["y"] + ?(Ч["y"] < 50, 2000, ?(Ч["y"] < 100, 1900, 0)); // - дополнение двух цифр года до четырех 
	Иначе
		Ч["y"] = 1;
		Ч["M"] = 1;
		Ч["d"] = 1;
	КонецЕсли;
    Попытка 
        Возврат Дата(Ч["y"], Ч["M"], Ч["d"], Ч["H"] + Ч["h"], Ч["m"], Ч["s"]); 
    Исключение 
        Ошибка = Истина; 
        Возврат '00010101'; 
    КонецПопытки 
КонецФункции
Показать
AllexSoft; +1 Ответить
34. ildarovich 7930 03.12.15 14:36 Сейчас в теме
(33) DrBlack, мне самому решение задачи №13 не очень нравится. Я его привел "за компанию" с другими комментариями. Не для того, чтобы использовать в готовом виде, а для того, чтобы можно было извлечь приемы использования соответствия в этой задаче.
52. simuljakr 203 21.05.21 19:34 Сейчас в теме
(31)

У меня не прокатило...
Вот так написал:

СтрокаВДату("""дд ММММ гггг 'г.' ЧЧ:мм:сс""","12 мая 2021 г. 8:49:22",Ложь)


возвращает пустую дату.......

Посмотрел код - там проблема в том, что я передаю название месяца в родительном падеже, а ваша функция рассчитана на именительный...
53. simuljakr 203 21.05.21 20:52 Сейчас в теме
(31) Написал вот так:

Функция СтрокаВДату(Дано) Экспорт 
	Дано = СтрЗаменить(Дано, ":"," ");  
	Дано = СтрЗаменить(Дано, "января","01");  
	Дано = СтрЗаменить(Дано, "февраля", "02"); 
	Дано = СтрЗаменить(Дано, "марта", "03"); 
	Дано = СтрЗаменить(Дано, "апреля",  "04");
	Дано = СтрЗаменить(Дано, "мая",  "05"); 
	Дано = СтрЗаменить(Дано, "июня",  "06"); 
	Дано = СтрЗаменить(Дано, "июля",  "07"); 
	Дано = СтрЗаменить(Дано, "августа", "08"); 
	Дано = СтрЗаменить(Дано, "сентября", "09"); 
	Дано = СтрЗаменить(Дано, "октября",  "10"); 
	Дано = СтрЗаменить(Дано, "ноября",  "11"); 
	Дано = СтрЗаменить(Дано, "декабря",  "12"); 
	
	МассивДаты=СтрРазделить(Дано," ");

	Попытка 
        Возврат Дата(""+МассивДаты[2]+МассивДаты[1]+МассивДаты[0]+?(СтрДлина(МассивДаты[4])=1,""+"0"+МассивДаты[4],МассивДаты[4])+МассивДаты[5]+МассивДаты[6]); 
    Исключение 
        Возврат Дата('00010101'); 
    КонецПопытки 
КонецФункции
Показать


Не особо универсально конечно, но работает ))
32. Mart 106 19.08.15 12:09 Сейчас в теме
А мне подошел вот такой вариант:

ДатаСтрокой = "2015-08-22";
ДатаДатой = Дата(СтрЗаменить(ДатаСтрокой, "-", "")); // 22.08.2015 0:00:00

ну, то есть сначала надо вырезать все разделители и получить непрерывный набор цифр:

Дата("20150822110645") равносильно 22.08.2015 11:06:45
35. Winston 29.01.16 10:22 Сейчас в теме
Спасибо. Очень помогло. Всё работает, просто замечательно.
36. AndreykO 8 11.03.16 06:46 Сейчас в теме
Спасибо. Очень помогло. Всё работает.
37. dmpolik 04.08.16 16:06 Сейчас в теме
Делал себе функцию для даты из exel... функция не универсальная, для решения локальной задачи.

Функция ПолучитьДату(тДата)
	
		ТаблицаМесяцев = Новый ТаблицаЗначений;
		ТаблицаМесяцев.Колонки.Добавить("Номер");
		ТаблицаМесяцев.Колонки.Добавить("Написание");
		нстр = ТаблицаМесяцев.Добавить();
		Нстр.Номер = "01";
		Нстр.Написание = "ЯНВРАРЯ";
		нстр = ТаблицаМесяцев.Добавить();
		Нстр.Номер = "02";
		Нстр.Написание = "ФЕВРАЛЯ";
		нстр = ТаблицаМесяцев.Добавить();
		Нстр.Номер = "03";
		Нстр.Написание = "МАРТА";
		нстр = ТаблицаМесяцев.Добавить();
		Нстр.Номер = "04";
		Нстр.Написание = "АПРЕЛЯ";
		нстр = ТаблицаМесяцев.Добавить();
		Нстр.Номер = "05";
		Нстр.Написание = "МАЯ";
		нстр = ТаблицаМесяцев.Добавить();
		Нстр.Номер = "06";
		Нстр.Написание = "ИЮНЯ";
		нстр = ТаблицаМесяцев.Добавить();
		Нстр.Номер = "07";
		Нстр.Написание = "ИЮЛЯ";
		нстр = ТаблицаМесяцев.Добавить();
		Нстр.Номер = "08";
		Нстр.Написание = "АВГУСТА";
		нстр = ТаблицаМесяцев.Добавить();
		Нстр.Номер = "09";
		Нстр.Написание = "СЕНТЯБРЯ";
		нстр = ТаблицаМесяцев.Добавить();
		Нстр.Номер = "10";
		Нстр.Написание = "ОКТЯБРЯ";
		нстр = ТаблицаМесяцев.Добавить();
		Нстр.Номер = "11";
		Нстр.Написание = "НОЯБРЯ";
		нстр = ТаблицаМесяцев.Добавить();
		Нстр.Номер = "12";
		Нстр.Написание = "ДЕКАБРЯ";
        	
	
		тДата 		= СокрЛП(СтрЗаменить(тДата,"г."," "));
		ДоПробела  	= Найти(тДата," ");
		тЧисло 		= СокрЛП(Лев(тДата,ДоПробела));
		тГод 		= СокрЛП(Прав(тДата,4));
		ДлинаСтроки = СтрДлина(тДата);
		МесяцСтрока = Лев(тДата,ДлинаСтроки-4);
		ДлинаМесяца = СтрДлина(МесяцСтрока);
		МесяцСтрока = СокрЛП(Прав(МесяцСтрока,ДлинаМесяца-2));
		СтрТабл = ТаблицаМесяцев.Найти(ВРег(МесяцСтрока),"Написание");
		тМесяц = СтрТабл.Номер;
		Дат = Дата(тГод+тМесяц+тЧисло);

		
		Возврат Дат;
	
КонецФункции	
Показать
Светлана5291; +1 Ответить
46. altmf 49 04.10.19 04:07 Сейчас в теме
(37)Тема давно уже прошла, но все же. Воспользовался вашей функцией, спасибо, сэкономил несколько минут. В ней опечатка в слове "января" и некорректно распознаются числа, меньшие 10 т..к отсутствуют лидирующие нули.
Исправленный вариант
38. dmpolik 04.08.16 16:11 Сейчас в теме
забыл дата формата "27 ноября 2015 г."
40. ivprovotorov 52 27.03.17 07:57 Сейчас в теме
Спасибо. Мне в обработку загрузки из excel вполне пришлось к месту
41. m.s.moiseev 26.10.17 20:23 Сейчас в теме
Функция ДатаИзСтроки(СтрокаДата)
	
	Возврат Дата(
					Сред(СтрокаДата,7,4) 
					+ Сред(СтрокаДата,4,2) 
					+ Лев(СтрокаДата,2) 
					+ Сред(СтрокаДата,12,2) 
					+ Сред(СтрокаДата,15,2) 
					+ Сред(СтрокаДата,18,2)
				);
				
КонецФункции
Показать
42. Srv1313 11 04.10.18 11:14 Сейчас в теме
Функция СтрокаВДату(Знач ДатаСтрока)  
	
	ОписаниеТипа = Новый ОписаниеТипов("Дата");
	Результат    = ОписаниеТипа.ПривестиЗначение(ДатаСтрока);
	
	Если ЗначениеЗаполнено(Результат) Тогда
		Возврат Результат;                                 	
	КонецЕсли;
	
	ПозицияПробела = СтрНайти(ДатаСтрока, " ", НаправлениеПоиска.СНачала);
	Если ПозицияПробела > 0 Тогда
		ДатаСтрока = Лев(ДатаСтрока, ПозицияПробела - 1);
	КонецЕсли;
		
	ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, ".", ""));
	ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, ",", ""));
	ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, ":", ""));
	ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, "/", ""));
	ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, "-", ""));

	ДатаСтрока = Сред(ДатаСтрока, 5) + Сред(ДатаСтрока, 3, 2) + Лев(ДатаСтрока, 2);
	Если СтрДлина(ДатаСтрока) = 6 Тогда
		ДатаСтрока = "20" + ДатаСтрока;
	КонецЕсли;
	
	//ОписаниеТипа = Новый ОписаниеТипов("Дата");
	Результат    = ОписаниеТипа.ПривестиЗначение(ДатаСтрока);
	
	Возврат Результат;
	
КонецФункции
Показать
43. Stivens 35 30.06.19 00:06 Сейчас в теме
В замечательном примере вот этот кусок не работает: Формат(Дата(1, ё, 1), "ДФ=MMММ")
Потому, что для пустой даты название месяца не вернет, у меня возвращает "" (пустую строку). В синтакс помощнике сказано, что должен возвращать строку "Пустая дата".
И даже если написать Дата(2,ё,1), тоже не подходит, т.к. название месяца идет в именительном падеже ("Январь"), а в формате "ДЛФ = DD" месяцы идут в родительном ("Января").
Но логика понятна, буду с утра разбираться. Сервак отрубился удаленный.
44. Stivens 35 30.06.19 23:06 Сейчас в теме
В общем сделал так Сред(Формат(Дата(2019, ё, 10), "ДФ=ddMMMM"), 3)
45. max_zhilin 26.07.19 11:22 Сейчас в теме
Для загрузки формата "26.07.2019" сделал просто:
Дата(ДатаСтрокой + " 00:00:00")
dammit666; as7bs; +2 Ответить
47. Bunt47 17.01.20 04:59 Сейчас в теме
Немного переделал:
Попытка
	   СтрокаТЧ.Реквизит9 = Дата(ДатаСтрокой  + " 00:00:00");
	Исключение
	    СтрокаТЧ.Реквизит9 = ДатаТТН;
КонецПопытки;

//	    СтрокаТЧ.Реквизит9 реквизит ТЧ
49. Shulepov-Alexandr 1 17.06.20 00:58 Сейчас в теме
51. Mx00 249 18.12.20 08:50 Сейчас в теме
Выложу и я свою "нетленку" :-)
функция разбирает любые корректные даты
// Функция преобразует строку в дату
//
// Параметры:
//  ДатаСтрокой - строка - дата в любом формате даты https://yandex.ru/support/partnermarket/export/date-format.html
//  АмериканскийФормат - булево - нужно указывать если известно, что дата в таком формате ММ/ДД/ГГГГ
//
// Возвращаемое значение:
//  Значение типа "Дата"
//
Функция ПолучитьДатуИзСтроки(Знач ДатаСтрокой,АмериканскийФормат=Ложь)
	Если ПустаяСтрока(ДатаСтрокой) Тогда
		Возврат Дата("00010101000000");
	КонецЕсли;
	ДатаСтрокой=СокрЛП(СтрЗаменить(ДатаСтрокой,"  "," "));
	
	Если Найти(нРег(ДатаСтрокой),"янв")>0 или
		 Найти(нРег(ДатаСтрокой),"фев")>0 или
		 Найти(нРег(ДатаСтрокой),"мар")>0 или
		 Найти(нРег(ДатаСтрокой),"апр")>0 или
		 Найти(нРег(ДатаСтрокой),"май")>0 или
		 Найти(нРег(ДатаСтрокой),"мая")>0 или
		 Найти(нРег(ДатаСтрокой),"июн")>0 или
		 Найти(нРег(ДатаСтрокой),"июл")>0 или
		 Найти(нРег(ДатаСтрокой),"авг")>0 или
		 Найти(нРег(ДатаСтрокой),"сен")>0 или
		 Найти(нРег(ДатаСтрокой),"окт")>0 или
		 Найти(нРег(ДатаСтрокой),"ноя")>0 или
		 Найти(нРег(ДатаСтрокой),"дек")>0 Тогда // месяц прописью
		// 31 декабря 2013 г.
		// 31 дек 13
		// 31-дек-13
		// декабрь 2013
		// 2013, декабрь
		// 2013, 31 декабря
		ДатаСтрокой=СтрЗаменить(ДатаСтрокой,"г.",""); // 31 декабря 2013 г. -> 31 декабря 2013
		ДатаСтрокой=СтрЗаменить(ДатаСтрокой,"г","");  // 31 декабря 2013 г -> 31 декабря 2013
		ДатаСтрокой=СокрЛП(ДатаСтрокой);
		Если Найти(ДатаСтрокой,",")>0 Тогда // 2013, 31 декабря
			_ЧастиДаты=СтрРазделить(ДатаСтрокой,",");
			ДатаСтрокой=_ЧастиДаты[1]+" "+_ЧастиДаты[0]; // 31 декабря 2013
			ДатаСтрокой=СокрЛП(ДатаСтрокой);
		КонецЕсли;
		ДатаСтрокой=СтрЗаменить(ДатаСтрокой,"-"," "); // 31-дек-13 -> 31 дек 13
		_ЧастиДаты=СтрРазделить(ДатаСтрокой," ");
		Если _ЧастиДаты.Количество()=2 Тогда // декабрь 2013
			_ЧастиДаты.Вставить(0,"01"); // 01 декабрь 2013
		КонецЕсли;
		
		Если нРег(Лев(_ЧастиДаты[1],3))="янв" Тогда
			_ЧастиДаты[1]="01";
		ИначеЕсли нРег(Лев(_ЧастиДаты[1],3))="фев" Тогда
			_ЧастиДаты[1]="02";
		ИначеЕсли нРег(Лев(_ЧастиДаты[1],3))="мар" Тогда
			_ЧастиДаты[1]="03";
		ИначеЕсли нРег(Лев(_ЧастиДаты[1],3))="апр" Тогда
			_ЧастиДаты[1]="04";
		ИначеЕсли нРег(Лев(_ЧастиДаты[1],3))="мая" или нРег(Лев(_ЧастиДаты[1],3))="май"Тогда
			_ЧастиДаты[1]="05";
		ИначеЕсли нРег(Лев(_ЧастиДаты[1],3))="июн" Тогда
			_ЧастиДаты[1]="06";
		ИначеЕсли нРег(Лев(_ЧастиДаты[1],3))="июл" Тогда
			_ЧастиДаты[1]="07";
		ИначеЕсли нРег(Лев(_ЧастиДаты[1],3))="авг" Тогда
			_ЧастиДаты[1]="08";
		ИначеЕсли нРег(Лев(_ЧастиДаты[1],3))="сен" Тогда
			_ЧастиДаты[1]="09";
		ИначеЕсли нРег(Лев(_ЧастиДаты[1],3))="окт" Тогда
			_ЧастиДаты[1]="10";
		ИначеЕсли нРег(Лев(_ЧастиДаты[1],3))="ноя" Тогда
			_ЧастиДаты[1]="11";
		ИначеЕсли нРег(Лев(_ЧастиДаты[1],3))="дек" Тогда
			_ЧастиДаты[1]="12";
		КонецЕсли;
		_Дата=_ЧастиДаты[0]+"."+_ЧастиДаты[1]+"."+_ЧастиДаты[2]; // 31.12.2013
		_Время="00:00:00";
	ИначеЕсли Найти(ДатаСтрокой,"T")>0 Тогда // 31.12.2013T23:59:59.999Z
		_ЧастиДаты=СтрРазделить(ДатаСтрокой,"T");
		_Дата =_ЧастиДаты[0];
		_Время=_ЧастиДаты[1];
		Если Найти(_Время,"+")>0 Тогда // 20130225T182510+03
			_Время=СокрЛП(Лев(_Время,Найти(_Время,"+")-1));
		КонецЕсли;
		Если Найти(_Время,":")=0 Тогда // 20130225T182510
			_Время=Лев(_Время+"000000",6);
			_Время=Сред(_Время,1,2)+":"+Сред(_Время,3,2)+":"+Сред(_Время,5,2);
		ИначеЕсли СтрЧислоВхождений(_Время,":")=1 Тогда // 2013-12-31T23:59
			_Время=_Время+":00";
		КонецЕсли;
	ИначеЕсли Найти(ДатаСтрокой," ")>0 Тогда // 31.12.2013 23:59:59
		_ЧастиДаты=СтрРазделить(ДатаСтрокой," ");
		_Дата =_ЧастиДаты[0];
		_Время=_ЧастиДаты[1];
		Если Найти(_Время,"+")>0 Тогда // 2013/02/25 18:25:10 +03:00
			_Время=СокрЛП(Лев(_Время,Найти(_Время,"+")-1));
		КонецЕсли;
		Если Найти(_Время,":")=0 Тогда // 20130225 182510
			_Время=Лев(_Время+"000000",6);
			_Время=Сред(_Время,1,2)+":"+Сред(_Время,3,2)+":"+Сред(_Время,5,2);
		ИначеЕсли СтрЧислоВхождений(_Время,":")=1 Тогда // 2013-12-31 23:59
			_Время=_Время+":00";
		КонецЕсли;
	Иначе
		_Дата =ДатаСтрокой;
		_Время="00:00:00";
	КонецЕсли;
		
	Если Найти(_Дата,".")=0 и Найти(_Дата,"/")=0 и СтрДлина(_Дата)=8 Тогда // 20131231 YYYYMMDD
		_Дата=Сред(_Дата,1,4)+"-"+Сред(_Дата,5,2)+"-"+Сред(_Дата,7,2); // 2013-12-31
	КонецЕсли;
	Если Найти(_Дата,"/")>0 Тогда
		_ЧастиДаты=СтрРазделить(_Дата,"/");
		Если СтрДлина(_ЧастиДаты[0])=4 Тогда // YYYY/MM/DD
			_Дата=СтрЗаменить(_Дата,"/","-"); // 2013-12-31
		Иначе
			Если АмериканскийФормат Тогда // ММ/ДД/ГГГГ
				_Дата=_ЧастиДаты[1]+"."+_ЧастиДаты[0]+"."+_ЧастиДаты[2]; // 31.12.2013
			Иначе
				_Дата=СтрЗаменить(_Дата,"/","."); // 31.12.2013
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	Если Найти(_Дата,"-")>0 Тогда // 2013-12-31
		_ЧастиДаты=СтрРазделить(_Дата,"-"); // ГГГГ|ММ|ДД
		Если СтрДлина(_ЧастиДаты[2])=4 Тогда // ДД|ММ|ГГГГ -> 31-12-2013
			_Дата=_ЧастиДаты[0]+"."+_ЧастиДаты[1]+"."+_ЧастиДаты[2]; // 31.12.2013
		Иначе
			_Дата=_ЧастиДаты[2]+"."+_ЧастиДаты[1]+"."+_ЧастиДаты[0]; // 31.12.2013
		КонецЕсли;
	КонецЕсли;
	Если Найти(_Дата,".")=0 Тогда // Какая-то хрень
		Возврат Дата("00010101000000");
	КонецЕсли;
	// Основная обработка
	_ЧастиДаты=СтрРазделить(_Дата,"."); // ДД|ММ|ГГГГ
	Если _ЧастиДаты.Количество()=2 Тогда //"12.13" или "12.2013";
		_ЧастиДаты.Вставить(0,"01"); // 01.12.2013
	КонецЕсли;
	Для iii=0 По _ЧастиДаты.Количество()-1 Цикл
		Если СтрДлина(_ЧастиДаты.Получить(iii))<2 Тогда // 1.6.2013
			_ЧастиДаты.Установить(iii,Прав("00"+_ЧастиДаты.Получить(iii),2)); // 01.06.2013
		КонецЕсли;
	КонецЦикла;
	// год в формате ГГ
	Если СтрДлина(_ЧастиДаты[2])=2 Тогда // 31.12.13
		Если _ЧастиДаты[2]<"50" Тогда // 31.12.13
			_ЧастиДаты[2]="20"+_ЧастиДаты[2]; // 31.12.2013
		Иначе
			_ЧастиДаты[2]="19"+_ЧастиДаты[2]; // 31.12.1970
		КонецЕсли;
	КонецЕсли;
	_ЧастиВремени=СтрРазделить(_Время,":");
	Для iii=0 По _ЧастиВремени.Количество()-1 Цикл
		Если СтрДлина(_ЧастиВремени.Получить(iii))<2 Тогда // 0|0|0
			_ЧастиВремени.Установить(iii,Прав("00"+_ЧастиВремени.Получить(iii),2)); // 00|00|00
		КонецЕсли;
		Если СтрДлина(_ЧастиВремени.Получить(iii))>2 Тогда // 23|59|59.999Z
			_ЧастиВремени.Установить(iii,Лев(_ЧастиВремени.Получить(iii),2)); // 00|00|00
		КонецЕсли;
	КонецЦикла;
	
	Попытка
		Возврат Дата(_ЧастиДаты[2]+_ЧастиДаты[1]+_ЧастиДаты[0]+_ЧастиВремени[0]+_ЧастиВремени[1]+_ЧастиВремени[2]) // 20131231235959
	Исключение
		Сообщить("Ошибка преобразования даты "+ДатаСтрокой);
		Возврат Дата("00010101000000");
	КонецПопытки; 
КонецФункции // ПолучитьДатуИзСтроки
Показать
Olga12; as7bs; dammit666; kulkrise; Somebody1; vectr; tuxik07; valafan; +8 Ответить
56. as7bs 294 24.06.22 09:15 Сейчас в теме
(51)
ДатаСтрокой=СтрЗаменить(ДатаСтрокой,"г",""); // 31 декабря 2013 г -> 31 декабря 2013

Отличная функция. Только из за этой строки "авГуст 2021" превращается в "авуст 2021" и соответственно возвращается пустая дата для всех августов
57. Mx00 249 03.07.22 22:51 Сейчас в теме
(56) согласен, глупость я написал :-)
у себя заменил строку "ДатаСтрокой=СтрЗаменить(ДатаСтрокой,"г",""); // 31 декабря 2013 г -> 31 декабря 2013" на
Если Прав(ДатаСтрокой,1)="г" Тогда
ДатаСтрокой=Лев(СтрДлина(ДатаСтрокой)-1);
КонецЕсли;
54. Никулин Леонид 4 02.02.22 11:36 Сейчас в теме
СтроковыеФункцииКлиентСервер.СтрокаВДату(<ДатаСтрокой>)
Divedition; Cmapnep; DimaP; +3 Ответить
55. Никулин Леонид 4 02.02.22 11:37 Сейчас в теме
СтроковыеФункцииКлиентСервер.СтрокаВДату(Выборка.ДатаВыпуска_постройки_)
58. lostlamer 11.10.22 17:51 Сейчас в теме
В функциях множество ошибок. Склейка переменных с условиями. Отправка к несуществующим функциям общего модуля. В общем неприятная статейка с функцией, которую потом надо напильником обработать.
Оставьте свое сообщение