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

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

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

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

Во встроенном языке 1С нет универсальной функции «СтрокаВДату», которая автоматически распознала бы любой формат. Тип «Дата» строго типизирован, а строковые представления дат бывают самыми разными: «25.04.2026», «2026-04-25T10:30:00», «20260425103000». Поэтому задача «получить дату из строки» решается по-разному в зависимости от того, откуда пришла строка и в каком она формате.

Основные рабочие варианты — конструктор Дата(Строка) для формата ГГГГММДД, функция XMLЗначение(Тип("Дата"), Строка) для формата ISO 8601, а также ручной разбор строки через СтрРазделить и извлечение подстрок. Ниже разобраны все подходы, их ограничения и способы защититься от ошибок преобразования.

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

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

Именно по этой причине платформа не выполняет неявное преобразование строки в дату. Попытка написать Дата = "25.04.2026"; присвоит переменной строку, а не дату, и последующие операции сравнения или арифметики дат завершатся ошибкой. Разработчик обязан явно указать, как интерпретировать строку.

Способ 1. Конструктор Дата(Строка) для формата ГГГГММДД

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

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

Сообщить(ДатаИзСтроки); // 25.04.2026 0:00:00

ДатаВремяИзСтроки = Дата("20260425143000");

Сообщить(ДатаВремяИзСтроки); // 25.04.2026 14:30:00

Важные ограничения: строка должна содержать минимум 8 цифр (год, месяц, день), без разделителей. Если передать строку в другом формате или с буквами, платформа вернёт пустую дату 01.01.0001 либо вызовет исключение в зависимости от контекста. Разделители вида «2026-04-25» конструктор не понимает — для таких строк нужен другой подход.

Перед преобразованием полезно проверить длину строки и состав символов, особенно если данные приходят из внешнего источника. Это дешевле, чем отлавливать последствия пустой даты в дальнейших расчётах.

Способ 2. XMLЗначение для формата ISO 8601

Если строка в стандартном XML-формате ГГГГ-ММ-ДДTчч:мм:сс (или только ГГГГ-ММ-ДД), корректное решение — функция XMLЗначение. Такой формат типичен для обмена данными, веб-сервисов, JSON-ответов и файлов выгрузки между базами.

СтрокаДаты = "2026-04-25T14:30:00";

ДатаИзСтроки = XMLЗначение(Тип("Дата"), СтрокаДаты);

Сообщить(ДатаИзСтроки); // 25.04.2026 14:30:00

// Только дата, без времени

ДатаБезВремени = XMLЗначение(Тип("Дата"), "2026-04-25");

Функция строга к формату: дефисы и буква «T» обязательны, лишние пробелы приведут к ошибке «Ошибка преобразования данных XML». Если строка приходит из внешнего источника, оберните вызов в Попытка...Исключение...КонецПопытки и залогируйте проблемное значение — это упростит разбор ошибок обмена.

Способ 3. Ручной разбор произвольного формата

Когда строка имеет произвольный вид — «25.04.2026», «25/04/24», «25 апреля 2026» — единственный надёжный путь: разбить строку на части и собрать дату через конструктор Дата(Год, Месяц, День, Час, Минута, Секунда). Для разбиения удобна функция СтрРазделить.

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

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

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

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

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

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

ДатаИзСтроки = Дата(Год, Месяц, День);

Иначе

ВызватьИсключение "Неожиданный формат даты: " + СтрокаДаты;

КонецЕсли;

Если в строке есть и время («25.04.2026 14:30:00»), сначала отделите дату от времени через СтрРазделить(СтрокаДаты, " "), затем разберите каждую часть своим разделителем — точкой для даты и двоеточием для времени. Итог собирается одним вызовом Дата(Год, Месяц, День, Час, Минута, Секунда).

Альтернатива разбиению — извлечение подстрок функциями Лев, Сред, Прав, если позиции цифр фиксированы. Этот вариант устойчив к лишним пробелам в конце, но хрупок при смене длины компонентов (например, когда месяц записан без ведущего нуля).

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

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

Главный признак неудачного преобразования — дата 01.01.0001. Она возникает и при пустой строке, и при неверном формате, и при невалидных значениях вроде месяца 13. Проверяйте результат сразу после преобразования, а не в конце длинного алгоритма.

ДатаИзСтроки = Дата(Год, Месяц, День);

Если ДатаИзСтроки = Дата(1, 1, 1) Тогда

// Значение не распознано — обработать ситуацию

