К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как сделать дату из строки в 1С

Как преобразовать строку в дату в 1С: функция Дата(), форматы строк, работа с XML, проверка результата и типичные ошибки с примерами кода.

Во встроенном языке 1С нет отдельной функции вида «СтрокаВДату», поэтому преобразование строки в дату выполняется через конструктор Дата(), который умеет принимать строковое представление, или через разбор строки на составные части. Выбор способа зависит от того, в каком формате записана исходная строка: внутренний формат 1С, ISO 8601, «дд.мм.гггг» или произвольный текст из файла.

Чаще всего задача возникает при загрузке данных из CSV, Excel, JSON или XML, при обмене с внешними системами и при парсинге ответов веб-сервисов. Во всех этих случаях дата приходит текстом, и её нужно безопасно превратить в значение типа «Дата», чтобы использовать в отборах, запросах и реквизитах документов.

Ниже разобраны рабочие способы преобразования, ограничения каждого из них, проверка результата и типичные ошибки, из-за которых вместо даты получается пустое значение или неверные данные.

Как устроен тип «Дата» и почему строка не преобразуется сама

Тип «Дата» в 1С хранит дату и время с точностью до секунды. Автоматического неявного преобразования строки в дату платформа не выполняет: присваивание строки реквизиту типа «Дата» либо вызовет ошибку преобразования, либо даст пустую дату — в зависимости от контекста. Поэтому преобразование всегда делают явно в коде.

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

Способ 1. Конструктор Дата() со строкой во внутреннем формате

Если строка уже имеет вид «ГГГГММДДччммсс», преобразование выполняется одной строкой кода. Часы, минуты и секунды можно опустить — тогда время будет 00:00:00.

ДатаИзСтроки = Дата("20260315");          // 15.03.2026 0:00:00

ДатаСВременем = Дата("20260315143000"); // 15.03.2026 14:30:00

Если входная строка содержит разделители, их предварительно убирают функцией СтрЗаменить(). Это работает, когда порядок частей в строке уже «год-месяц-день», например «2026-03-15»:

Строка = "2026-03-15";

Нормализованная = СтрЗаменить(Строка, "-", "");

ДатаИзСтроки = Дата(Нормализованная);

Способ 2. Разбор строки «дд.мм.гггг» на части

Самый частый формат в российских выгрузках — «дд.мм.гггг» или «дд.мм.гг». Конструктор с одной строкой его не поймёт, поэтому строку разбивают по разделителю через СтрРазделить() и собирают дату из чисел.

Функция СтрокаВДату(СтрокаДаты)

Части = СтрРазделить(СтрокаДаты, ".");

Если Части.Количество() <> 3 Тогда

Возврат Дата(1, 1, 1); // пустая дата как признак ошибки

КонецЕсли;

День = Число(Части[0]);

Месяц = Число(Части[1]);

Год = Число(Части[2]);

Если Год < 100 Тогда

Год = Год + 2000; // осторожно: уточните правило для ваших данных

КонецЕсли;

Возврат Дата(Год, Месяц, День);

КонецФункции

Обратите внимание на двузначный год: «15.03.24» без коррекции превратится в год 24, то есть в начало первого века. Правило дополнения до четырёх знаков зависит от источника данных — единого стандарта здесь нет, и его нужно согласовать с тем, кто формирует файл.

Порядок действий при разборе строки
  1. 1
    Определите точный формат исходной строки по образцу данных
  2. 2
    Уберите лишние пробелы функцией СокрЛП()
  3. 3
    Разбейте строку на части через СтрРазделить() по разделителю
  4. 4
    Преобразуйте части в числа и соберите дату конструктором Дата(Год, Месяц, День)
  5. 5
    Проверьте результат: он не должен быть пустой датой

Способ 3. Даты из XML, JSON и веб-сервисов

При обмене через XML даты обычно передаются в формате ISO 8601: «2026-03-15T14:30:00». Для таких данных платформа предлагает штатный механизм — функции работы с XML-датой, а также сериализацию XDTO, которая преобразует значения автоматически при чтении объекта.

Если чтение выполняется вручную, строку ISO можно нормализовать: убрать дефисы, двоеточия и символ «T», получив внутренний формат платформы:

Строка = "2026-03-15T14:30:00";

С = СтрЗаменить(Строка, "-", "");

С = СтрЗаменить(С, "T", "");

С = СтрЗаменить(С, ":", "");

ДатаИзСтроки = Дата(С);

В JSON даты нередко приходят в виде «/Date(1710502200000)/» (миллисекунды Unix) или в текстовом виде. При чтении через ПрочитатьJSON можно указать параметр преобразования дат, либо обработать значение вручную: Unix-время переводится в дату прибавлением секунд к дате 01.01.1970 с учётом часового пояса.

Проверка корректности результата

После преобразования результат обязательно проверяют. Первый признак ошибки — пустая дата Дата(1,1,1). Второй — значение, выходящее за разумные границы предметной области: дата документа в 1900 году или в далёком будущем почти всегда означает неверный разбор строки.

