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

46 Comments

  1. maxtomsk

    Функция преобразование всяких вариантов строк в дату. Искал, но не нашел на сайте.

    Преобразовывает СТРОКИ вида «01/10/13″,»01-10-2013″,»10,13″,»10.13″,»01.03.2013 0:00:00» к типу ДАТА

    Может, кому пригодится.

    В обработке используется стандартная функция разложить строку, указываю ее ниже.

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

    Reply
  2. dv2008

    неплохо, только можно было бы разделитель сделать параметром, и код бы упростился

    Reply
  3. maxtomsk

    (1) dv2008, Я уже думал, но у меня с разных мест идет дата в разных форматах, поэтому чтоб не гадать, поставил все на проверку…

    Reply
  4. tdr1225

    (1),(2)

    по поводу параметра-разделителя

    а он нужен?

    попробуйте такое:

    Код
    ст = "01-10-2013";
    сообщить(Дата(ст)); 

    Показать полностью

    попробуйте вместо минуса использовать другой символ, букву

    попробуйте разные символы, напр., "01{10}2013"

    будете приятно удивлены

    Reply
  5. maxtomsk

    (3) tdr1225,

    попробовал Ваш код, у меня выдает ошибку. что с фигурными скобками, что с минусом:

    {(2)}: Преобразование значения к типу Дата не может быть выполнено

    Reply
  6. tdr1225

    (4) какой релиз 1с?

    Reply
  7. abc2000

    Побробуйте, передать строку 01.10/2013 или 01-10/2011. Ваша Функция не совершена.

    Reply
  8. dumal

    Как правило, необходимость перевода строки в дату возникает при загрузке информации откуда-нибудь (например, из текстового файла, или Экселя). В таком случае, написать парсер для даты совсем несложно — потому что все строки одного вида. Таким образом, универсальность здесь оказывается не то чтобы лишней, но может заметно замедлить загрузку. Тем не менее, безусловно, полезная вещь. Отдельное спасибо за открытость

    Reply
  9. askorn

    вот пример с меньшей функциональностью и с меньшим временем выполнения:

    Функция ДатаИзСтроки10(стрДата) экспорт // «01.12.2011» преобразует в ‘01.12.2011 0:00:00’

    Попытка

    возврат Дата(Сред(стрДата,7,4)+Сред(стрДата,4,2)+Лев(стрДата,2))

    Исключение

    возврат ‘00010101’

    КонецПопытки;

    КонецФункции // ДатаИзСтроки10()

    Reply
  10. SERJ_1CC

    Тоже не лишнее.. +1

    Reply
  11. finder10

    Только что преогромно выручил. Преогромное же спасибо. Нет, вернее, СПАСИБО!

    Reply
  12. hr7095

    Спасибо, пригодилось. Сэкономил время.

    Reply
  13. petrovaUL

    Спасибо. Пригодилось.

    Reply
  14. ponaroshku

    Спасибо

    Reply
  15. Созинов

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

    Reply
  16. ula1c

    Спасибо. Делала импорт отсканированных Товарных чеков из EXCEL в авансовый отчет. Для этого сначала в EXCEL дату входящего документа преобразовывала из формата Текст в формат Дата, а затем в формат число. Далее при импорте в 1с необходимо было преобразовать это число-дату в дату 1с — при этом учесть и то, что в EXCEL исчисление даты начинается с 01.01.1900 и то, что в EXCEL 1900год — высокосный год. Выглядело это так:

    ДатаВходящегоДокумента = Дата(‘19000101’)+(86400*(Число(ДатаВходящегоДокумента)-2)

    с вашей функцией как-то лаконичней:

    ДатаВходящегоДокумента = ПолучитьДатуИзСтроки(ДатаВходящегоДокумента)

    К тому же избавилась от ненужных преобразований даты в EXCEL .

    Reply
  17. Nata

    Спасибо. Очень пригодилась.

    (6) Хочу сказать, что вся 1С далека от совершенства.

    Согласна с (7) — Отдельное спасибо за открытость.

    Reply
  18. Sasha255n

    Спсибо Долго рассказывать для чего но пригодилась

    Reply
  19. _n26__

    Большое спасибо! Очень нужная и полезная вещица! Пригодилась вовремя! Спасибо!

    Reply
  20. Lo1jke

    Даже не пришлось думать, спасибо. Очень помогает постоянно.

    Reply
  21. Kaavan
     тест 
    Reply
  22. Kaavan
    Reply
  23. ITAlex

    Вот спасибо!

    а если в переданной строке заменить разделитель на некий стандартный (напр. «%»), тогда код можно сделать компактнее, т.е. только для стандартного разделителя.

    Reply
  24. JLaikova

    Спасибо! Помогла очень функция!!!!

    Reply
  25. victor_k

    Спасибо. свою делать лень. пригодилась.

    Reply
  26. ssa

    Спасибо, пригодилось.

    Reply
  27. ololoanonim

    Спасибо. Оооооочень полезная вещь.

    Reply
  28. kentavr27

    Может кому понадобится без длинных функций… так вот, как ни странно, но работает такая конструкция:

    Дата(«03.06.2014 0:15:55»); =>  03.06.2014 0:15:55 //Тип(«Дата»)

    равно как

    Дата(«3.6.2014 0:15:55»); =>  03.06.2014 0:15:55 //Тип(«Дата»)
    Reply
  29. sanja

    Спасибо, пригодилась функция.

    Reply
  30. Vodoley

    а нет у кого варианта преобразовать из строки вида 06 ноября 2014 г.

    а то ничего путного в голову не приходит: придется все имена месяцев перебирать (

    Reply
  31. AndreykO

    (27) kentavr27, при чём Дата(«03.06.2014»); не сработает, вызовет исключение, а Дата(«03.06.2014 00:00:00»); — сработает. Хотя это и странно, ведь в СП именно год на первом месте…

    Reply
  32. ildarovich

    (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’
    КонецПопытки
    КонецФункции

    Показать

    Это универсальная функция — работает с любым форматом даты. В том числе с тем, где месяц написан прописью. Дни недели разве что словами нельзя (в данной реализации) называть.

    Reply
  33. Mart

    А мне подошел вот такой вариант:

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

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

    Дата(«20150822110645») равносильно 22.08.2015 11:06:45

    Reply
  34. DrBlack

    (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’;
    КонецПопытки
    КонецФункции

    Показать

    Reply
  35. ildarovich

    (33) DrBlack, мне самому решение задачи №13 не очень нравится. Я его привел «за компанию» с другими комментариями. Не для того, чтобы использовать в готовом виде, а для того, чтобы можно было извлечь приемы использования соответствия в этой задаче.

    Reply
  36. Winston

    Спасибо. Очень помогло. Всё работает, просто замечательно.

    Reply
  37. AndreykO

    Спасибо. Очень помогло. Всё работает.

    Reply
  38. dmpolik

    Делал себе функцию для даты из exel… функция не универсальная, для решения локальной задачи.

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

    Показать

    Reply
  39. dmpolik

    забыл дата формата «27 ноября 2015 г.»

    Reply
  40. ivprovotorov

    Спасибо. Мне в обработку загрузки из excel вполне пришлось к месту

    Reply
  41. m.s.moiseev
    Функция ДатаИзСтроки(СтрокаДата)
    
    Возврат Дата(
    Сред(СтрокаДата,7,4)
    + Сред(СтрокаДата,4,2)
    + Лев(СтрокаДата,2)
    + Сред(СтрокаДата,12,2)
    + Сред(СтрокаДата,15,2)
    + Сред(СтрокаДата,18,2)
    );
    
    КонецФункции

    Показать

    Reply
  42. Srv1313
    Функция СтрокаВДату(Знач ДатаСтрока)
    
    ОписаниеТипа = Новый ОписаниеТипов(«Дата»);
    Результат    = ОписаниеТипа.ПривестиЗначение(ДатаСтрока);
    
    Если ЗначениеЗаполнено(Результат) Тогда
    Возврат Результат;
    КонецЕсли;
    
    ПозицияПробела = СтрНайти(ДатаСтрока, » «, НаправлениеПоиска.СНачала);
    Если ПозицияПробела > 0 Тогда
    ДатаСтрока = Лев(ДатаСтрока, ПозицияПробела — 1);
    КонецЕсли;
    
    ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, «.», «»));
    ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, «,», «»));
    ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, «:», «»));
    ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, «/», «»));
    ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, «-«, «»));
    
    ДатаСтрока = Сред(ДатаСтрока, 5) + Сред(ДатаСтрока, 3, 2) + Лев(ДатаСтрока, 2);
    Если СтрДлина(ДатаСтрока) = 6 Тогда
    ДатаСтрока = «20» + ДатаСтрока;
    КонецЕсли;
    
    //ОписаниеТипа = Новый ОписаниеТипов(«Дата»);
    Результат    = ОписаниеТипа.ПривестиЗначение(ДатаСтрока);
    
    Возврат Результат;
    
    КонецФункции

    Показать

    Reply
  43. Stivens

    В замечательном примере вот этот кусок не работает: Формат(Дата(1, ё, 1), «ДФ=MMММ»)

    Потому, что для пустой даты название месяца не вернет, у меня возвращает «» (пустую строку). В синтакс помощнике сказано, что должен возвращать строку «Пустая дата».

    И даже если написать Дата(2,ё,1), тоже не подходит, т.к. название месяца идет в именительном падеже («Январь»), а в формате «ДЛФ = DD» месяцы идут в родительном («Января»).

    Но логика понятна, буду с утра разбираться. Сервак отрубился удаленный.

    Reply
  44. Stivens

    В общем сделал так Сред(Формат(Дата(2019, ё, 10), «ДФ=ddMMMM»), 3)

    Reply
  45. max_zhilin

    Для загрузки формата «26.07.2019» сделал просто:

    Дата(ДатаСтрокой + » 00:00:00″)

    Reply
  46. altmf

    (37)Тема давно уже прошла, но все же. Воспользовался вашей функцией, спасибо, сэкономил несколько минут. В ней опечатка в слове «января» и некорректно распознаются числа, меньшие 10 т..к отсутствуют лидирующие нули.

    Исправленный вариант
    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *