При импорте данных или обработке текстов разработчики часто сталкиваются с датами, записанными в виде строк с двузначным указанием года (например, "27.10.92"). Попытка напрямую передать такую строку во встроенную функцию Дата() приводит к ошибке, так как платформа 1С требует либо канонический формат без разделителей "ГГГГММДД", либо явное указание четырехзначного года при разборе компонентов.
Рассмотрим подробно, почему возникает эта проблема и каким образом правильно преобразовать подобную строку в полноценное значение типа Дата с корректным определением столетия.
Проанализируем базовые ограничения платформы 1С при работе с датами:
Дата("27.10.92") вызовет ошибку приведения типов, так как встроенный конструктор ожидают строку формата "19921027" (без точек и разделителей).Сред(ИзмДата, 0, 2) являются ошибочными.Дата(Год, Месяц, День) значение года должно состоять из четырех цифр. Если передать двузначный год 92, платформа воспримет его буквально как 0092 год нашей эры.Выясним, как правильно вырезать компоненты даты из строки и добавить вековой префикс ("19" или "20"). Для этого выделим подстроку года и сравним ее с граничным значением.
Посмотрим на пример функции, разбирающей строку вида "27.10.92":
Функция РазобратьДату(ИзмДата)
Год = Сред(ИзмДата, 7, 4);
Если СтрДлина(Год) < 4 Тогда
ГодЧислом = Число(Год);
ГодНачалаСтолетия = 20; // Пороговый год
Если ГодЧислом > ГодНачалаСтолетия Тогда
Год = "19" + Год;
Иначе
Год = "20" + Год;
КонецЕсли;
КонецЕсли;
Возврат Дата(Год + Сред(ИзмДата, 4, 2) + Сред(ИзмДата, 1, 2));
КонецФункции
В данном примере, если двузначный год больше 20 (например, 92), к нему добавляется префикс "19" (получаем 1992 год). Если год меньше или равен 20 (например, 15), подставляется "20" (2015 год).
Если формат входящей строки может меняться (использоваться слэши /, дефисы - или точки .), привязка к точным позициям символов через Сред() станет источником ошибок. В этом случае удобнее заменить все разделители на перевод строки и извлечь составные части по номерам строк.
Разберем по шагам данный подход:
Функция ПреобразоватьСтрокуВДату(Знач СтрДата)
// Приводим все возможные разделители к единому виду
СтрДата = СтрЗаменить(СтрДата, ".", Символы.ПС);
СтрДата = СтрЗаменить(СтрДата, "/", Символы.ПС);
СтрДата = СтрЗаменить(СтрДата, "-", Символы.ПС);
День = Число(СтрПолучитьСтроку(СтрДата, 1));
Месяц = Число(СтрПолучитьСтроку(СтрДата, 2));
Год = Число(СтрПолучитьСтроку(СтрДата, 3));
// Если год двузначный, определяем вековой период
Если Год < 100 Тогда
Если Год > 20 Тогда
Год = 1900 + Год;
Иначе
Год = 2000 + Год;
КонецЕсли;
КонецЕсли;
Возврат Дата(Год, Месяц, День);
КонецФункции
Если разработка ведется в типовой конфигурации, где подключена Библиотека Стандартных Подсистем (БСП), нет необходимости писать собственные функции разбора. Достаточно использовать готовый метод общего модуля СтроковыеФункцииКлиентСервер:
ДатаРезультат = СтроковыеФункцииКлиентСервер.СтрокаВДату(Данные.ДатаРождения);
Данный метод автоматически обрабатывает большинство распространенных форматов дат и корректно преобразует строку в тип Дата.