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

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

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

Рассмотрим подробно, почему возникает эта проблема и каким образом правильно преобразовать подобную строку в полноценное значение типа Дата с корректным определением столетия.

Причина ошибки и особенности работы функции Дата()

Проанализируем базовые ограничения платформы 1С при работе с датами:

  1. Формат строки: Вызов Дата("27.10.92") вызовет ошибку приведения типов, так как встроенный конструктор ожидают строку формата "19921027" (без точек и разделителей).
  2. Индексация символов: В встроенном языке 1С индексация строк начинается с 1 (а не с 0). Поэтому вызовы вроде Сред(ИзмДата, 0, 2) являются ошибочными.
  3. Длина года: При явной передаче компонентов Дата(Год, Месяц, День) значение года должно состоять из четырех цифр. Если передать двузначный год 92, платформа воспримет его буквально как 0092 год нашей эры.

Решение 1: Разбор строки с логикой определения столетия

Выясним, как правильно вырезать компоненты даты из строки и добавить вековой префикс ("19" или "20"). Для этого выделим подстроку года и сравним ее с граничным значением.

Посмотрим на пример функции, разбирающей строку вида "27.10.92":


Функция РазобратьДату(ИзмДата)
    Год = Сред(ИзмДата, 7, 4);
    
    Если СтрДлина(Год) < 4 Тогда
        ГодЧислом = Число(Год);
        ГодНачалаСтолетия = 20; // Пороговый год
        
        Если ГодЧислом > ГодНачалаСтолетия Тогда
            Год = "19" + Год;
        Иначе
            Год = "20" + Год;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Дата(Год + Сред(ИзмДата, 4, 2) + Сред(ИзмДата, 1, 2));
КонецФункции

В данном примере, если двузначный год больше 20 (например, 92), к нему добавляется префикс "19" (получаем 1992 год). Если год меньше или равен 20 (например, 15), подставляется "20" (2015 год).

Решение 2: Универсальный разбор строки по разделителям

Если формат входящей строки может меняться (использоваться слэши /, дефисы - или точки .), привязка к точным позициям символов через Сред() станет источником ошибок. В этом случае удобнее заменить все разделители на перевод строки и извлечь составные части по номерам строк.

Разберем по шагам данный подход:


Функция ПреобразоватьСтрокуВДату(Знач СтрДата)
    // Приводим все возможные разделители к единому виду
    СтрДата = СтрЗаменить(СтрДата, ".", Символы.ПС);
    СтрДата = СтрЗаменить(СтрДата, "/", Символы.ПС);
    СтрДата = СтрЗаменить(СтрДата, "-", Символы.ПС);
    
    День   = Число(СтрПолучитьСтроку(СтрДата, 1));
    Месяц = Число(СтрПолучитьСтроку(СтрДата, 2));
    Год   = Число(СтрПолучитьСтроку(СтрДата, 3));
    
    // Если год двузначный, определяем вековой период
    Если Год < 100 Тогда
        Если Год > 20 Тогда
            Год = 1900 + Год;
        Иначе
            Год = 2000 + Год;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Дата(Год, Месяц, День);
КонецФункции

Решение 3: Использование встроенных функций БСП

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

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

Данный метод автоматически обрабатывает большинство распространенных форматов дат и корректно преобразует строку в тип Дата.

← На главную