КонецЕсли;

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

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

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

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

Дата соответствует исходной строке

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

Получено 01.01.0001 0:00:00

Тип переменной
Норма

ТипЗнч(Переменная) = Тип("Дата")

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

Переменная осталась строкой

Поведение при обмене
Норма

Все записи загружены с корректными датами

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

Часть записей с пустой датой, в журнале ошибки преобразования

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

Первая распространённая ошибка — передача строки «25.04.2026» в конструктор Дата() и ожидание корректного результата. Конструктор молча вернёт пустую дату, и логика «тихо» сломается дальше по коду: документы попадут не в тот период, отборы не сработают.

Вторая ошибка — путаница дня и месяца при ручном разборе, особенно при импорте данных из систем с американским форматом ММ/ДД/ГГГГ. Здесь помогает проверка на реальных примерах: возьмите дату, где день больше 12, и убедитесь, что она распознаётся правильно.

Третья — игнорирование двузначного года. Строка «25.04.24» после разбора даст год 24, то есть 24 год нашей эры, а не 2026-й. Если источник отдаёт двузначный год, добавьте явное правило: например, Если Год < 100 Тогда Год = Год + 2000 КонецЕсли — но только если такое допущение соответствует смыслу данных.

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

Выбор метода под конкретный источник данных

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

Формат строкиПримерМетод
ГГГГММДД (цифры подряд)20260425Дата(Строка)
ISO 86012026-04-25T14:30:00XMLЗначение(Тип("Дата"), Строка)
ДД.ММ.ГГГГ и подобные25.04.2026СтрРазделить + Дата(Год, Месяц, День)
Текстовый месяц25 апреля 2026Ручной разбор с сопоставлением названий месяцев

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

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

Как выбрать способ преобразования

Строка содержит только цифры в порядке ГГГГММДДИспользуйте Дата(Строка) — самый короткий путь
Строка в формате ГГГГ-ММ-ДД с дефисами и, возможно, временем через TИспользуйте XMLЗначение(Тип("Дата"), Строка) с Попытка...Исключение
Формат ДД.ММ.ГГГГ или любой другой с разделителямиРазбейте строку через СтрРазделить и соберите Дата(Год, Месяц, День)
Формат заранее неизвестен или меняетсяНапишите функцию, перебирающую известные форматы, и логируйте нераспознанные значения

Обратная задача и смежные приёмы

Обратное преобразование — дату в строку — выполняется функцией Формат(Дата, "ДФ=...") с шаблоном, например Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"). Шаблоны ДФ используют те же обозначения: yyyy — год, MM — месяц, dd — день. Знание шаблонов помогает и при чтении строк: если выгрузка сформирована через Формат, её формат всегда можно узнать из кода выгрузки.

Для проверки, является ли значение датой, используйте ТипЗнч(Значение) = Тип("Дата"). А чтобы получить из даты только её часть (год, месяц, день), есть одноимённые функции: Год(Дата), Месяц(Дата), День(Дата) — они пригодятся при отладке и при построении проверок корректности.

Итог

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

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

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

Почему Дата("25.04.2026") возвращает 01.01.0001?

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

Как преобразовать строку «2026-04-25T14:30:00» в дату?

Используйте XMLЗначение(Тип("Дата"), "2026-04-25T14:30:00"). Это стандартный формат ISO 8601, и функция корректно восстановит и дату, и время. Оберните вызов в Попытка...Исключение, если строка приходит из внешнего источника.

Можно ли преобразовать строку с текстовым названием месяца?

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

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

Сравните результат с пустой датой: Если Результат = Дата(1, 1, 1) Тогда ... КонецЕсли. Значение 01.01.0001 — признак того, что строка не была распознана. Дополнительно проверяйте тип через ТипЗнч, чтобы исключить ситуацию, когда переменная осталась строкой.

Что делать с двузначным годом в строке вида «25.04.24»?

После разбора строки добавьте явное правило нормализации: например, если год меньше 100, прибавить 2000. Но сначала убедитесь по спецификации источника данных, что такое допущение корректно — иначе старые архивные данные могут быть интерпретированы неверно.

Есть ли разница между Дата() и ТекущаяДата() при работе со строками?

Да, это разные функции. Дата() — конструктор, создающий значение даты из чисел или строки. ТекущаяДата() возвращает текущую дату и время сеанса и к преобразованию строк отношения не имеет. Для получения даты из строки ТекущаяДата() не используется.