Преобразовать Строку в Дату

1. baracuda 2 23.12.15 16:34 Сейчас в теме
Простите за глупый вопрос. Вроде как и гуглил, да не нашел ответа.

в дбф файле имеется поле со строкой 13.11.2016, как перевести его в дату

Пробовал так вываливается ошибка
		Пока ФайлDBF.Следующая() Цикл
			
			НовСтрока = ТЧ.Добавить();
			НовСтрока.Код = ФайлDBF.KOD;
			НовСтрока.Наименование = ФайлDBF.NAME;
			НовСтрока.Производитель = ФайлDBF.PROIZVOD;
			
			// Преобразуем строку в дату
			НовСтрока.Срок = Формат(Дата(Строка(ФайлDBF.SROK)),"ДФ='ДФ=dd.MM.yyyy'");
			
			НовСтрока.Количество = ФайлDBF.KOL;
			НовСтрока.ЖНВЛС = ФайлDBF.FLAG;
			НовСтрока.Цена = ФайлDBF.PRICE;
			НовСтрока.ПредельнаяЦена = ФайлDBF.RPRICE;
			НовСтрока.СтавкаНДС = ФайлDBF.NDS;
			НовСтрока.Комментарий = ФайлDBF.COMMENT;
			ФайлDBF.Следующая();
		КонецЦикла;
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. ЧерныйКот 23.12.15 16:53 Сейчас в теме
(1) baracuda,
Дата("20161113");
либо
либо ДАТА(Год, Месяц, Число); // где год, месяц, день = числа
Тебе придется выделить год, месяц, число, сформировать строку формата "YYYYMMDD" без разделителей, и ее преобразовывать в дату.
9. spacecraft 23.12.15 17:06 Сейчас в теме
(1) baracuda, чем из типовой не устраивает?
Функция СтрокаВДату(Знач ДатаСтрока) Экспорт
	
	ПозицияПробела = СтрНайти(ДатаСтрока, " ", НаправлениеПоиска.СНачала);
	Если ПозицияПробела > 0 Тогда
		ДатаСтрока = Лев(ДатаСтрока, ПозицияПробела - 1);
	КонецЕсли;
	ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, ".", ""));
	ДатаСтрока = Сред(ДатаСтрока, 5) + Сред(ДатаСтрока, 3, 2) + Лев(ДатаСтрока, 2);
	Если СтрДлина(ДатаСтрока) = 6 Тогда
		ДатаСтрока = "20" + ДатаСтрока;
	КонецЕсли;
	
	ОписаниеТипа = Новый ОписаниеТипов("Дата");
	Результат    = ОписаниеТипа.ПривестиЗначение(ДатаСтрока);
	
	Возврат Результат;
	
КонецФункции 
Показать
RusskyPhX; zatula_yuliya@mail.ru; Yan_Malyakov; tolyan_ekb; user810071; Maxisussr; +6 Ответить
10. baracuda 2 23.12.15 17:16 Сейчас в теме
(9) spacecraft, на тонком клиенте нет доступа
12. spacecraft 23.12.15 17:24 Сейчас в теме
(10) baracuda, что значит нет? это в общем модуле с флагами клиент и сервер. Доступен и на клиенте и на сервере.
13. vkozak 23.12.15 18:22 Сейчас в теме
(9) spacecraft,
А где эта функция сидит?
14. spacecraft 23.12.15 18:27 Сейчас в теме
(13) vkozak, общий модуль СтроковыеФункцииКлиентСервер. В частности в Рознице есть.
zatula_yuliya@mail.ru; +1 Ответить
15. herfis 499 23.12.15 18:35 Сейчас в теме
(14) spacecraft, Странно. Это модуль из подсистемы БСП "БазоваяФункциональность", но в версии БСП 2.2.3.29 такой функции нет... То ли еще, то ли уже :)
16. spacecraft 23.12.15 18:42 Сейчас в теме
(15) herfis, еще. в БСП много чего нет, чего хотелось бы. Как правило в типовые дописывают.
37. dehro 5 15.02.24 07:17 Сейчас в теме
(15)Скопируй в свой модуль ;)
38. RusskyPhX 19.02.24 17:44 Сейчас в теме
(9) Примного благодарен за сэкономленное время)
29. sssss_aaaaa_2011 10.08.22 15:31 Сейчас в теме
(1)А какой тип у поля SROK? Если дата, то какого лешего работа с ним организована как со строкой?
2. dj_serega 392 23.12.15 16:37 Сейчас в теме
ЗначениеДата = "13.11.2016";
Дата1С = Дата(Прав(ЗначениеДата, 4), Сред(ЗначениеДата, 4, 2), Лев(ЗначениеДата, 2));
user1868991; abadonna83; Vovus; Idris1204; k_vasil; herfis; baracuda; +7 Ответить
3. herfis 499 23.12.15 16:52 Сейчас в теме
(2) dj_serega, В этом варианте синтаксиса еще нужно к числам преобразовать. Но можно так:
Дата1С = Дата(Прав(ЗначениеДата, 4) + Сред(ЗначениеДата, 4, 2) + Лев(ЗначениеДата, 2));

