При загрузке данных из внешних файлов или смежных систем (например, таблиц Excel или выгрузок из 1С 7.7) разработчики часто получают даты в формате строки с сокращенным двузначным годом — например, "25.02.18". В отличие от версии 1С 7.7, где присутствовала системная настройка «Столетие», в платформах 1С:Предприятие 8 стандартная функция Дата() требует четырехзначного указания года или строгого канонического формата.
Разберем подробнее основные способы преобразования таких строк в полноценный тип Дата в 1С 8.
Простейший прием, предложенный на форуме, заключается в объединении исходной строки формата "ДД.ММ.ГГ" с маской времени и последующей передаче результата в функцию Дата().
Посмотрим на пример кода:
ИсходнаяСтрока = "25.02.18";
ДатаСтр = Дата(ИсходнаяСтрока + " 00:00:00");
Сообщить(ДатаСтр); // Выведет дату с учетом региональных настроек
Важное ограничение: Корректность работы этого метода зависит от региональных настроек (Locale) системы на сервере или рабочем компьютере. В некоторых окружениях платформа может выдать ошибку преобразования типа или интерпретировать год как 0018. Используйте данный способ только для разовых обработок.
Для гарантированной работы кода в любых условиях и на любых серверах лучше использовать явный разбор строки с помощью функции СтрРазделить или функции работы с подстроками (Лев, Сред, Прав) с применением правила «скользящего века» (порогового года).
Проанализируем пример безопасного парсинга:
ИсходнаяСтрока = "25.02.18";
МассивЧастей = СтрРазделить(ИсходнаяСтрока, ".");
Если МассивЧастей.Количество() = 3 Тогда
День = МассивЧастей[0];
Месяц = МассивЧастей[1];
ДвузначныйГод = Число(МассивЧастей[2]);
// Определяем век по порогу (например, до 50 — 2000-е годы, иначе — 1900-е)
Если ДвузначныйГод <= 50 Тогда
ПолныйГод = 2000 + ДвузначныйГод;
Иначе
ПолныйГод = 1900 + ДвузначныйГод;
КонецЕсли;
// Формируем канонический вид ГГГГММДД
КаноническаяСтрока = Формат(ПолныйГод, "ЧГ=0")
+ Прав("0" + Месяц, 2)
+ Прав("0" + День, 2);
РезультатДата = Дата(КаноническаяСтрока);
КонецЕсли;
Если разработка ведется в конфигурации, где используется Библиотека Стандартных Подсистем (БСП), писать собственные функции разбора не требуется. В БСП предусмотрена специальная функция СтроковыеФункцииКлиентСервер.СтрокаВДату().
Рассмотрим применение этой функции:
ИсходнаяСтрока = "25.02.18";
РезультатДата = СтроковыеФункцииКлиентСервер.СтрокаВДату(ИсходнаяСтрока);
Данная функция умеет корректно обрабатывать строки формата «ДД.ММ.ГГ», приводит двузначный год к четырехзначному и не вызывает аварийного завершения программы при ошибке в исходных данных.
Выясним причину появления некорректных данных и устраним её на этапе выгрузки или чтения:
Формат(ДатаЗначение, "ДYYYYMMDD") или Формат(ДатаЗначение, "ДД.ММ.ГГГГ").ТабличныйДокумент считывайте значение ячейки напрямую как тип Дата, не преобразуя его предварительно в строку.