Функция преобразования СТРОКИ в ДАТУ
Разработка - Универсальные функции
ФункцияПолучитьДатуИзСтроки(Стр)
Д = Дата("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));
Стр = Сред(Стр,Поз + ДлинаРазделителя);
КонецЦикла;
КонецЕсли;
КонецФункции Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Универсальные функции 1С 8.3 1С:Документооборот Россия Платные (руб)
ДО+ — расширение конфигурации, в котором собран постоянно пополняемый набор из 33 востребованных доработок для 1С:Документооборот КОРП 3.0: согласование задач прямо из мессенджеров MAX и Telegram, отзыв согласования и исполнения, гибкие повторные круги, эскалация с точностью до минут, контроль исполнительской дисциплины, выгрузка вложений в ZIP и склейка PDF, реестр документов в Excel, проверка дублей контрагентов и регистрационных номеров. Каждая возможность активируется отдельным флажком в режиме предприятия — включается только то, что нужно конкретной организации. Список функций расширяется с каждым релизом — текущая версия 2.1.0. Режим AddOn: типовая конфигурация не модифицируется, обновления ДО ставятся штатно, дополнительные лицензии и внешние компоненты не требуются. Внедрение силами администратора — около часа.
30000 руб.
09.07.2026 1440 1 0
Загрузка и выгрузка в Excel Универсальные функции Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).
30.10.2025 8785 Abysswalker 11
Универсальные функции Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)
Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.
14.05.2025 14552 DeerCven 16
Инструментарий разработчика Универсальные функции Запросы Разработчик 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)
Внешняя обработка для создания запроса на основании табличных данных.
22.07.2024 11977 278 ixijixi 10
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.
21.05.2024 68869 dimanich70 87
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.
1 стартмани
18.03.2024 9311 7 John_d 13
Универсальные функции Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.
12.02.2024 85926 atdonya 31
Универсальные функции Разработчик 1С:Предприятие 8 Бесплатно (free)
На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.
30.11.2023 13504 ke.92@mail.ru 18
Преобразовывает СТРОКИ вида "01/10/13","01-10-2013","10,13","10.13","01.03.2013 0:00:00" к типу ДАТА
Может, кому пригодится.
В обработке используется стандартная функция разложить строку, указываю ее ниже.
по поводу параметра-разделителя
а он нужен?
попробуйте такое:
| Код |
|---|
ст = "01-10-2013";
сообщить(Дата(ст)); Показать полностью |
попробуйте вместо минуса использовать другой символ, букву
попробуйте разные символы, напр., "01{10}2013"
будете приятно удивлены
Функция ДатаИзСтроки10(стрДата) экспорт // "01.12.2011" преобразует в '01.12.2011 0:00:00'
Попытка
возврат Дата(Сред(стрДата,7,4)+Сред(стрДата,4,2)+Лев(стрДата,2))
Исключение
возврат '00010101'
КонецПопытки;
КонецФункции // ДатаИзСтроки10()
ДатаВходящегоДокумента = Дата('19000101')+(86400*(Число(ДатаВходящегоДокумента)-2)
с вашей функцией как-то лаконичней:
ДатаВходящегоДокумента = ПолучитьДатуИзСтроки(ДатаВходящегоДокумента)
К тому же избавилась от ненужных преобразований даты в EXCEL .
Вот моя версия, с указанием формата даты:
Функция ПолучитьДатуИзСтроки(Стр, ФорматДаты="")
Д = Дата("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
Дата("03.06.2014 0:15:55"); => 03.06.2014 0:15:55 //Тип("Дата")равно как
Дата("3.6.2014 0:15:55"); => 03.06.2014 0:15:55 //Тип("Дата")Функция СтрокаВДату(Знач ФорматДаты, Знач Дано, Ошибка = Ложь) Экспорт
Попытка
ё = Формат('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'
КонецПопытки
КонецФункции ПоказатьУж не спрашивайте меня о специфике, но в общем, я пытался сопротивляться... :)
Доработал предложенный Вами алгоритм для формата данных без даты (только время), пример формата: "ДФ=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';
КонецПопытки
КонецФункции ПоказатьУ меня не прокатило...
Вот так написал:
СтрокаВДату("""дд ММММ гггг 'г.' ЧЧ:мм:сс""","12 мая 2021 г. 8:49:22",Ложь)возвращает пустую дату.......
Посмотрел код - там проблема в том, что я передаю название месяца в родительном падеже, а ваша функция рассчитана на именительный...
Функция СтрокаВДату(Дано) Экспорт
Дано = СтрЗаменить(Дано, ":"," ");
Дано = СтрЗаменить(Дано, "января","01");
Дано = СтрЗаменить(Дано, "февраля", "02");
Дано = СтрЗаменить(Дано, "марта", "03");
Дано = СтрЗаменить(Дано, "апреля", "04");
Дано = СтрЗаменить(Дано, "мая", "05");
Дано = СтрЗаменить(Дано, "июня", "06");
Дано = СтрЗаменить(Дано, "июля", "07");
Дано = СтрЗаменить(Дано, "августа", "08");
Дано = СтрЗаменить(Дано, "сентября", "09");
Дано = СтрЗаменить(Дано, "октября", "10");
Дано = СтрЗаменить(Дано, "ноября", "11");
Дано = СтрЗаменить(Дано, "декабря", "12");
МассивДаты=СтрРазделить(Дано," ");
Попытка
Возврат Дата(""+МассивДаты[2]+МассивДаты[1]+МассивДаты[0]+?(СтрДлина(МассивДаты[4])=1,""+"0"+МассивДаты[4],МассивДаты[4])+МассивДаты[5]+МассивДаты[6]);
Исключение
Возврат Дата('00010101');
КонецПопытки
КонецФункции ПоказатьНе особо универсально конечно, но работает ))
ДатаСтрокой = "2015-08-22";
ДатаДатой = Дата(СтрЗаменить(ДатаСтрокой, "-", "")); // 22.08.2015 0:00:00
ну, то есть сначала надо вырезать все разделители и получить непрерывный набор цифр:
Дата("20150822110645") равносильно 22.08.2015 11:06:45
Функция ПолучитьДату(тДата)
ТаблицаМесяцев = Новый ТаблицаЗначений;
ТаблицаМесяцев.Колонки.Добавить("Номер");
ТаблицаМесяцев.Колонки.Добавить("Написание");
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "01";
Нстр.Написание = "ЯНВРАРЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "02";
Нстр.Написание = "ФЕВРАЛЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "03";
Нстр.Написание = "МАРТА";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "04";
Нстр.Написание = "АПРЕЛЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "05";
Нстр.Написание = "МАЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "06";
Нстр.Написание = "ИЮНЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "07";
Нстр.Написание = "ИЮЛЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "08";
Нстр.Написание = "АВГУСТА";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "09";
Нстр.Написание = "СЕНТЯБРЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "10";
Нстр.Написание = "ОКТЯБРЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "11";
Нстр.Написание = "НОЯБРЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "12";
Нстр.Написание = "ДЕКАБРЯ";
тДата = СокрЛП(СтрЗаменить(тДата,"г."," "));
ДоПробела = Найти(тДата," ");
тЧисло = СокрЛП(Лев(тДата,ДоПробела));
тГод = СокрЛП(Прав(тДата,4));
ДлинаСтроки = СтрДлина(тДата);
МесяцСтрока = Лев(тДата,ДлинаСтроки-4);
ДлинаМесяца = СтрДлина(МесяцСтрока);
МесяцСтрока = СокрЛП(Прав(МесяцСтрока,ДлинаМесяца-2));
СтрТабл = ТаблицаМесяцев.Найти(ВРег(МесяцСтрока),"Написание");
тМесяц = СтрТабл.Номер;
Дат = Дата(тГод+тМесяц+тЧисло);
Возврат Дат;
КонецФункции
ПоказатьИсправленный вариант |
|---|
Функция ПолучитьДату(тДата)
ТаблицаМесяцев = Новый ТаблицаЗначений;
ТаблицаМесяцев.Колонки.Добавить("Номер");
ТаблицаМесяцев.Колонки.Добавить("Написание");
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "01";
Нстр.Написание = "ЯНВАРЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "02";
Нстр.Написание = "ФЕВРАЛЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "03";
Нстр.Написание = "МАРТА";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "04";
Нстр.Написание = "АПРЕЛЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "05";
Нстр.Написание = "МАЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "06";
Нстр.Написание = "ИЮНЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "07";
Нстр.Написание = "ИЮЛЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "08";
Нстр.Написание = "АВГУСТА";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "09";
Нстр.Написание = "СЕНТЯБРЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "10";
Нстр.Написание = "ОКТЯБРЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "11";
Нстр.Написание = "НОЯБРЯ";
нстр = ТаблицаМесяцев.Добавить();
Нстр.Номер = "12";
Нстр.Написание = "ДЕКАБРЯ";
тДата = СокрЛП(СтрЗаменить(тДата,"г."," "));
ДоПробела = Найти(тДата," ");
тЧисло = Строка(Формат(Число(СокрЛП(Лев(тДата,ДоПробела))),"ЧЦ=2; ЧВН="));
тГод = СокрЛП(Прав(тДата,4));
ДлинаСтроки = СтрДлина(тДата);
МесяцСтрока = Лев(тДата,ДлинаСтроки-4);
ДлинаМесяца = СтрДлина(МесяцСтрока);
МесяцСтрока = СокрЛП(Прав(МесяцСтрока,ДлинаМесяца-2));
СтрТабл = ТаблицаМесяцев.Найти(ВРег(МесяцСтрока),"Написание");
тМесяц = СтрТабл.Номер;
Дат = Дата(тГод+тМесяц+Строка(тЧисло));
Возврат Дат;
КонецФункции Показать |
Функция ДатаИзСтроки(СтрокаДата)
Возврат Дата(
Сред(СтрокаДата,7,4)
+ Сред(СтрокаДата,4,2)
+ Лев(СтрокаДата,2)
+ Сред(СтрокаДата,12,2)
+ Сред(СтрокаДата,15,2)
+ Сред(СтрокаДата,18,2)
);
КонецФункции ПоказатьФункция СтрокаВДату(Знач ДатаСтрока)
ОписаниеТипа = Новый ОписаниеТипов("Дата");
Результат = ОписаниеТипа.ПривестиЗначение(ДатаСтрока);
Если ЗначениеЗаполнено(Результат) Тогда
Возврат Результат;
КонецЕсли;
ПозицияПробела = СтрНайти(ДатаСтрока, " ", НаправлениеПоиска.СНачала);
Если ПозицияПробела > 0 Тогда
ДатаСтрока = Лев(ДатаСтрока, ПозицияПробела - 1);
КонецЕсли;
ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, ".", ""));
ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, ",", ""));
ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, ":", ""));
ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, "/", ""));
ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, "-", ""));
ДатаСтрока = Сред(ДатаСтрока, 5) + Сред(ДатаСтрока, 3, 2) + Лев(ДатаСтрока, 2);
Если СтрДлина(ДатаСтрока) = 6 Тогда
ДатаСтрока = "20" + ДатаСтрока;
КонецЕсли;
//ОписаниеТипа = Новый ОписаниеТипов("Дата");
Результат = ОписаниеТипа.ПривестиЗначение(ДатаСтрока);
Возврат Результат;
КонецФункции ПоказатьПотому, что для пустой даты название месяца не вернет, у меня возвращает "" (пустую строку). В синтакс помощнике сказано, что должен возвращать строку "Пустая дата".
И даже если написать Дата(2,ё,1), тоже не подходит, т.к. название месяца идет в именительном падеже ("Январь"), а в формате "ДЛФ = DD" месяцы идут в родительном ("Января").
Но логика понятна, буду с утра разбираться. Сервак отрубился удаленный.
Дата(ДатаСтрокой + " 00:00:00")
функция разбирает любые корректные даты
// Функция преобразует строку в дату
//
// Параметры:
// ДатаСтрокой - строка - дата в любом формате даты
// АмериканскийФормат - булево - нужно указывать если известно, что дата в таком формате ММ/ДД/ГГГГ
//
// Возвращаемое значение:
// Значение типа "Дата"
//
Функция ПолучитьДатуИзСтроки(Знач ДатаСтрокой,АмериканскийФормат=Ложь)
Если ПустаяСтрока(ДатаСтрокой) Тогда
Возврат Дата("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");
КонецПопытки;
КонецФункции // ПолучитьДатуИзСтроки
ПоказатьОтличная функция. Только из за этой строки "авГуст 2021" превращается в "авуст 2021" и соответственно возвращается пустая дата для всех августов
у себя заменил строку "ДатаСтрокой=СтрЗаменить(ДатаСтрокой,"г",""); // 31 декабря 2013 г -> 31 декабря 2013" на
Если Прав(ДатаСтрокой,1)="г" Тогда
ДатаСтрокой=Лев(СтрДлина(ДатаСтрокой)-1);
КонецЕсли;
Рейтинг: 158
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 92455
Создание 29.09.11 16:52
Обновление 29.11.11 04:19
Просмотры 111832
Загрузки 0
Рейтинг
130
Комментарии 57
Код открыт Не указано
Рубрики Универсальные функции
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)