Разработка и Конфигурация · 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Определите точный формат строки-источника на нескольких реальных примерах
- 2Разбейте строку на компоненты через СтрРазделить() или СтрНайти()
- 3Преобразуйте компоненты в числа функцией Число()
- 4Соберите дату конструктором Дата(Год, Месяц, День)
- 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 и попадает в ожидаемый период
Пустая дата или год далеко за пределами рабочего диапазона
День и месяц стоят на своих местах (например, 25.03 — 25 марта)
Даты с днём ≤12 сдвинуты на месяц — перепутан порядок
Число нераспознанных строк нулевое или объяснимо
Массовые ошибки преобразования — неверно определён формат
Типичные ошибки при преобразовании текста в дату
Большинство проблем возникает не из-за самих функций, а из-за невнимательности к исходным данным. Первая распространённая ошибка — доверие автоматическому распознаванию формата без тестовых проверок: на одних строках всё работает, на других день и месяц меняются местами незаметно.
Вторая ошибка — отсутствие обработки исключений. Одна «битая» строка в файле на десять тысяч записей прерывает всю загрузку, если вызов не обёрнут в Попытка...Исключение. Третья — игнорирование времени: если в строке есть часы и минуты, а вы берёте только дату, сравнения границ периодов могут давать неожиданные результаты.
Четвёртая — попытка сравнивать даты как строки. Лексикографическое сравнение «15.03.2026» и «20.12.2026» даст неверный результат с точки зрения хронологии. Сравнивать нужно только значения типа «Дата».
Преобразование в запросах и обратное преобразование даты в строку
В языке запросов 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-м. Реализуйте это правило в коде разбора явно, не полагаясь на автоматику платформы или операционной системы.