Полезный приём — обратное форматирование: преобразуйте полученную дату обратно в строку через Формат(ДатаИзСтроки, "ДЛФ=D") и сравните с исходным значением. Совпадение подтверждает корректность разбора.

Если Не ЗначениеЗаполнено(ДатаИзСтроки) Тогда

// фиксируем ошибку в журнале загрузки, строку пропускаем

КонецЕсли;

Контрольные точки

Как проверить результат

Значение после преобразования
Норма

Дата заполнена и попадает в ожидаемый диапазон

Тревожный признак

Пустая дата 01.01.0001 или явно нереалистичный год

Обратное форматирование
Норма

Формат(Дата, "ДЛФ=D") совпадает с исходной строкой

Тревожный признак

День и месяц переставлены местами

Время
Норма

Часы и минуты соответствуют источнику

Тревожный признак

Смещение на величину часового пояса

Типичные ошибки и ограничения

Главная ошибка — предположение, что Дата("15.03.2026") сработает. Конструктор с одной строкой понимает только внутренний формат, строка с точками даст ошибку или пустое значение. Вторая частая проблема — перестановка дня и месяца при разборе строк из зарубежных источников, где принят формат «мм/дд/гггг».

Ещё одно ограничение: диапазон допустимых дат в 1С ограничен, и значения за его пределами вызывают ошибку. Также помните, что Число() выбросит исключение на нечисловых символах — поэтому разбор строк из внешних файлов оборачивают в Попытка...Исключение с записью проблемной строки в журнал.

Типичные ошибки
01
Передача строки «дд.мм.гггг» напрямую в Дата() — конструктор понимает только ГГГГММДДччммсс
02
Перестановка дня и месяца при разборе формата мм/дд/гггг — даты «плывут» незаметно
03
Игнорирование двузначного года — получается год 24 вместо 2026
04
Отсутствие обработки исключений — одна битая строка останавливает всю загрузку
05
Игнорирование часового пояса при разборе Unix-времени — смещение времени и даты

Выбор способа под конкретную задачу

Для внутренних строк платформы и формата «ГГГГ-ММ-ДД» достаточно конструктора Дата() с удалением разделителей. Для пользовательских форматов «дд.мм.гггг» пишут функцию-разборщик с проверками. Для XML и обменов через XDTO используют штатную сериализацию, которая преобразует даты без ручного кода. Для JSON с Unix-временем — арифметику от 01.01.1970 с поправкой на часовой пояс.

Маршрут решения

Как выбрать действие

Строка вида «20260315» или «2026-03-15»Уберите разделители и передайте в Дата()
Строка вида «15.03.2026»Разбейте через СтрРазделить() и соберите Дата(Год, Месяц, День)
Дата приходит из XML или XDTO-обменаИспользуйте штатную сериализацию платформы
Значение — миллисекунды UnixПрибавьте секунды к 01.01.1970 с учётом часового пояса
Итог

Что важно запомнить

Преобразование строки в дату делается конструктором Дата(): либо строкой во внутреннем формате ГГГГММДДччммсс, либо числами после разбора строки. Результат всегда проверяют на пустую дату и разумность значения, а внешние данные обрабатывают через Попытка...Исключение.

Частые вопросы

Почему Дата("15.03.2026") возвращает пустую дату или ошибку?

Конструктор с одним строковым параметром распознаёт только внутренний формат платформы ГГГГММДДччммсс без разделителей. Строку «15.03.2026» нужно разбить на части и собрать дату через Дата(2026, 3, 15).

Как преобразовать строку с временем «15.03.2026 14:30»?

Разделите строку на дату и время по пробелу, затем каждую часть разбейте по своему разделителю и передайте все шесть чисел в конструктор: Дата(Год, Месяц, День, Час, Минута, Секунда).

Как отличить неудачное преобразование от реальной пустой даты?

Используйте признак ошибки отдельно от результата: например, функция возвращает структуру с полями «Успешно» и «Дата», либо при ошибке записывает строку в журнал. Сравнение с Дата(1,1,1) показывает только факт пустоты, но не её причину.

Что делать, если формат строки в файле непостоянный?

Сначала соберите статистику реальных значений из файла и определите все встречающиеся шаблоны. Затем в функции разбора проверяйте строку на соответствие каждому шаблону по очереди, а неподходящие значения отправляйте в протокол ошибок для ручного разбора.

Можно ли преобразовать строку в дату в запросе 1С?

Штатной функции преобразования строки в дату в языке запросов нет. Обычно строку преобразуют в коде перед передачей в запрос параметром, либо используют выражение ДАТАВРЕМЯ(Год, Месяц, День) с извлечёнными числовыми частями, если они хранятся отдельно.

Как обрабатывать даты «15 марта 2026» словами?

Штатных средств для такого формата нет. Нужна функция с соответствием названий месяцев числам: строка разбивается на слова, название месяца заменяется номером, после чего дата собирается конструктором. Учитывайте регистр букв и возможные сокращения.