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

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

Как в 1С преобразовать строку в дату

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

Задача преобразования строки в дату возникает в 1С постоянно: при загрузке данных из файлов Excel и CSV, при обмене с внешними системами, при разборе ответов веб-сервисов и при ручном вводе периодов. Встроенный язык 1С не имеет типового метода вида «СтрокаВДату», поэтому разработчики используют несколько обходных приёмов — от конструктора Дата() до функций форматирования и универсальных процедур разбора.

Главная сложность в том, что строка с датой может быть записана в разных форматах: «31.12.2026», «2026-12-31», «31/12/2026», «20261231». Каждый формат требует своего подхода, а ошибка в разборе приводит либо к пустой дате (01.01.0001), либо к исключению, которое прерывает обработку. Ниже разобраны рабочие способы преобразования с примерами кода, ограничениями и проверкой результата.

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

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

Поэтому любое преобразование — это явный разбор строки: либо встроенными средствами платформы, либо собственным кодом. Выбор способа зависит от формата исходной строки и от того, откуда данные пришли: из файла обмена, из пользовательского ввода или из внешней системы.

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

Функция Дата() умеет принимать строковый параметр, но только в строгом формате «ГГГГММДД» или «ГГГГММДДЧЧММСС»: четыре цифры года, две цифры месяца, две цифры дня без разделителей. Это самый быстрый способ, если источник данных отдаёт дату именно так — например, многие банковские выгрузки и имена файлов с датой.

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

ДатаСВременем = Дата("20261231235959"); // 31.12.2026 23:59:59

Если строка не соответствует формату — содержит точки, дефисы, буквы или неверное количество цифр — платформа выбросит исключение «Преобразование значения к типу Дата не может быть выполнено». Поэтому перед вызовом полезно проверить длину строки и то, что она состоит только из цифр, либо обернуть вызов в Попытка...Исключение.

bsl
СтрокаДаты = "20261231";
Если СтрДлина(СтрокаДаты) = 8 Тогда
    Попытка
        Результат = Дата(СтрокаДаты);
    Исключение
        Результат = Дата(1, 1, 1); // пустая дата как признак ошибки
    КонецПопытки;
КонецЕсли;

Способ 2: разбор произвольной строки через СтрРазделить

Чаще всего строка приходит в «человеческом» виде: «31.12.2026», «31/12/2026» или «2026-12-31». Здесь надёжнее всего разбить строку на части по разделителю и собрать дату из числовых компонентов. Метод СтрРазделить() возвращает массив подстрок, из которых извлекаются день, месяц и год.

СтрокаДаты = "31.12.2026";

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

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

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

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

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

Результат = Дата(Год, Месяц, День);

КонецЕсли;

Обратите внимание на порядок компонентов: в российском формате первым идёт день, в американском — месяц, в ISO — год. Перед разбором нужно точно знать формат источника, иначе 05.06.2026 легко превратится в 6 мая вместо 5 июня. Если строка содержит ещё и время («31.12.2026 15:30:00»), сначала отделите часть с датой через СтрРазделить(Строка, " "), а время разберите отдельно по двоеточию.

Дополнительная защита — проверка диапазонов: месяц от 1 до 12, день от 1 до 31, год в разумных пределах. Конструктор Дата(Год, Месяц, День) при невалидных значениях также вызывает исключение, поэтому валидация до вызова делает код предсказуемее.

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

Способ 3: XMLЗначение для дат из обменов и веб-сервисов

Если строка пришла из XML, JSON-сериализации средствами 1С или веб-сервиса, она обычно записана в формате XML Schema: «2026-12-31T15:30:00» или «2026-12-31». Для таких данных платформа предоставляет штатный механизм — функцию XMLЗначение() с указанием типа.

ТипДатаВремя = Тип("Дата");

Результат = XMLЗначение(ТипДатаВремя, "2026-12-31T15:30:00");

Этот способ корректно обрабатывает часовые пояса и дробные секунды, если они указаны в строке. При несоответствии формата функция выбрасывает исключение, поэтому обёртка в Попытка...Исключение обязательна в пакетных загрузках: одна битая строка не должна останавливать обработку всего файла.

