Как преобразовать строку с двузначным годом в дату в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При загрузке данных из внешних файлов или смежных систем (например, таблиц Excel или выгрузок из 1С 7.7) разработчики часто получают даты в формате строки с сокращенным двузначным годом — например, "25.02.18". В отличие от версии 1С 7.7, где присутствовала системная настройка «Столетие», в платформах 1С:Предприятие 8 стандартная функция Дата() требует четырехзначного указания года или строгого канонического формата.

Разберем подробнее основные способы преобразования таких строк в полноценный тип Дата в 1С 8.

Способ 1. Быстрое приведение с добавлением времени

Простейший прием, предложенный на форуме, заключается в объединении исходной строки формата "ДД.ММ.ГГ" с маской времени и последующей передаче результата в функцию Дата().

Посмотрим на пример кода:


ИсходнаяСтрока = "25.02.18";
ДатаСтр = Дата(ИсходнаяСтрока + " 00:00:00");
Сообщить(ДатаСтр); // Выведет дату с учетом региональных настроек

Важное ограничение: Корректность работы этого метода зависит от региональных настроек (Locale) системы на сервере или рабочем компьютере. В некоторых окружениях платформа может выдать ошибку преобразования типа или интерпретировать год как 0018. Используйте данный способ только для разовых обработок.

Способ 2. Явный разбор строки и вычисление века

Для гарантированной работы кода в любых условиях и на любых серверах лучше использовать явный разбор строки с помощью функции СтрРазделить или функции работы с подстроками (Лев, Сред, Прав) с применением правила «скользящего века» (порогового года).

Проанализируем пример безопасного парсинга:


ИсходнаяСтрока = "25.02.18";
МассивЧастей = СтрРазделить(ИсходнаяСтрока, ".");

Если МассивЧастей.Количество() = 3 Тогда
    День = МассивЧастей[0];
    Месяц = МассивЧастей[1];
    ДвузначныйГод = Число(МассивЧастей[2]);
    
    // Определяем век по порогу (например, до 50 — 2000-е годы, иначе — 1900-е)
    Если ДвузначныйГод <= 50 Тогда
        ПолныйГод = 2000 + ДвузначныйГод;
    Иначе
        ПолныйГод = 1900 + ДвузначныйГод;
    КонецЕсли;
    
    // Формируем канонический вид ГГГГММДД
    КаноническаяСтрока = Формат(ПолныйГод, "ЧГ=0") 
        + Прав("0" + Месяц, 2) 
        + Прав("0" + День, 2);
        
    РезультатДата = Дата(КаноническаяСтрока);
КонецЕсли;

Способ 3. Использование функции из БСП

Если разработка ведется в конфигурации, где используется Библиотека Стандартных Подсистем (БСП), писать собственные функции разбора не требуется. В БСП предусмотрена специальная функция СтроковыеФункцииКлиентСервер.СтрокаВДату().

Рассмотрим применение этой функции:


ИсходнаяСтрока = "25.02.18";
РезультатДата = СтроковыеФункцииКлиентСервер.СтрокаВДату(ИсходнаяСтрока);

Данная функция умеет корректно обрабатывать строки формата «ДД.ММ.ГГ», приводит двузначный год к четырехзначному и не вызывает аварийного завершения программы при ошибке в исходных данных.

Способ 4. Устранение проблемы на стороне источника

Выясним причину появления некорректных данных и устраним её на этапе выгрузки или чтения:

  1. Форматирование при выгрузке из 1С 7.7: При формировании Excel-файла или текстовой выгрузки из 7.7 используйте явный формат даты с полным годом через функцию Формат(ДатаЗначение, "ДYYYYMMDD") или Формат(ДатаЗначение, "ДД.ММ.ГГГГ").
  2. Прямое чтение из Excel: При загрузке через COM-объект или ТабличныйДокумент считывайте значение ячейки напрямую как тип Дата, не преобразуя его предварительно в строку.
← На главную