Только проверить источник на предмет наличия ведущих нулей.
Idris1204; k_vasil; ЧерныйКот; +3 Ответить
6. baracuda 2 23.12.15 16:56 Сейчас в теме
(2) dj_serega, спасибо за оперативный ответ. На мисте клоунаду устроили
11. dj_serega 392 23.12.15 17:21 Сейчас в теме
(6) baracuda, Миста такая миста :)
8. herfis 499 23.12.15 17:05 Сейчас в теме
(2) dj_serega, Опа. А я и не знал, что в этом месте неявное приведение типов работает.
5. alljoke 23.12.15 16:54 Сейчас в теме
дата("13.11.2016 00:00:00")
user1982459; user1868991; kabantus; vsm-dev; izidakg; ilnurmi; bamblbi; Maxx2008; user1188623; Monte Carlo; ЧерныйКот; baracuda; +12 Ответить
22. Monte Carlo 07.08.19 10:24 Сейчас в теме
(5) тут главное не забыть добавить " 00:00:00", если дата в формате "13.11.2016". Просто выполнение Дата("13.11.2016") приведет к ошибке.
ayashchuk; Maxx2008; +2 Ответить
27. user797276 16.10.20 15:26 Сейчас в теме
(5)
2020 год
Столкнулся с тем, что в одной конфигурации это работает, в другой нет. Платформа одинаковая
7. herfis 499 23.12.15 17:02 Сейчас в теме
В СП, кстати, написано, что локальный формат даты тоже должно хавать.
Но и отлично, что не хавает.
17. Alexei_fox 46 22.02.19 02:16 Сейчас в теме
Супер. Дата1С = Дата(Прав(ЗначениеДата, 4) + Сред(ЗначениеДата, 4, 2) + Лев(ЗначениеДата, 2)); Работает.
18. sphere 22.03.19 11:56 Сейчас в теме
(2)
(3)
(17)
Сред(ЗначениеДата, 4, 2)


Сред(ЗначениеДата, 5, 2)

Но еще надо учитывать, что год не может быть меньше 1 и больше 9999, месяц не может быть меньше 1 и больше 12, дни не могут быть меньше 1 и больше 28/29/30/31 (в зависимости от месяца и года)
19. ben19791010 22.03.19 12:06 Сейчас в теме
(18)
не может быть меньше 1 и больше 9999
а не 3999? )))
20. sphere 22.03.19 12:59 Сейчас в теме
(19)
а не 3999? )))

Смотря как на это смотреть. Ошибки преобразования не будет и с 9999
21. Octopus 337 22.03.19 13:41 Сейчас в теме
(19)
Сообщить(Дата(9999, 1, 1))
выдаст 01.01.9999 0:00:00
23. Новичок1с 4 25.02.20 20:38 Сейчас в теме
Доброго вечера.

