Разработка и Конфигурация · 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
Если строка не соответствует формату — содержит точки, дефисы, буквы или неверное количество цифр — платформа выбросит исключение «Преобразование значения к типу Дата не может быть выполнено». Поэтому перед вызовом полезно проверить длину строки и то, что она состоит только из цифр, либо обернуть вызов в Попытка...Исключение.
СтрокаДаты = "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Определите формат исходной строки: где день, где месяц, какой разделитель
- 2Разбейте строку через СтрРазделить по разделителю
- 3Преобразуйте части в числа и проверьте диапазоны (месяц 1-12, день 1-31)
- 4Соберите дату конструктором Дата(Год, Месяц, День)
- 5Проверьте результат на пустую дату и залогируйте ошибочные строки
Способ 3: XMLЗначение для дат из обменов и веб-сервисов
Если строка пришла из XML, JSON-сериализации средствами 1С или веб-сервиса, она обычно записана в формате XML Schema: «2026-12-31T15:30:00» или «2026-12-31». Для таких данных платформа предоставляет штатный механизм — функцию XMLЗначение() с указанием типа.
ТипДатаВремя = Тип("Дата");
Результат = XMLЗначение(ТипДатаВремя, "2026-12-31T15:30:00");
Этот способ корректно обрабатывает часовые пояса и дробные секунды, если они указаны в строке. При несоответствии формата функция выбрасывает исключение, поэтому обёртка в Попытка...Исключение обязательна в пакетных загрузках: одна битая строка не должна останавливать обработку всего файла.
Сравнение способов преобразования
Самый короткий код, но работает только со строгим цифровым форматом без разделителей
Универсален для любых разделителей, но требует знания порядка компонентов и ручной валидации
Идеален для обменов и веб-сервисов, но принимает только формат XML Schema
Проверка результата и обработка ошибок
Признак успешного преобразования — непустая дата. Проверка выполняется сравнением с Дата(1,1,1) или функцией ЗначениеЗаполнено(). В загрузках данных полезно собирать список строк, которые не удалось преобразовать, и показывать его пользователю, а не молча пропускать записи: пропущенная дата в документе может исказить отчёты и проводки.
Если Не ЗначениеЗаполнено(Результат) Тогда
Сообщить("Не удалось преобразовать в дату: " + ИсходнаяСтрока);
КонецЕсли;
Отдельный риск — обратная задача: когда дату сравнивают со строкой. Например, в запросе параметр-дата передаётся строкой, и отбор молча возвращает пустой результат из-за несовпадения типов. Всегда приводите параметры к типу Дата до передачи в запрос.
Частые форматы строк и готовые решения
Ниже сведены типовые форматы и подходящий способ разбора. Это помогает быстро выбрать код под конкретный источник данных.
| Формат строки | Пример | Способ |
|---|---|---|
| ГГГГММДД | 20261231 | Дата(Строка) |
| ДД.ММ.ГГГГ | 31.12.2026 | СтрРазделить по точке |
| ГГГГ-ММ-ДД | 2026-12-31 | СтрРазделить по дефису, порядок Г-М-Д |
| XML Schema | 2026-12-31T15:30:00 | XMLЗначение |
| ДД.ММ.ГГГГ ЧЧ:ММ:СС | 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.