Часто при работе 1С со сторонними информационными системами (например, при парсинге сайтов) необходимо из строковой переменной получить дату. Когда одна 1С общается с другой, такой проблемы при грамотной архитектуре не возникает. Разберем, как можно конвертировать значение строкового типа в дату.
Функция Дата() для преобразования строки в дату в 1С
Для преобразования строки в дату используют функцию Дата(). Эта функция имеет два варианта синтаксиса.
Первый вариант синтаксиса - передать строку с локальном формате даты. Обязательно с указанием года из четырех цифр, месяца из двух цифр, даты из двух цифр, далее часа из двух цифр, аналогично минут и секунд. Формат этот можно представить так: "ГГГГММДДччммсс".
Второй вариант синтаксиса - передать в параметрах функции Дата() информацию о годе, месяце, дне, часе, минутах и секундах через запятую. Все шесть переменных должны быть числового формата.
Информацию из синтакс-помощника с примерами конвертации читайте в конце статьи.
Функция СтрокаВДату() из БСП для конвертации строки в дату по формату
Плохо, что в платформе 1С нет стандартной функции для преобразования строки в дату. Такая функция нужна, т.к. чаще всего дата в виде строки, полученная парсингом сайта или из других информационных систем, выглядит так: “21.07.2025”. И вот чтобы ее превратить в дату с помощью функции Дата(), нужно долго разбивать строку точками на день, месяц, год, потом конвертировать в число и потом передавать в функцию Дата(). Необходимо более простой инструмент.
Быстро конвертируйте в дату с помощью функции БСП СтрокаВДату().
В некоторых версиях БСП функция находится в общем модуле СтроковыеФункцииКлиентСервер, а в других - в ОбщегоНазначенияКлиентСервер. Определяйте имя общего модуля в своем случае самостоятельно.
Пример вызова может выглядеть так:
Результат = СтроковыеФункцииКлиентСервер.СтрокаВДату(МояСтрока);
Или так:
Результат = ОбщегоНазначенияКлиентСервер.СтрокаВДату(Значение)
А если в конфигурации 1С нет БСП?
В этом случае можете добавить код функции СтрокаВДату() и вызывать ее из кода. Программный код может выглядеть следующим образом:
// Преобразует исходную строку в дату.
//
// Параметры:
// ДатаСтрока - Строка - Строка, которую необходимо привести к дате.
//
// Возвращаемое значение:
// Дата - Полученная дата.
//
Функция СтрокаВДату(Знач ДатаСтрока) Экспорт
ПозицияПробела = СтрНайти(ДатаСтрока, " ", НаправлениеПоиска.СНачала);
Если ПозицияПробела > 0 Тогда
ДатаСтрока = Лев(ДатаСтрока, ПозицияПробела - 1);
КонецЕсли;
ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, ".", ""));
ДатаСтрока = Сред(ДатаСтрока, 5) + Сред(ДатаСтрока, 3, 2) + Лев(ДатаСтрока, 2);
Если СтрДлина(ДатаСтрока) = 6 Тогда
ДатаСтрока = "20" + ДатаСтрока;
КонецЕсли;
ОписаниеТипа = Новый ОписаниеТипов("Дата");
Результат = ОписаниеТипа.ПривестиЗначение(ДатаСтрока);
Возврат Результат;
КонецФункции
Когда формат отличается от “DD.MM.YYYY”, есть синтаксис с указанием формата даты. В этом случае код функции выглядит следующим образом:
//Преобразование строки в дату/время с указанием строки форматирования.
//При ошибке преобразования генерируется исключение.
//Допустимые значения в строке форматирования:
// 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)))
)
Исключение
ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату по формату """ + ФорматДаты + """"
КонецПопытки;
Иначе
Возврат Неопределено
КонецЕсли;
КонецФункции // СтрокаВДатуВремя
Информация про функцию Дата() из синтакс-помощника
Глобальный контекст (Global context)
Дата (Date)
Вариант синтаксиса: По строке
Синтаксис:
Дата(<Значение>)
Параметры:
<Значение> (обязательный)
Тип: Строка.
Исходное значение даты.
Строка должна содержать дату в локальном формате даты или в каноническом виде YYYYMMDDHHMMSS.
Описание варианта метода:
При преобразовании строка должна содержать дату в каноническом формате "ГГГГММДДччммсс" (см. раздел "Примитивные типы данных").
Вариант синтаксиса: По составляющим
Синтаксис:
Дата(<Год>, <Месяц>, <День>, <Час>, <Минута>, <Секунда>)
Параметры:
<Год> (обязательный)
Тип: Число.
Год даты.
<Месяц> (обязательный)
Тип: Число.
Месяц даты.
<День> (обязательный)
Тип: Число.
День даты.
<Час> (необязательный)
Тип: Число.
Час даты.
<Минута> (необязательный)
Тип: Число.
Минута даты.
<Секунда> (необязательный)
Тип: Число.
Секунда даты.
Описание варианта метода:
Допускаются следующие формы задания параметров:
- Дата(Год, Месяц, День);
- Дата(Год, Месяц, День, Час, Минута, Секунда);
Возвращаемое значение:
Тип: Дата.
Описание:
Преобразует полученный параметр (параметры) в значение типа Дата.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Внимание: Данный метод не поддерживается при работе через COM-соединение
Для преобразования строки в дату в 1С можно использовать функцию «Дата()».
Вариант 1: преобразование по строке. Строка должна содержать дату в локальном формате или в каноническом виде YYYYMMDDHHMMSS. Пример: Дата("20211231123456").
Вариант 2: преобразование по составляющим частям. Если известны составные части даты — год, месяц, день и т. д., можно использовать конструктор даты по составляющим. Задавать параметры можно как в виде строки, так и числом. Пример: Дата("2021", "12", "24", "12", "34", "56").
Также для преобразования строки в дату в 1С можно использовать функцию СтрокаВДату(Строка, Формат), которая преобразует строку в значение типа Дата в соответствии с заданным форматом.