Как преобразовать строку в дату в 1С:Предприятие 8

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

В процессе разработки в 1С часто возникает задача преобразования текстовых данных (например, полученных из файлов DBF, Excel, текстовых логов или внешних API) в системный тип Дата. Поскольку строковые представления дат могут быть крайне разнообразными, важно выбрать наиболее надежный метод парсинга. В этой статье мы подробно разберем несколько подходов: от использования встроенного конструктора платформы до применения функций стандартных подсистем (БСП) и создания собственных универсальных парсеров.

Метод 1: Использование конструктора Дата() и преобразование к формату YYYYMMDD

Самый простой и быстрый способ нативно преобразовать строку — это привести её к каноническому виду "ГГГГММДДЧЧММСС". Платформа 1С умеет автоматически преобразовывать строку такого формата в дату. Рассмотрим ситуацию, когда на входе мы имеем строку вида "13.11.2016".

Проанализируем пример кода, где мы «разрезаем» исходную строку и собираем её заново в нужном порядке:


ЗначениеДата = "13.11.2016";
// Собираем строку в формате ГГГГММДД
СтрокаДляПреобразования = Прав(ЗначениеДата, 4) + Сред(ЗначениеДата, 4, 2) + Лев(ЗначениеДата, 2);
Дата1С = Дата(СтрокаДляПреобразования);

Важный нюанс: конструктор Дата() крайне чувствителен к формату. Если вы передадите строку с разделителями (например, точками), платформа попытается сопоставить её с локальным форматом даты операционной системы. Если формат не совпадет, возникнет ошибка. Поэтому безопаснее всего приводить строку к виду без разделителей.

Также стоит учитывать время. Если в строке только дата, конструктор установит время в 00:00:00. Однако, как отмечают опытные разработчики, иногда явное добавление пустых часов помогает избежать ошибок в некоторых версиях платформы:


Дата1С = Дата(Прав(ЗначениеДата, 4) + Сред(ЗначениеДата, 4, 2) + Лев(ЗначениеДата, 2) + "000000");

Метод 2: Использование Библиотеки Стандартных Подсистем (БСП)

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

Разберем, как это работает:


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

Если Результат = '00010101' Тогда
    // Обработка ситуации, когда строку не удалось распознать
КонецЕсли;

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

Метод 3: Преобразование через ОписаниеТипов

Существует еще один «хитрый» способ преобразования, который использует механизм приведения типов платформы. Метод ПривестиЗначение объекта ОписаниеТипов часто ведет себя более гибко, чем прямой конструктор.

Посмотрим на пример реализации:


ДатаСтрока = "13112016"; // Строка без разделителей
// Если строка имеет вид ДДММГГГГ, нам нужно переставить части
ДатаСтрока = Сред(ДатаСтрока, 5) + Сред(ДатаСтрока, 3, 2) + Лев(ДатаСтрока, 2);

ОписаниеТипаДата = Новый ОписаниеТипов("Дата");
Результат = ОписаниеТипаДата.ПривестиЗначение(ДатаСтрока);

Метод 4: Создание универсальной функции парсинга

Иногда формат входных строк непредсказуем: где-то год указан двумя цифрами, где-то разделитель — пробел, а где-то запятая. В таких случаях стоит использовать расширенную функцию парсинга. Рассмотрим пример функции, которая ищет компоненты даты по позициям, заданным в шаблоне:


Функция СтрокаВДатуВремя(ДатаСтрока, ФорматДаты = "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)))
        );
    Исключение
        Возврат '00010101';
    КонецПопытки;
КонецФункции

Этот подход позволяет гибко настраивать парсинг под любой формат, просто передав строку маски (например, "yyyy-mm-dd").

Рекомендации и частые ошибки

При работе с датами важно помнить о следующих моментах:

  1. Високосные годы: Ручная сборка строки типа "20230229" приведет к ошибке при вызове Дата(), так как 2023 год не является високосным. Всегда используйте блок Попытка...Исключение.
  2. Пустые значения: Перед преобразованием всегда проверяйте строку на пустоту с помощью ЗначениеЗаполнено().
  3. Лишние пробелы: Используйте функцию СокрЛП() для удаления невидимых символов по краям строки, иначе Дата() выдаст ошибку "Несоответствие типов".
  4. XML-формат: Если вы получаете дату из веб-сервиса в формате "2016-11-13", можно использовать системную функцию XMLЗначение(Тип("Дата"), "2016-11-13"). Это зачастую быстрее и надежнее ручного парсинга.

Выяснив причину возникновения ошибок и проанализировав доступные инструменты, мы можем сделать вывод: для типовых конфигураций идеальным выбором будет БСП, а для специализированных задач импорта данных — ручной парсинг с приведением строки к каноническому виду "ГГГГММДД".

← На главную