1С 8.3 Преобразование строки в дату (типовая функция) — Программист 1С Минск. Автоматизация бизнеса.

1С 8.3 Преобразование строки в дату (типовая функция)
Данные > Примеры кода 1С > 1С 8.3 Дата и время
ПРИМЕРЫ КОДА 1С
Перейти в основной раздел:

Типовая экспортная функция преобразования строки в дату в 1С 8.3:
Функция СтрокаВДату (Знач ДатаСтрока )
ПозицияПробела = СтрНайти ( ДатаСтрока , » » , НаправлениеПоиска . СНачала );
Если ПозицияПробела > 0 Тогда
ДатаСтрока = Лев ( ДатаСтрока , ПозицияПробела — 1 );
КонецЕсли;
ДатаСтрока = СокрЛП ( СтрЗаменить ( ДатаСтрока , «.» , «» ));
ДатаСтрока = Сред ( ДатаСтрока , 5 ) + Сред ( ДатаСтрока , 3 , 2 ) + Лев ( ДатаСтрока , 2 );
Если СтрДлина ( ДатаСтрока ) = 6 Тогда
ДатаСтрока = «20» + ДатаСтрока ;
КонецЕсли;
ОписаниеТипа = Новый ОписаниеТипов ( «Дата» );
Результат = ОписаниеТипа . ПривестиЗначение ( ДатаСтрока );
Улучшенный аналог СтрокаВДату() от UHоldеr в 1С 8.3:
//Преобразование строки в дату/время с указанием строки форматирования.
//При ошибке преобразования генерируется исключение.
//Допустимые значения в строке форматирования:
// yyyy — год полностью
// yy — год сокращённо
// mm — месяц
// dd — день
// hh — часы
// nn — минуты
// ss — секунды
// Разделитель в исходной строке и строке форматирования может различаться.
//
// Параметры:
// ДатаСтрока — Строка — Исходная строка с датой
// ФорматДаты — Строка — Формат даты в переданной строке
//
// Возвращаемое значение:
// Дата
//
// Пример:
// СтрокаВДатуВремя(«02.06.22», «dd.mm.yy»)
// СтрокаВДатуВремя(«02.06.22 12:30:00, «dd.mm.yy hh:nn:ss»)
// СтрокаВДатуВремя(«02/06/22 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 )))
)
Исключение
ВызватьИсключение «Ошибка преобразования строки «»» + ДатаСтрока + «»» в дату по формату «»» + ФорматДаты + «»»»
КонецПопытки;
Иначе
Возврат Неопределено
КонецЕсли;
КонецФункции // СтрокаВДатуВремя
Улучшенный аналог СтрокаВДату() от подписчика в 1С 8.3:
Функция ПреобразоватьСтрокуКДате (Знач СтрокаДаты ) Экспорт
Если ТипЗнч ( СтрокаДаты ) = Тип ( «Дата» ) Тогда
Возврат СтрокаДаты ;
ИначеЕсли ТипЗнч ( СтрокаДаты ) <> Тип ( «Строка» ) Или ПустаяСтрока ( СтрокаДаты ) Тогда
Возврат Дата ( 1 , 1 , 1 );
КонецЕсли;
СтрокаДаты = ВРег ( СтрокаДаты );
НеобходимоПриводитьКМестномуВремени = Ложь;
СимволРазделенияДаты = СтрНайти ( СтрокаДаты , «T» , НаправлениеПоиска . СКонца );
Если СимволРазделенияДаты = 0 Тогда
СимволРазделенияДаты = СтрНайти ( СтрокаДаты , » » , НаправлениеПоиска . СКонца );
КонецЕсли;
СмещениеЧасы = 0 ;
СмещениеМинуты = 0 ;
ВремяМеньшеUTC = Ложь;
Если СтрНайти ( СтрокаДаты , «Z» ) > 0 Тогда
НеобходимоПриводитьКМестномуВремени = Истина;
СтрокаДаты = СтрЗаменить ( СтрокаДаты , «Z» , «.» );
ИначеЕсли СимволРазделенияДаты > 0 Тогда
СимволЧП = СтрНайти ( СтрокаДаты , «-» ,, СимволРазделенияДаты );
Если СимволЧП = 0 Или СимволЧП СимволЧП = СтрНайти ( СтрокаДаты , «+» ,, СимволРазделенияДаты );
Иначе
ВремяМеньшеUTC = Истина;
КонецЕсли;
Если СимволЧП <> 0 И СимволЧП > СимволРазделенияДаты Тогда
НеобходимоПриводитьКМестномуВремени = Истина;
ЧастьЧП = Сред ( СтрокаДаты , СимволЧП + 1 );
мЧастейДаты = СтрРазделить ( ЧастьЧП , «:» );
Попытка
СмещениеЧасы = ?( мЧастейДаты . Количество () > 0 , Число ( мЧастейДаты [ 0 ]), 0 );
СмещениеМинуты = ?( мЧастейДаты . Количество () > 1 , Число ( мЧастейДаты [ 1 ]), 0 );
Исключение
КонецПопытки;
СтрокаДаты = Лев ( СтрокаДаты , СимволЧП — 1 );
КонецЕсли;
КонецЕсли;
// Приведем к одному разделителю
СтрокаДаты = СтрЗаменить ( СтрокаДаты , «-» , «.» );
СтрокаДаты = СтрЗаменить ( СтрокаДаты , «+» , «.» );
СтрокаДаты = СтрЗаменить ( СтрокаДаты , «/» , «.» );
СтрокаДаты = СтрЗаменить ( СтрокаДаты , «\» , «.» );
СтрокаДаты = СтрЗаменить ( СтрокаДаты , «T» , «.» );
СтрокаДаты = СтрЗаменить ( СтрокаДаты , «Т» , «.» );
СтрокаДаты = СтрЗаменить ( СтрокаДаты , «:» , «.» );
СтрокаДаты = СтрЗаменить ( СтрокаДаты , «;» , «.» );
СтрокаДаты = СтрЗаменить ( СтрокаДаты , «,» , «.» );
СтрокаДаты = СтрЗаменить ( СтрокаДаты , » » , «.» );
ПреобразованнаяДата = Дата ( 1 , 1 , 1 );
Год = 1 ;
Месяц = 1 ;
День = 1 ;
Час = 0 ;
Минута = 0 ;
Секунда = 0 ;
мЧастейДаты = СтрРазделить ( СтрокаДаты , «.» , Ложь);
Если мЧастейДаты . Количество () = 1 Тогда
Попытка
ПреобразованнаяДата = Дата ( мЧастейДаты [ 0 ]);
Исключение
ПреобразованнаяДата = Дата ( 1 , 1 , 1 );
КонецПопытки;
Возврат ПреобразованнаяДата ;
ИначеЕсли мЧастейДаты . Количество () >= 3 Тогда
Попытка
Месяц = Число ( мЧастейДаты [ 1 ]);
Если СтрДлина ( мЧастейДаты [ 0 ]) = 4 Тогда
Год = Число ( мЧастейДаты [ 0 ]);
День = Число ( мЧастейДаты [ 2 ]);
ИначеЕсли СтрДлина ( мЧастейДаты [ 2 ]) = 4 Тогда
Год = Число ( мЧастейДаты [ 2 ]);
День = Число ( мЧастейДаты [ 0 ]);
Иначе
Год = Число (?( мЧастейДаты [ 2 ] >= 50 , Цел ( Год ( ТекущаяДата ()) / 100 ) — 1 ,
Цел ( Год ( ТекущаяДата ()) / 100 )) + мЧастейДаты [ 2 ]);
День = Число ( мЧастейДаты [ 0 ]);
КонецЕсли;
Час = ?( мЧастейДаты . Количество () > 3 , Число ( мЧастейДаты [ 3 ]), 0 );
Минута = ?( мЧастейДаты . Количество () > 4 , Число ( мЧастейДаты [ 4 ]), 0 );
Секунда = ?( мЧастейДаты . Количество () > 5 , Число ( мЧастейДаты [ 5 ]), 0 );
Исключение
Возврат ПреобразованнаяДата ;
КонецПопытки;
Иначе
Возврат ПреобразованнаяДата ;
КонецЕсли;
Попытка
ПреобразованнаяДата = Дата ( Год , Месяц , День , Час , Минута , Секунда );
Исключение
ПреобразованнаяДата = Дата ( 1 , 1 , 1 );
КонецПопытки;
Если Не ПреобразованнаяДата = Дата ( 1 , 1 , 1 ) И НеобходимоПриводитьКМестномуВремени Тогда
ТекущееСмещениеСек = СмещениеСтандартногоВремени ();
ТекСмещениеЧас = Цел ( ТекущееСмещениеСек / 3600 );
ТекСмещениеМин = Цел (( ТекущееСмещениеСек — ТекСмещениеЧас * 3600 ) / 60 );
ТекСмещениеМин = ?( ТекСмещениеМин < 0 , - 1 * ТекСмещениеМин , ТекСмещениеМин );
ТекущийЧП = СтрШаблон ( «GMT%1%2:%3» , ?( ТекСмещениеЧас >= 0 , «+» , «» ),
Формат ( ТекСмещениеЧас , «ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=; ЧГ=0» ),
Формат ( ТекСмещениеМин , «ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=; ЧГ=0» ));
ПришедшийЧП = СтрШаблон ( «GMT%1%2:%3» , ?( ВремяМеньшеUTC , «-» , «+» ),
Формат ( СмещениеЧасы , «ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=; ЧГ=0» ),
Формат ( СмещениеМинуты , «ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=; ЧГ=0» ));
Если ТекущийЧП = ПришедшийЧП Тогда
Возврат ПреобразованнаяДата ;
КонецЕсли;
Попытка
Если СмещениеЧасы <> 0 Или СмещениеМинуты <> 0 Тогда
ПреобразованнаяДата = УниверсальноеВремя ( ПреобразованнаяДата , ПришедшийЧП );
КонецЕсли;
ПреобразованнаяДата = МестноеВремя ( ПреобразованнаяДата , ТекущийЧП );
Исключение
КонецПопытки;
КонецЕсли;
Как преобразовать строку в дату 1С 8.3