ТаблицаРеестра.Колонки.Добавить("ДатаПлатежа",	Новый ОписаниеТипов("Дата") );
ДатаПлатежа		 							= ExcelЛист.Cells(Строка, Объект.НомерКолонкиДата ).Value;
		
Дата1С = (Дата(Прав(ДатаПлатежа, 4), Сред(ДатаПлатежа, 4, 2), Лев(ДатаПлатежа, 2)+" 00:00:00");


У меня ругается, что преобразование значения к типу число не может быть выполнено.

Дата1С 18.02.2020 0:00:00 показывает такое значение.

Подскажите пожалуйста, в чём дело.

p.s
и в строках ТЗ такая же самая ошибка

Комментарии			             = Строка(Комментарии +" "+Комментарии1+ " "+Комментарии2);
24. Новичок1с 4 25.02.20 21:56 Сейчас в теме
(23)
Ошибка оказалась не в формате даты- он верно преобразовывается, а в последней строке екселя.
25. dusha0020 1106 28.05.20 15:21 Сейчас в теме
Сначала искал решение. Потом сел и написал свое.
Может кому пригодится:
Функция ПреобразоватьКДате(Текст, ПорядоВТексте = "ДнМсГдЧсМнСк")
	
	ВозможныеРазделители = ".:/ ";
	ЦифрыСтрокой = "1234567890";	
	ТекстДаты = "";
	СтрДаты = Новый Структура("Дн,Мс,Гд,Чс,Мн,Ск",0,0,ГОД(ТекущаяДата()),0,0,0);
	
	Для сч = 1 По СтрДлина(Текст) Цикл
		Символ = Сред(Текст,сч,1);
		Если СтрНайти(ЦифрыСтрокой,Символ)>0 Тогда
			ТекстДаты = ТекстДаты + Символ;
		ИначеЕсли СтрНайти(ВозможныеРазделители,Символ)>0 Тогда
			ТекстДаты = ТекстДаты + "#";
		КонецЕсли;
	КонецЦикла;
	
	мЧастиДаты = СтрРазделить(ТекстДаты,"#",Ложь);
	Для Каждого ЧастьДаты Из мЧастиДаты Цикл
		ИндексФрагмента = мЧастиДаты.Найти(ЧастьДаты);
		Если ИндексФрагмента < СтрДлина(ПорядоВТексте) / 2 Тогда
			КлючЧасти = Сред(ПорядоВТексте,ИндексФрагмента * 2 + 1,2);
			ЧастьЧислом = Число(ЧастьДаты);
		КонецЕсли;
		Если КлючЧасти = "Гд" И ЧастьЧислом < 2000 Тогда
			ЧастьЧислом = ЧастьЧислом + 2000;
		КонецЕсли;
		
		СтрДаты.Вставить(КлючЧасти,Число(ЧастьДаты));
		
	КонецЦикла;
		
	Возврат Дата(СтрДаты.Гд, СтрДаты.Мс,СтрДаты.Дн, СтрДаты.Чс, СтрДаты.Мн, СтрДаты.Ск);	
		
КонецФункции
Показать
HectorPrima; gaytanen; +2 Ответить
30. HectorPrima 09.02.24 03:05 Сейчас в теме
(25) в коде
СтрДаты.Вставить(КлючЧасти,Число(ЧастьДаты));

ошибка, по идее должно быть
СтрДаты.Вставить(КлючЧасти,Число(ЧастьЧислом));
31. dusha0020 1106 09.02.24 14:02 Сейчас в теме
(30) Не вижу ошибки. Да и функция рабочая, а не специально писаная. ЧастьДаты - если посмотрите выше, как она получается, это только цифры, так что с преобразованием к числу проблем не будет. А вот ЧастьЧислом создается только по условиям, поэтому она для
СтрДаты.Вставить(КлючЧасти,Число(ЧастьЧислом));
может оказаться равной Неопределено. А Вам такое надо?
HectorPrima; +1 Ответить
32. HectorPrima 09.02.24 16:26 Сейчас в теме
(31) Без проблем. Я не долго пишу на 1с и не большой спец.
Про "Неопределено" сразу заметил. Но сейчас все работает на текущих датах.

Я и написал что бы вы свой код проверили. И потом я возьму исправленный.

Обратите внимание что переменная "ЧастьЧислом" у вас не используется после прибавления 2000
И соответственно при попытке преобразовать "09.02.24" при дефолтовом значении параметра "ПорядоВТексте"
вы получите "09.02.0024 0:00:00"

Ну и напоследок, в имени переменой "ПорядоВТексте" забыли букву к. Глаз спотыкается на ней.

Спасибо.
dusha0020; +1 Ответить
26. UHolder 03.09.20 10:33 Сейчас в теме
Стандартная (из БСП?) СтрокаВДату() очень слабая. Стараюсь не использовать, потому что при ошибке преобразования возвращать пустую дату считаю неправильным.
Поэтому тоже использую свои наработки:
//Преобразование строки в дату/время с указанием строки форматирования.
//При ошибке преобразования генерируется исключение.
//Допустимые значения в строке форматирования:
//	yyyy 	- год полностью
//	yy		- год сокращённо
//	mm		- месяц
//	dd		- день
//	hh		- часы
//	nn		- минуты
//	ss		- секунды
//	Разделитель в исходной строке и строке форматирования может различаться.
//
// Параметры:
//  ДатаСтрока	- Строка - Исходная строка с датой
//  ФорматДаты	- Строка - Формат даты в переданной строке
//
// Возвращаемое значение:
//   Дата
//
// Пример:
// СтрокаВДатуВремя("05.04.20", "dd.mm.yy")
// СтрокаВДатуВремя("05.04.20 12:30:00, "dd.mm.yy hh:nn:ss")
// СтрокаВДатуВремя("05/04/20 12:30:00, "dd.mm.yy hh:nn:ss")
Функция СтрокаВДатуВремя(ДатаСтрока, ФорматДаты = "dd.mm.yyyy") Экспорт
	Если ЗначениеЗаполнено(ДатаСтрока) Тогда
		Попытка
			Годы = СтрНайти(ФорматДаты, "yyyy");
			Годы = ?(Годы = 0 , 0, Число(Сред(ДатаСтрока, Годы, 4)));
			Если Годы = 0 Тогда
				Годы = СтрНайти(ФорматДаты, "yy");
				Годы = ?(Годы = 0 , 0, Число("20" + Сред(ДатаСтрока, Годы, 2)));
			КонецЕсли;
			Месяцы 	= СтрНайти(ФорматДаты, "mm");
			Дни 	= СтрНайти(ФорматДаты, "dd");
			Часы 	= СтрНайти(ФорматДаты, "hh");
			Минуты 	= СтрНайти(ФорматДаты, "nn");
			Секунды = СтрНайти(ФорматДаты, "ss");
			
			Возврат Дата(
				?(Годы 		= 0, 1, Годы),
				?(Месяцы 	= 0, 1, Число(Сред(ДатаСтрока, Месяцы, 2))),
				?(Дни 		= 0, 1, Число(Сред(ДатаСтрока, Дни, 2))),
				?(Часы 		= 0, 0, Число(Сред(ДатаСтрока, Часы, 2))),
				?(Минуты 	= 0, 0, Число(Сред(ДатаСтрока, Минуты, 2))),
				?(Секунды 	= 0, 0, Число(Сред(ДатаСтрока, Секунды, 2)))
			)
		Исключение
			ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату по формату """ + ФорматДаты + """"
		КонецПопытки;
	Иначе
		Возврат Неопределено
	КонецЕсли;
КонецФункции // СтрокаВДатуВремя
Показать

Всегда с интересом изучаю подобные обсуждения, бывает, попадаются изящные, удобные, быстрые, оптимальные решения.
DFinteX; jane_de_rio; criptid; Niks27; SpiegelWiegel; www76; starovton; KimiArk; dimensh; mihap; +10 Ответить
28. zhuntovda 1 10.08.22 12:54 Сейчас в теме
(26)
Увидел, решил допилить функцию, что бы можно было без формата распознавать дату и время. В данном случае воспринимается формат yyyymmdd, yyyy#mm#dd, dd#mm#yyyy, а так же время в любом формате с разделителями (можно допилить под другие варианты если очень нужно). Зачем? Есть ситуации, когда формат не указывается и нужно более менее стандартные строки преобразовать) Например: сервер имеет формат английский даты, а клиент русский или разные сервера (+ универсальность)

Функция   СтрокаВДатуВремя(ДатаСтрока, ФорматДаты = Неопределено, ПриОшибкиБезФормата = Ложь) Экспорт
	
	Если НЕ ЗначениеЗаполнено(ДатаСтрока) Тогда
		Возврат Дата(1,1,1);
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(ФорматДаты) тогда
	
		СимволыЦифры = "0123456789";
		ФлагПоловиныСуток = "";
		НомГода = 0;
		
		МассивЧастей = Новый Массив;
		СтрокаЧасти = "";
		Для Сч = 1 По СтрДлина(ДатаСтрока) Цикл
			
			Сим = Прав(Лев(ДатаСтрока, Сч), 1);
			
			Если СтрНайти(СимволыЦифры, Сим) <> 0 тогда
				СтрокаЧасти = "" + СтрокаЧасти + Сим;
			Иначе
				
				Если ЗначениеЗаполнено(СтрокаЧасти) тогда
					МассивЧастей.Добавить(Число(СтрокаЧасти));
					Если СтрДлина(СтрокаЧасти) И МассивЧастей.Количество() < 4 тогда
						НомГода = МассивЧастей.Количество();	
					КонецЕсли;
					СтрокаЧасти = "";
				КонецЕсли;
				
				Если Сим = "P" ИЛИ Сим = "A" тогда
					Если СтрДлина(ДатаСтрока) >= Сч + 1 тогда
						СлСим = Прав(Лев(ДатаСтрока, Сч + 1), 1);
						Если СлСим = "M" тогда
							ФлагПоловиныСуток = "" + Сим + СлСим;	
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЦикла;
		
		Если ЗначениеЗаполнено(СтрокаЧасти) тогда
			МассивЧастей.Добавить(Число(СтрокаЧасти));
			Если СтрДлина(СтрокаЧасти) И МассивЧастей.Количество() < 4 тогда
				НомГода = МассивЧастей.Количество();	
			КонецЕсли;
		КонецЕсли;
		
		Если МассивЧастей.Количество() > 6 тогда
			ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату: попробуйте указать формат даты!";	
		ИначеЕсли МассивЧастей.Количество() = 1 тогда
			Попытка 
				Возврат Дата(МассивЧастей[0]);	
			Исключение
				ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату: некорректно передана дата без разделителей, попробуйте указать формат даты!";	
			КонецПопытки;
		КонецЕсли;
		
		Годы 	= 1;
		Месяцы 	= 1;
		Дни 	= 1;
		Часы 	= 0;
		Минуты 	= 0;
		Секунды = 0;
		
		Если НомГода = 1 тогда
			Годы   = МассивЧастей[0];
			Месяцы = МассивЧастей[1];
			Если НЕ МассивЧастей.Количество() = 2 тогда
				Дни  = МассивЧастей[2];
			КонецЕсли;
			Если НЕ МассивЧастей.Количество() = 3 тогда
				Часы  = МассивЧастей[3];
			КонецЕсли;
			Если НЕ МассивЧастей.Количество() = 4 тогда
				Минуты  = МассивЧастей[4];
			КонецЕсли;
			Если НЕ МассивЧастей.Количество() = 5 тогда
				Секунды  = МассивЧастей[5];
			КонецЕсли;	
		ИначеЕсли НомГода = 3 тогда
			Годы   = МассивЧастей[2];
			Месяцы = МассивЧастей[1];
			Дни  = МассивЧастей[0];
			Если НЕ МассивЧастей.Количество() = 3 тогда
				Часы  = МассивЧастей[3];
			КонецЕсли;
			Если НЕ МассивЧастей.Количество() = 4 тогда
				Минуты  = МассивЧастей[4];
			КонецЕсли;
			Если НЕ МассивЧастей.Количество() = 5 тогда
				Секунды  = МассивЧастей[5];
			КонецЕсли;		
		Иначе
			ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату: не стандартный формат года, попробуйте указать формат даты!";	
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ФлагПоловиныСуток) тогда
			Если ФлагПоловиныСуток = "AM" тогда
				Часы = ?(Часы = 12, 0, Часы);		
			Иначе
				Часы = ?(Часы = 12, Часы, Часы + 12);	
			КонецЕсли;
		КонецЕсли;
		
		Попытка
			Возврат Дата(Годы, Месяцы, Дни, Часы, Минуты, Секунды);	
		Исключение
			ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату: попробуйте указать формат даты!";	
		КонецПопытки;
	
	Иначе
		
        Попытка
            Годы = СтрНайти(ФорматДаты, "yyyy");
            Годы = ?(Годы = 0 , 0, Число(Сред(ДатаСтрока, Годы, 4)));
            Если Годы = 0 Тогда
                Годы = СтрНайти(ФорматДаты, "yy");
                Годы = ?(Годы = 0 , 0, Число("20" + Сред(ДатаСтрока, Годы, 2)));
            КонецЕсли;
            Месяцы     = СтрНайти(ФорматДаты, "mm");
            Дни     = СтрНайти(ФорматДаты, "dd");
            Часы     = СтрНайти(ФорматДаты, "hh");
            Минуты     = СтрНайти(ФорматДаты, "nn");
            Секунды = СтрНайти(ФорматДаты, "ss");
            
            Возврат Дата(
                ?(Годы         = 0, 1, Годы),
                ?(Месяцы     = 0, 1, Число(Сред(ДатаСтрока, Месяцы, 2))),
                ?(Дни         = 0, 1, Число(Сред(ДатаСтрока, Дни, 2))),
                ?(Часы         = 0, 0, Число(Сред(ДатаСтрока, Часы, 2))),
                ?(Минуты     = 0, 0, Число(Сред(ДатаСтрока, Минуты, 2))),
                ?(Секунды     = 0, 0, Число(Сред(ДатаСтрока, Секунды, 2)))
            )
        Исключение
			Если ПриОшибкиБезФормата тогда
				Возврат СтрокаВДатуВремя(ДатаСтрока);	
			Иначе
				ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату по формату """ + ФорматДаты + """";
			КонецЕсли;
        КонецПопытки;
    
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции
Показать
gaytanen; SIrina9; +2 Ответить
33. dusha0020 1106 12.02.24 20:25 Сейчас в теме
(32) Вы правы в той части, что ЧастьЧислом не используется. Это, действительно, ошибка. Ошибка логики, конечно.
В тексте уже ничего не изменить, но уж если мы обнаружили, что год меньше 2000 то нужно сделать переприсвоение переменной ЧастьДаты из ЧастьЧислом, после того как к этой части добавили 2000.
Спасибо за анализ и выявленный баг!
HectorPrima; +1 Ответить
34. HectorPrima 14.02.24 06:11 Сейчас в теме
(33) По итогу отказался от вашей функции. У вас там в логике ошибка критическая.
Когда дата к примеру "02.02.24" она просто не обработается
ИндексФрагмента = мЧастиДаты.Найти(ЧастьДаты);

Этот код два раза вернет индекс дня. Месяц просто теряем!
Как у вас этот код работает не представляю.

Удачи
35. spacecraft 14.02.24 11:01 Сейчас в теме
(34) чем не устраивает функция из БСП?
СтроковыеФункцииКлиентСервер.СтрокаВДату(ДатаСтрокой)
36. HectorPrima 15.02.24 02:10 Сейчас в теме
(35)
СтроковыеФункцииКлиентСервер.СтрокаВДату(ДатаСтрокой)
Спасибо. Я просто новичек. БСП не очень знаю. То что нужно!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот