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

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

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

Почему возникает ошибка при прямом преобразовании

Разберем ситуацию: когда мы пишем Дата("23.05.2022"), платформа ожидает строку в строго определенном внутреннем формате. Если строка не соответствует этому формату, система выдает ошибку "Преобразование значения к типу Дата не может быть выполнено". Это происходит потому, что тип Дата в 1С 8.х всегда включает в себя и число, и время. Если время не указано в явном виде или формат разделителей не совпадает с ожидаемым, функция не понимает, как интерпретировать данные.

Способ 1: Использование конструктора даты с разбором строки

Наиболее надежным и "прозрачным" методом является использование конструктора Дата(Год, Месяц, День, Час, Минута, Секунда). В этом случае мы самостоятельно извлекаем части даты из строки и передаем их в функцию в виде чисел. Рассмотрим пример, когда формат входящей строки строго фиксирован (ДД.ММ.ГГГГ).

Проанализируем программный код для этого метода:


// Исходная строка
СтрДата = "23.05.2022";

// Извлекаем части даты, используя строковые функции
День   = Число(Лев(СтрДата, 2));
Месяц  = Число(Сред(СтрДата, 4, 2));
Год    = Число(Прав(СтрДата, 4));

// Формируем объект типа Дата
Результат = Дата(Год, Месяц, День);

Этот метод хорош тем, что он не зависит от региональных настроек операционной системы. Однако он может дать сбой, если формат строки изменится (например, вместо "01.05.2022" придет "1.5.2022").

Способ 2: Использование функции СтрРазделить (для переменного формата)

Если количество знаков в дне или месяце может меняться, лучше использовать функцию СтрРазделить. Это позволит нам получить части даты, ориентируясь на символ-разделитель (точку), а не на позицию символа в строке.

Рассмотрим алгоритм реализации:


СтрДата = "23.5.2022"; // Пример без ведущего нуля
ЧастиДаты = СтрРазделить(СтрДата, ".");

Если ЧастиДаты.Количество() = 3 Тогда
    Год   = Число(ЧастиДаты[2]);
    Месяц = Число(ЧастиДаты[1]);
    День  = Число(ЧастиДаты[0]);
    
    Результат = Дата(Год, Месяц, День);
КонецЕсли;

Использование СтрРазделить делает ваш код более устойчивым к ошибкам входных данных. Мы получаем массив строк, преобразуем их в числа и создаем дату.

Способ 3: Добавление пустого времени (недокументированная особенность)

Как выяснилось в ходе обсуждения, платформа 1С иногда может распознать формат "ДД.ММ.ГГГГ", если к нему в явном виде добавить время. Это часто называют "ленивым" способом. Выглядит это так:


СтрДата = "23.05.2022";
Результат = Дата(СтрДата + " 00:00:00");

Важное предупреждение: этот способ является недокументированным. Его работа напрямую зависит от региональных настроек (Locale) сервера или текущего рабочего места. Если на сервере установлен формат даты "MM/DD/YYYY", этот код упадет с ошибкой. Поэтому в тиражных решениях использовать его крайне не рекомендуется.

Способ 4: Канонический строковый формат (ГГГГММДДЧЧММСС)

Самый быстрый и безопасный способ преобразования строки в дату в 1С — это приведение её к каноническому виду ГГГГММДДЧЧММСС. В таком формате функция Дата() работает максимально быстро и безошибочно в любых условиях.

Пример преобразования из "23.05.2022" в канонический вид:


СтрДата = "23.05.2022";
// Превращаем в "20220523000000"
КаноническаяСтрока = Прав(СтрДата, 4) + Сред(СтрДата, 4, 2) + Лев(СтрДата, 2) + "000000";
Результат = Дата(КаноническаяСтрока);

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

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

Найдем подходящую функцию в модуле ОбщегоНазначенияКлиентСервер или СтроковыеФункцииКлиентСервер:


// Вариант для актуальных версий БСП
ЗначениеДаты = ОбщегоНазначенияКлиентСервер.СтрокаВДату("23.05.2022");

Внутри этой функции уже реализованы все необходимые проверки, обработка разделителей и защита от некорректных данных. Это избавляет разработчика от необходимости изобретать "велосипед".

Сводная таблица методов

Проанализируем, какой метод лучше выбрать в зависимости от ситуации:

  1. Конструктор Дата(Г, М, Д): Лучший выбор для стабильного кода, не зависящего от настроек Windows.
  2. СтрРазделить: Идеально подходит, если входная строка может иметь вид "1.1.2022" (без нулей).
  3. БСП: Рекомендуется для использования в типовых конфигурациях для сокращения объема собственного кода.
  4. Каноническая строка: Самый производительный метод для обработки больших массивов данных.

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

← На главную