Значение типа Дата – один из самых простых типов данных в 1С, который встречается практически постоянно. Ее значение содержит дату григорианского календаря с 01 января 0001 года с точностью до 0,1 миллисекунды.
Создание переменной типа дата приравнивается к переменной строки цифр ‘ГГГГММДДччммсс’, где ГГГГ – год, ММ – месяц, чч – часы (в формате 24 часа), мм – минуты, сс – секунды.
Часто возникают ситуации при работе в 1С перевести строку в дату. Например, при написании даты в формате 18.12.18, 18/12/2018, или другие варианты. Если часы, минуты, секунды опустить, то они приравняются к нулю. Если мы опускаем дату, то она считается равной 1.
Далее мы рассмотрим, как можно сделать преобразование строки в дату. Это действие несложное, но требует определенных знаний. Если у вас возникнут вопросы, обращайтесь за консультацией по программе 1С к нашим специалистам – мы с радостью вам поможем.
Рассмотрим, как можно сделать преобразование строки в дату.
- Преобразование строки вида «20181218»
// Преобразование строки вида 20181218 в дату Дата = Дата("20181218"); // 18.12.2018
- Преобразование строки вида «18.12.2018»
// Преобразование строки вида 18.12.1018 в дату Дата = Дата("2018.12.18"); // 18.12.2018
- Преобразование строки вида «2019, 1, 1»
// Преобразование строки вида 2019,1,1 в дату Дата = Дата("2019,1,1"); // 01.01.2019
- Преобразование строки вида «2018-12-18»
// Преобразование строки вида 2018-12-18 в дату СтрокаДата="2018-12-18"; СтрокаДата=СтрЗаменить(СтрокаДата,"-",""); НоваяДата = Дата(СтрокаДата); // 18.12.2018
- Преобразование строки вида «2018/12/18»
// Преобразование строки вида 2018/12/18 в дату СтрокаДата="2018/12/18"; СтрокаДата=СтрЗаменить(СтрокаДата,"/",""); НоваяДата = Дата(СтрокаДата); // 18.12.2018
В последних двух примерах удаляется лишний символ в написании даты. Это может быть любой символ разделитель, главное – его или убрать, или заменить точкой.
Предположим нам надо преобразовать дату, в которой сначала указано время, а затем сама дата.
- Преобразование строки вида «21:31:02 2018:12:18»
// Преобразование строки вида 21:31:02 2018:12:18 в дату СтрокаДата="21:31:02 2018:12:18"; СтрокаДата=СтрЗаменить(СтрокаДата,":",""); НоваяДата=Дата(Прав(СтрокаДата,8)+ЛевСтрокаДата,6);//18.12.2018 21.31.01
В данном примере мы заменяем символ «:» и берем 8 чисел справа (дату – год, месяц, день), затем приписываем к ним 6 чисел слева (время – часы, минуты, секунды).
Преобразовать строковое представление даты в значение типа дата, можно также используя функцию СтрВДату. Это более универсальная функция, поэтому она справляется с любым форматом написания даты, даже текстовым.
Сообщить(СтрВДату("18/12\2018 21-31-02")); Сообщить(СтрВДату("5/9/18")); Сообщить(СтрВДату("17/9/19")); Сообщить(СтрВДату("18 декабря 18 г. 21:31:02")); Сообщить(СтрВДату("1 янв. 2019 г ::"));
На примерах мы рассмотрели возможность преобразования строки в дату. Используя различные функции можно преобразовать строковое представление даты, введенное различными вариантами написания в значение типа дата. Такие преобразования необходимы, ведь бывает, что пользователь при вводе даты, используя дополнительную клавиатуру, установит как разделитель косую черту, запятую или другой знак, или из написанной текстом даты возникает необходимость ее преобразовать. Во всех этих случаях данные функции будут полезны.
Если у вас регулярно возникают вопросы по настройке программы, обратитесь к нашим специалистам: мы проконсультируем вас и сделаем соответствующие настройки, подобрав при этом оптимальный тариф на сопровождение 1С, исходя из ваших индивидуальных потребностей.
Функция для преобразование строки в дату 1С 8.3
Появилась идея написание своего велосипеда или идеальной функции для преобразования строки в дату.
Функция ПолучитьДатуИзСтроки(Знач Стр) ПустаяДата = Дата("00010101000000"); Если ПустаяСтрока(Стр) Тогда Возврат Стр; КонецЕсли; Стр = СокрЛП(НРег(Стр)); Стр = СтрЗаменить(Стр, "января", "01"); Стр = СтрЗаменить(Стр, "февраля", "02"); Стр = СтрЗаменить(Стр, "марта", "03"); Стр = СтрЗаменить(Стр, "апреля", "04"); Стр = СтрЗаменить(Стр, "мая", "05"); Стр = СтрЗаменить(Стр, "июня", "06"); Стр = СтрЗаменить(Стр, "июля", "07"); Стр = СтрЗаменить(Стр, "августа", "08"); Стр = СтрЗаменить(Стр, "сентября", "09"); Стр = СтрЗаменить(Стр, "октября", "10"); Стр = СтрЗаменить(Стр, "ноября", "11"); Стр = СтрЗаменить(Стр, "декабря", "12"); Стр = СтрЗаменить(Стр, ":", " "); Стр = СтрЗаменить(Стр, "t", " "); Стр = СтрЗаменить(Стр, "z", " "); Стр = СтрЗаменить(Стр, "+", " "); Стр = СтрЗаменить(Стр, Символы.НПП, " "); Д = СтрРазделить(Стр,".-/, "); Для сч = 0 по Д.ВГраница() Цикл Если СтрДлина(Д[сч])=1 Тогда Д[сч] = "0"+Д[сч]; КонецЕсли; КонецЦикла; Если Д.Количество() = 1 И СтрДлина(Стр)=8 ИЛИ СтрДлина(Стр)=14 Тогда Результат = Стр; ИначеЕсли Д.Количество() = 2 И (СтрДлина(Стр) = 15 ИЛИ СтрДлина(Стр) = 13) Тогда //20130225T182510 ИЛИ 20130225T1825 Результат = СтрСоединить(Д); ИначеЕсли Д.Количество() 3 Тогда Возврат ПустаяДата; Иначе Если СтрДлина(Д[0]) = 4 Тогда //Формат гггг.мм.дд Результат = Д[0] + Д[1] + Д[2]; ИначеЕсли СтрДлина(Д[0]) 3 Тогда //формат дд.мм.гггг Результат = ?(СтрДлина(Д[2])=2,"20"+Д[2],Д[2]) + Д[1] + Д[0]; Иначе Возврат ПустаяДата; КонецЕсли; Если Д.Количество() = 5 Тогда Результат = Результат + Д[3] + Д[4]; КонецЕсли; Если Д.Количество() > 5 Тогда Результат = Результат + Д[3] + Д[4] + Д[5]; КонецЕсли; КонецЕсли; Попытка Возврат Дата(Результат); Исключение Возврат ПустаяДата; КонецПопытки; КонецФункции // ПолучитьДатуИзСтроки()
Как в 1С преобразовать строку в дату
Этот вопрос на первый взгляд достаточно простой. Но стоит только посмотреть на все возможные строковые представления дат (форматы дат), то задача получения даты из строки уже не кажется такой легкой. Ниже несколько примеров, как записывается дата в разных странах:
- Россия: DD.MM.YYYY Пример: 24.12.2021
- США: MM-DD-YYYY Пример: 12.24.2021
- Венгрия: YYYY-MM-DD Пример 2021-12-24
Чтобы еще больше запутать ситуацию Чтобы внести единообразие в написание даты, был разработан стандарт ISO 8601, который предусматривает запись даты от более значимых чисел к менее значимым – год, месяц, день… и так далее. Пример: 20221224123456. Для удобства можно пользоваться разделителями. Пример
2022-12-24T12:34:56. Это важный момент, и ниже мы к нему вернемся.
Способы преобразования даты из строки
Метод Дата(), вариант по строке
Простейший способ, который подходит, если строка с датой каноническому формату YYYYMMDDhhmmss – это использовать метод Дата(). Пример:
Дата("20211231123456")
Получим значение с типом дата: 31.12.2021 12:34:56
Также, этот метод подходит, если строка с датой записана в локальном формате (т.е. совпадает с форматом даты операционной системы).
Например, в случае если в ОС выбран русский язык, то можно получить из строки дату вот так:
Дата("24.12.2022 12:34:56")
Результат будет 24.12.2022 12:34:56
А если у вас в настройках выбран формат Английский (США), то строковое представление даты должно быть другим:
Дата("12/24/2022 01:34:56 PM")
Важно! В случае использования строки с датой в локальном формате, она должна точно соответствовать этому формату! Иначе метод выдаст ошибку “Преобразование значения к типу Дата не может быть выполнено”.
Метод Дата(), вариант по составляющим
Если нам известны составные части даты – год, месяц, день и т.д., можно использовать конструктор даты по составляющим. Задавать параметры можно как в виде строки, так и числом. Таким образом можно собрать дату из частей. Сами части можно получить различными способами – например, использовать преобразование строки в массив подстрок с помощью метода СтрРазделить().
Дата("2021", "12", "24", "12", "34", "56")
Как получить дату из строки с разделителями?
Вот мы и вернулись к вопросу – что делать, когда строка даты содержит разделители – двоеточия, слеши, дефисы или другие. Можно поочередно очищать дату от лишних символов с помощью метода СтрЗаменить, например
ДатаСтрокой = "2021/12-31 12:34:56" ДатаСтрокой = СтрЗаменить(ДатаСтрокой, "-", ""); ДатаСтрокой = СтрЗаменить(ДатаСтрокой, "/", ""); ДатаСтрокой = СтрЗаменить(ДатаСтрокой, ":", "");
Но есть более интересный способ – использование двойного преобразования строки – сперва в массив, а затем обратно:
СтрСоединить(СтрРазделить(ДатаСтрокой, "-/ :"), "");
Что делает этот код:
Мы сперва преобразуем строку в массив подстрок, разделяя по символам-разделителям пр помощи метода СтрРазделить. В нашем примере это пробел, слеш, двоеточие и дефис. Если нам нужно будет добавить какие-то другие символы – можно будет просто дополнить строку символов-разделителей.
А дальше мы обратно собираем из массива строку при помощи метода СтрСоединить;
Надеюсь, статья поможет вам разобраться, как преобразовать строку в дату. Если же хотите получить более цельное представление о разработке в 1С с нуля – рассмотрите мой видеокурс для начинающих.