Сравнение способов преобразования

Дата("ГГГГММДД")

Самый короткий код, но работает только со строгим цифровым форматом без разделителей

СтрРазделить + Дата(Г,М,Д)

Универсален для любых разделителей, но требует знания порядка компонентов и ручной валидации

XMLЗначение

Идеален для обменов и веб-сервисов, но принимает только формат XML Schema

Проверка результата и обработка ошибок

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

Если Не ЗначениеЗаполнено(Результат) Тогда

Сообщить("Не удалось преобразовать в дату: " + ИсходнаяСтрока);

КонецЕсли;

Отдельный риск — обратная задача: когда дату сравнивают со строкой. Например, в запросе параметр-дата передаётся строкой, и отбор молча возвращает пустой результат из-за несовпадения типов. Всегда приводите параметры к типу Дата до передачи в запрос.

Типичные ошибки
01
Передача в Дата() строки с точками или дефисами — платформа принимает только ГГГГММДД, иначе исключение
02
Путаница дня и месяца при разборе: 05.06 читается как 6 мая вместо 5 июня
03
Отсутствие Попытка...Исключение в цикле загрузки — одна битая строка обрывает весь файл
04
Отсутствие проверки на пустую дату — ошибочные записи уходят в базу с датой 01.01.0001
05
Игнорирование части со временем: строка '31.12.2026 15:30' разбирается не полностью

Частые форматы строк и готовые решения

Ниже сведены типовые форматы и подходящий способ разбора. Это помогает быстро выбрать код под конкретный источник данных.

Формат строкиПримерСпособ
ГГГГММДД20261231Дата(Строка)
ДД.ММ.ГГГГ31.12.2026СтрРазделить по точке
ГГГГ-ММ-ДД2026-12-31СтрРазделить по дефису, порядок Г-М-Д
XML Schema2026-12-31T15:30:00XMLЗначение
ДД.ММ.ГГГГ ЧЧ:ММ:СС31.12.2026 15:30:00Разделить по пробелу, разобрать обе части

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

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

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

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

Реальная дата, совпадающая с исходной строкой

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

01.01.0001 или исключение

Порядок дня и месяца
Норма

31.12.2026 осталось 31 декабря

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

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

Время в результате
Норма

Время совпадает с исходным или 0:00:00, если его не было

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

Время обрезано или сдвинуто

FAQ: частые вопросы о преобразовании строки в дату

Почему Дата("31.12.2026") выдаёт ошибку?

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

Как преобразовать строку «2026-12-31T15:30:00Z» из JSON?

Используйте XMLЗначение(Тип("Дата"), Строка). Суффикс Z означает время UTC — при необходимости скорректируйте результат на смещение вашего часового пояса, так как тип Дата в 1С не хранит зону.

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

Надёжнее всего возвращать из функции разбора структуру или использовать признак успеха: например, в блоке Исключение записывать текст ошибки в журнал. Если функция возвращает просто дату, то 01.01.0001 считается признаком неудачи — реальные учётные данные с такой датой практически не встречаются.

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

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

Что делать, если в файле смешаны разные форматы дат?

Напишите функцию, которая последовательно пробует шаблоны: сначала строгий ГГГГММДД, затем разбор по точке, дефису и косой черте, затем XMLЗначение. Каждую попытку оборачивайте в Попытка...Исключение и фиксируйте строки, не подошедшие ни под один шаблон.

Как преобразовать дату обратно в строку нужного формата?

Используйте функцию Формат(Дата, "ДФ=dd.MM.yyyy") — шаблон задаётся через параметр ДФ. Для формата ГГГГММДД подойдёт Формат(Дата, "ДФ=yyyyMMdd").

Итог

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

Прямого метода «строка в дату» в 1С нет: для формата ГГГГММДД используйте Дата(Строка), для произвольных разделителей — СтрРазделить с конструктором Дата(Год, Месяц, День), для обменов — XMLЗначение. Всегда оборачивайте преобразование в Попытка...Исключение и проверяйте результат на пустую дату 01.01.0001.