(1) baracuda,
Дата("20161113");
либо
либо ДАТА(Год, Месяц, Число); // где год, месяц, день = числа
Тебе придется выделить год, месяц, число, сформировать строку формата "YYYYMMDD" без разделителей, и ее преобразовывать в дату.
(14) spacecraft, Странно. Это модуль из подсистемы БСП "БазоваяФункциональность", но в версии БСП 2.2.3.29 такой функции нет... То ли еще, то ли уже :)
Но еще надо учитывать, что год не может быть меньше 1 и больше 9999, месяц не может быть меньше 1 и больше 12, дни не могут быть меньше 1 и больше 28/29/30/31 (в зависимости от месяца и года)
(30) Не вижу ошибки. Да и функция рабочая, а не специально писаная. ЧастьДаты - если посмотрите выше, как она получается, это только цифры, так что с преобразованием к числу проблем не будет. А вот ЧастьЧислом создается только по условиям, поэтому она для
СтрДаты.Вставить(КлючЧасти,Число(ЧастьЧислом));
может оказаться равной Неопределено. А Вам такое надо?
(31) Без проблем. Я не долго пишу на 1с и не большой спец.
Про "Неопределено" сразу заметил. Но сейчас все работает на текущих датах.
Я и написал что бы вы свой код проверили. И потом я возьму исправленный.
Обратите внимание что переменная "ЧастьЧислом" у вас не используется после прибавления 2000
И соответственно при попытке преобразовать "09.02.24" при дефолтовом значении параметра "ПорядоВТексте"
вы получите "09.02.0024 0:00:00"
Ну и напоследок, в имени переменой "ПорядоВТексте" забыли букву к. Глаз спотыкается на ней.
Стандартная (из БСП?) СтрокаВДату() очень слабая. Стараюсь не использовать, потому что при ошибке преобразования возвращать пустую дату считаю неправильным.
Поэтому тоже использую свои наработки:
//Преобразование строки в дату/время с указанием строки форматирования.
//При ошибке преобразования генерируется исключение.
//Допустимые значения в строке форматирования:
// 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)))
)
Исключение
ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату по формату """ + ФорматДаты + """"
КонецПопытки;
Иначе
Возврат Неопределено
КонецЕсли;
КонецФункции // СтрокаВДатуВремя
Показать
Всегда с интересом изучаю подобные обсуждения, бывает, попадаются изящные, удобные, быстрые, оптимальные решения.
(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)))
)
Исключение
Если ПриОшибкиБезФормата тогда
Возврат СтрокаВДатуВремя(ДатаСтрока);
Иначе
ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату по формату """ + ФорматДаты + """";
КонецЕсли;
КонецПопытки;
КонецЕсли;
Возврат Неопределено;
КонецФункции
(32) Вы правы в той части, что ЧастьЧислом не используется. Это, действительно, ошибка. Ошибка логики, конечно.
В тексте уже ничего не изменить, но уж если мы обнаружили, что год меньше 2000 то нужно сделать переприсвоение переменной ЧастьДаты из ЧастьЧислом, после того как к этой части добавили 2000.
Спасибо за анализ и выявленный баг!
Функция ПреобразоватьВYYYYMMDD(СтрокаДата)
// Преобразует строку вида "10.07.2024" в вид "20240710"
Сообщить(СтрокаДата);
Год = Сред(СтрокаДата,7,4);
Месяц = Сред(СтрокаДата,4,2);
День = Сред(СтрокаДата,1,2);
Преобразователь = Год + Месяц + День;
Сообщить(Преобразователь);
Возврат Преобразователь;
КонецФункции