Войти
Закрыть

Строка В Дату

БСП / Конфигуратор / Строковые функции

Функция СтрокаВДату(Знач Значение, ЧастьДаты = Неопределено) Экспорт
	
	НаборЦифр = "1234567890";
	
	Если ТипЗнч(ЧастьДаты) <> Тип("ЧастиДаты") Тогда
		ЧастьДаты = ЧастиДаты.Дата;
	КонецЕсли;
	
	ПараметрыДаты = Новый КвалификаторыДаты(ЧастьДаты);
	ОписаниеТипаДата = Новый ОписаниеТипов("Дата",,, ПараметрыДаты);
	
	Значение = ВРег(СтрСоединить(СтрРазделить(СокрЛП(Значение), Символы.НПП + Символы.ПС + Символы.Таб), " "));
	Результат = ОписаниеТипаДата.ПривестиЗначение(Значение);
	
	Для НомерМесяца = 1 По 12 Цикл
		Значение = СтрЗаменить(Значение, ВРег(Формат(Дата(1, НомерМесяца, 2), "ДФ=ММММ")), Формат(НомерМесяца, "ЧЦ=2; ЧВН="));
		Значение = СтрЗаменить(Значение, ВРег(Формат(Дата(1, НомерМесяца, 2), "ДФ=MMM")), Формат(НомерМесяца, "ЧЦ=2; ЧВН="));
	КонецЦикла;
	
	МассивНеЦифр = СтрРазделить(Значение, НаборЦифр);
	Если МассивНеЦифр.Количество() < 2 Тогда
		Возврат Результат;
	КонецЕсли;
	
	ПозицияПервойЦифры = СтрДлина(МассивНеЦифр[0]);
	ПозицияПоследнейЦифры = СтрДлина(Значение) - СтрДлина(МассивНеЦифр[МассивНеЦифр.ВГраница()]);
	Значение = Сред(Значение, ПозицияПервойЦифры, ПозицияПоследнейЦифры - ПозицияПервойЦифры);
	Если ПустаяСтрока(Значение) Тогда
		Возврат Результат;
	КонецЕсли;
	
	ЗначениеМассивом = СтрРазделить(Значение, " ");
	Элемент = ЗначениеМассивом[ЗначениеМассивом.ВГраница()];
	Если ЗначениеМассивом.Количество() > 1 Тогда
		Если СтрДлина(Элемент) = 2 Или СтрДлина(Элемент) = 4 Тогда
			
			ЭтоТолькоЦифры = СтрРазделить(Элемент, НаборЦифр, Ложь).Количество() = 0;
			Если ЭтоТолькоЦифры Тогда
				ЗначениеДата = Значение;
				ЗначениеВремя = "";
			Иначе
				ЗначениеВремя = Элемент;
				ЗначениеМассивом.Удалить(ЗначениеМассивом.ВГраница());
				ЗначениеДата = СтрСоединить(ЗначениеМассивом, " ");
			КонецЕсли;
		Иначе
			
			ЗначениеВремя = Элемент;
			ЗначениеМассивом.Удалить(ЗначениеМассивом.ВГраница());
			ЗначениеДата = СтрСоединить(ЗначениеМассивом, " ");
		КонецЕсли;
	Иначе
		
		ЭтоТолькоЦифры = СтрРазделить(Элемент, НаборЦифр, Ложь).Количество() = 0;
		Если ЭтоТолькоЦифры Тогда
			
			Результат = ОписаниеТипаДата.ПривестиЗначение(Элемент);
			Если Не ЗначениеЗаполнено(Результат) Тогда
				
				Если СтрДлина(Элемент) = 6 Тогда
				
					ПеревернутаяДата  = Сред(Элемент, 5) + Сред(Элемент, 3, 2) + Лев(Элемент, 2);
					Год = СтрокаВЧисло(Лев(ПеревернутаяДата, 2));
					Если Год <> Неопределено Тогда
						ПеревернутаяДата = ?(Год > 29, "19", "20") + ПеревернутаяДата;
						Результат = ОписаниеТипаДата.ПривестиЗначение(ПеревернутаяДата);
					КонецЕсли;
					
				ИначеЕсли СтрДлина(Элемент) > 7 Тогда
					
					ПеревернутаяДата  = Сред(Элемент, 5) + Сред(Элемент, 3, 2) + Лев(Элемент, 2);
					Результат = ОписаниеТипаДата.ПривестиЗначение(ПеревернутаяДата);
					
				КонецЕсли;
				
			КонецЕсли;
			
			Возврат Результат;
			
		ИначеЕсли СтрНайти(Элемент, ":") > 0 Тогда
			
			ЗначениеДата = "";
			ЗначениеВремя = Элемент;
		Иначе
			ЗначениеДата = Элемент;
			ЗначениеВремя = "";
		КонецЕсли;
	КонецЕсли;
	
	ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
	
	Если ЗначениеЗаполнено(ЗначениеДата) И ЧастьДаты <> ЧастиДаты.Время Тогда
		
		НаборРазделителей = СтрСоединить(СтрРазделить(ЗначениеДата, НаборЦифр, Ложь), "");
		ЗначениеДатаМассивом = СтрРазделить(ЗначениеДата, НаборРазделителей, Ложь);
		
		ЭтоТолькоЦифры = СтрРазделить(ЗначениеДата, НаборЦифр, Ложь).Количество() = 0;
		Если НЕ ЭтоТолькоЦифры Тогда
			
			Год   = 1;
			Месяц = 1;
			День  = 1;
			
			Если СтрДлина(ЗначениеДатаМассивом[0]) = 4 Тогда
				Год = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[0]);
				ГодВНачале = Истина;
			Иначе
				День = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[0]);
				ГодВНачале = Ложь;
			КонецЕсли;
			
			Если ЗначениеДатаМассивом.Количество() = 2 Тогда
				Месяц = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[1]);
			ИначеЕсли ЗначениеДатаМассивом.Количество() > 2 Тогда
				Месяц = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[1]);
				Если ГодВНачале Тогда
					День = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[2]);
				Иначе
					Год = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[2]);
				КонецЕсли;
			КонецЕсли;
			
			Если СтрДлина(Год) < 3 Тогда
				ГодЧислом = ОписаниеТипаЧисло.ПривестиЗначение(Год);
				Год = ?(ГодЧислом < 30, 2000, 1900) + ГодЧислом;
			Иначе
				Год = ОписаниеТипаЧисло.ПривестиЗначение(Год);
			КонецЕсли;
			
			ЗначениеДата = Формат(Год, "ЧЦ=4; ЧН=0001; ЧВН=; ЧГ=0")
				+ Формат(Месяц, "ЧЦ=2; ЧН=01; ЧВН=; ЧГ=0")
				+ Формат(День, "ЧЦ=2; ЧН=01; ЧВН=; ЧГ=0");
		Иначе
			
			Если СтрДлина(ЗначениеДата) = 6 Тогда
				
				Год = Прав(ЗначениеДата, 2);
				ГодЧислом = ОписаниеТипаЧисло.ПривестиЗначение(Год);
				ЗначениеДата = ?(ГодЧислом < 30, 2000, 1900) + Год + Сред(ЗначениеДата, 3, 2) + Лев(ЗначениеДата, 2) ;
				
			ИначеЕсли СтрДлина(ЗначениеДата) = 8 Тогда
				
				Результат = ОписаниеТипаДата.ПривестиЗначение(ЗначениеДата);
				
				Если Не ЗначениеЗаполнено(Результат) Тогда
					ПеревернутаяДата  = Сред(ЗначениеДата, 5) + Сред(ЗначениеДата, 3, 2) + Лев(ЗначениеДата, 2);
					Результат = ОписаниеТипаДата.ПривестиЗначение(ПеревернутаяДата);
					Если ЗначениеЗаполнено(Результат) Тогда
						ЗначениеДата = ПеревернутаяДата;
					КонецЕсли;
				КонецЕсли;
			
			КонецЕсли;
		КонецЕсли;
		
	Иначе
		ЗначениеДата = "00010101";
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ЗначениеВремя) И ЧастьДаты <> ЧастиДаты.Дата Тогда
		
		ЭтоТолькоЦифры = СтрРазделить(ЗначениеВремя, НаборЦифр, Ложь).Количество() = 0;
		Если НЕ ЭтоТолькоЦифры Тогда
			
			НаборРазделителей = СтрСоединить(СтрРазделить(ЗначениеВремя, НаборЦифр, Ложь), "");
			ЗначениеВремяМассивом = СтрРазделить(ЗначениеВремя, НаборРазделителей, Ложь);
			
			Час     = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[0]);
			Минута  = 0;
			Секунда = 0;
			
			Если ЗначениеВремяМассивом.Количество() = 2 Тогда
				Минута = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[1]);
			ИначеЕсли ЗначениеВремяМассивом.Количество() > 2 Тогда
				Минута = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[1]);
				Секунда = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[2]);
			КонецЕсли;
			
			ШаблонФормата = "ЧЦ=2; ЧН=00; ЧВН=; ЧГ=0";
			ЗначениеВремя = Формат(Час, ШаблонФормата)
				+ Формат(Минута, ШаблонФормата)
				+ Формат(Секунда, ШаблонФормата);
				
		КонецЕсли;
		
	Иначе
		ЗначениеВремя = "000000";
	КонецЕсли;
	
	Результат = ОписаниеТипаДата.ПривестиЗначение(ЗначениеДата + ЗначениеВремя);
	
	Возврат Результат;
	
КонецФункции

Похожие новости

Комментарии (0)

Навигация