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

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

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

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

Преобразование строки в значение типа «Дата» — одна из самых частых задач при разработке и доработке конфигураций 1С. С ней сталкиваются при загрузке данных из файлов CSV и Excel, при обмене с внешними системами через JSON и XML, при разборе ответов веб-сервисов и при ручном вводе дат пользователями в текстовые поля.

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

Главная сложность — форматы. Строка «01.02.2026» в одной системе означает 1 февраля, а в другой (американский формат) — 2 января. Ошибка в интерпретации приводит к некорректным датам в документах, отчётах и регистрах, причём обнаруживается это часто только при сверке. Поэтому любое преобразование должно сопровождаться проверкой результата.

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

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

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

Способ 1. Функция Дата() из строки

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

ДатаОплаты = Дата("20260315");        // 15 марта, время 00:00:00

ДатаВремя = Дата("20260315143000"); // 15 марта, 14:30:00

Если строка не соответствует формату или содержит невозможные значения (месяц 13, день 32), платформа выдаст ошибку «Ошибка преобразования данных». Поэтому при обработке внешних данных вызов лучше оборачивать в Попытка...Исключение и фиксировать проблемные строки в журнале.

Недостаток способа очевиден: реальные файлы редко содержат даты в виде «20260315». Чаще встречаются «15.03.2026», «2026-03-15» или «15 марта 2026». Для них строку сначала нужно привести к нужному виду или разобрать вручную.

Способ 2. Функция СтрокаВДату()

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

ДатаОтгрузки = СтрокаВДату("2026-03-15");

При этом поведение функции зависит от региональных настроек: строка «03/04/2026» может быть понята как 3 апреля или 4 марта. Если файл формирует внешняя система, обязательно проверьте на тестовых примерах, как интерпретируются даты с двусмысленным порядком дня и месяца.

Способ 3. Ручной разбор строки и сборка даты из компонентов

Когда формат строки известен, но нестандартен, надёжнее всего разобрать её вручную: выделить день, месяц и год, преобразовать их в числа и передать в конструктор Дата(Год, Месяц, День). Этот способ полностью контролируем и не зависит от региональных настроек.

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

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

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

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

КонецЕсли;

Попытка

Возврат Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));

Исключение

Возврат Дата(1, 1, 1);

КонецПопытки;

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

Здесь предполагается формат «ДД.ММ.ГГГГ». Если источник отдаёт «ГГГГ-ММ-ДД», достаточно поменять разделитель и порядок индексов. Для форматов с названием месяца («15 марта 2026») используют соответствие: название месяца → номер, с учётом падежных окончаний.

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

Как выбрать способ под свой формат данных

Выбор зависит от того, откуда приходит строка и насколько стабилен её формат. Ниже — практическое сопоставление вариантов.

Формат строкиРекомендуемый способОсобенности
«20260315», «20260315143000»Дата("...")Прямое преобразование без подготовки
«2026-03-15» (ISO)СтрокаВДату() или ручной разборПроверить поддержку на используемой версии платформы
«15.03.2026»Ручной разборПолный контроль порядка дня и месяца
«03/04/2026»Ручной разборДвусмысленный формат — автоматика рискованна
«15 марта 2026»Ручной разбор с соответствием месяцевУчитывать падежи и регистр букв

Сравнение подходов

Дата(строка)

Быстро и просто, но требует строгий формат ГГГГММДДччммсс без разделителей

СтрокаВДату()

Понимает несколько форматов, но результат зависит от региональных настроек

Ручной разбор

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

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

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

Если ДатаРезультат = Дата(1, 1, 1) Тогда

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

КонецЕсли;

Дополнительно полезно проверять граничные случаи: високосный год (29 февраля), месяцы с 30 днями, год из двух цифр («15.03.25»). Двузначный год — отдельный источник ошибок: заранее определите правило, к какому столетию его относить.

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

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

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

Дата отличается от 01.01.0001 и попадает в ожидаемый период

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

Пустая дата или год далеко за пределами рабочего диапазона

Даты с днём больше 12
Норма

День и месяц стоят на своих местах (например, 25.03 — 25 марта)

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

Даты с днём ≤12 сдвинуты на месяц — перепутан порядок

Журнал загрузки
Норма

Число нераспознанных строк нулевое или объяснимо

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

Массовые ошибки преобразования — неверно определён формат

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

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

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

Четвёртая — попытка сравнивать даты как строки. Лексикографическое сравнение «15.03.2026» и «20.12.2026» даст неверный результат с точки зрения хронологии. Сравнивать нужно только значения типа «Дата».

Типичные ошибки
01
Доверие автораспознаванию формата без тестов — день и месяц меняются местами незаметно
02
Нет Попытка/Исключение — одна битая строка прерывает всю загрузку
03
Сравнение дат как строк — неверная хронология и ошибки в отборах
04
Игнорирование двузначного года — даты попадают не в тот век
05
Потеря времени при разборе — сдвиг границ периодов в отчётах

Преобразование в запросах и обратное преобразование даты в строку

В языке запросов 1С напрямую преобразовать произвольную строку в дату нельзя — запрос работает с уже типизированными данными. Если даты хранятся в базе строками (что само по себе признак проблемы проектирования), преобразование выполняют в коде при выгрузке результата запроса или исправляют структуру данных.

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

СтрокаДляФайла = Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd");

СтрокаДляПечати = Формат(ТекущаяДата(), "ДЛФ=D");

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

Итог

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

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

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

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

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

Как преобразовать строку «20260315» в дату?

Напрямую: Дата("20260315"). Если строка может содержать ошибки, оберните вызов в Попытка...Исключение и проверьте, что результат не равен пустой дате Дата(1,1,1).

Что делать, если день и месяц меняются местами при загрузке?

Это признак двусмысленного формата и автоматического распознавания. Откажитесь от СтрокаВДату() для таких данных и реализуйте ручной разбор с явным порядком компонентов, соответствующим формату источника.

Как проверить, что строка содержит корректную дату, до преобразования?

Разбейте строку на компоненты и проверьте: год в разумном диапазоне, месяц от 1 до 12, день от 1 до 31 с учётом конкретного месяца. Самый простой способ — выполнить преобразование в Попытке и считать исключение признаком некорректной строки.

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

Нет, язык запросов не преобразует произвольные строки в даты. Преобразование выполняют в коде до передачи параметра в запрос или после выгрузки результата. Если даты хранятся строками в базе, это повод пересмотреть структуру данных.

Как обработать дату с двузначным годом, например «15.03.25»?

Заранее определите правило привязки к столетию, например: годы 00–30 относить к 2000-м, 31–99 — к 1900-м. Реализуйте это правило в коде разбора явно, не полагаясь на автоматику платформы или операционной системы.