Разработка и Конфигурация · 10 мин
1С 8: как из строки получить дату
Как в 1С 8 преобразовать строку в дату: функция Дата(), состав шаблона, обработка ошибок, разбор форматов ДДММГГГГ и примеры кода на встроенном языке.
Задача преобразования строки в дату возникает в 1С 8 постоянно: при загрузке данных из файлов, обмене с внешними системами, разборе ответов веб-сервисов и обработке пользовательского ввода. Встроенный язык платформы не содержит функции вида «СтрокаВДату», поэтому разработчику нужно знать рабочие способы конвертации и их ограничения.
Основной инструмент — функция Дата(), которая принимает строку строго определённого формата. Кроме неё применяются разбор строки на составляющие с последующей сборкой даты из чисел, а также функция XMLЗначение() для данных в формате XML. Каждый способ подходит для своих ситуаций и по-разному реагирует на некорректный ввод.
Критически важный момент — обработка ошибок. Если строка не соответствует ожидаемому формату, функция Дата() вызывает исключение, которое при отсутствии обработки прервёт выполнение кода. Поэтому любое преобразование строки в дату в прикладном решении должно сопровождаться проверкой результата.
Функция Дата() со строковым параметром
Функция Дата() имеет несколько вариантов синтаксиса. Вариант со строковым параметром принимает значение в формате «ГГГГММДДччммсс», где время можно опустить. Разделители между частями не допускаются — ни точки, ни дефисы, ни пробелы внутри основной части.
ДатаСтрокой = "20260315";
Результат = Дата(ДатаСтрокой); // 15.03.2026 0:00:00
СоВременем = Дата("20260315143000"); // 15.03.2026 14:30:00
Порядок частей фиксированный: четыре цифры года, две цифры месяца, две цифры дня, затем необязательное время. Если строка короче восьми символов, содержит буквы или несуществующие значения (месяц 13, день 40), платформа выбрасывает исключение «Преобразование значения к типу Дата не может быть выполнено».
На практике формат «ГГГГММДД» встречается при обмене с банковскими системами, в именах файлов выгрузок и в ответах некоторых API. Если входные данные уже в таком виде, функция Дата() — самое короткое и надёжное решение.
Попытка
Результат = Дата(СтрокаДаты);
Исключение
Результат = Дата(1,1,1); // пустая дата как признак ошибки
КонецПопытки;Разбор строки произвольного формата
Чаще всего строка приходит в «человеческом» виде: «15.03.2026», «15-03-2026» или «2026-03-15». Такие значения напрямую в Дата() передать нельзя — их нужно предварительно разобрать на числовые компоненты и собрать дату вариантом функции с числовыми параметрами: Дата(Год, Месяц, День, Час, Минута, Секунда).
Универсальный приём — заменить все разделители на один символ и разбить строку функцией СтрРазделить() (доступна начиная с версии платформы 8.3.6) или последовательными вызовами СтрНайти() и Лев()/Сред() на более ранних версиях.
Функция СтрокаВДату(СтрокаДаты)
Подготовленная = СтрЗаменить(СтрокаДаты, ".", " ");
Подготовленная = СтрЗаменить(Подготовленная, "-", " ");
Подготовленная = СтрЗаменить(Подготовленная, "/", " ");
Части = СтрРазделить(СокрЛП(Подготовленная), " ");
Если Части.Количество() < 3 Тогда
Возврат Дата(1,1,1);
КонецЕсли;
Возврат Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));
КонецФункции
Обратите внимание на порядок аргументов в последней строке: функция Дата() ожидает сначала год, потом месяц, потом день, а в строке «15.03.2026» день идёт первым. Перестановка индексов — самая частая ошибка в таком коде: вместо 15 марта получается «третий день пятнадцатого месяца», что вызывает исключение.
Преобразование через XMLЗначение и формат ISO
Если данные приходят из веб-сервисов, XML-документов или JSON в стандартизованном виде «2026-03-15T14:30:00», удобнее использовать функцию XMLЗначение(Тип("Дата"), СтрокаЗначения). Она понимает каноническое представление даты и времени по стандарту XML Schema, включая время и смещение часового пояса.
ДатаИзXML = XMLЗначение(Тип("Дата"), "2026-03-15T14:30:00");
Функция строга к формату: дефисы между частями даты обязательны, дата и время разделяются буквой «T». Строку «15.03.2026» она не примет. Зато для машинных обменов это самый предсказуемый способ — формат ISO 8601 однозначен и не зависит от региональных настроек.
При загрузке JSON через ПрочитатьJSON() с параметром ПрочитатьВСоответствие даты по умолчанию остаются строками, и их тоже удобно доводить до типа «Дата» именно через XMLЗначение, если источник отдаёт ISO-формат.
Сравнение способов
Подходит для машинных форматов без разделителей; короткий код, но не принимает точки и дефисы
Универсален для любых форматов пользовательского ввода; требует аккуратной проверки частей и порядка
Идеален для ISO-формата из веб-сервисов и XML; не работает с локализованными строками
Защита от ошибок и проверка результата
Любое преобразование строки в дату должно быть обёрнуто в конструкцию Попытка...Исключение...КонецПопытки. Без неё единственная некорректная строка в загружаемом файле из тысячи записей прервёт всю обработку, и пользователь получит техническое сообщение вместо понятного объяснения.
В блоке Исключение полезно не просто «проглатывать» ошибку, а фиксировать её: записывать в журнал регистрации исходную строку и текст ошибки через ОписаниеОшибки(). Это позволит после загрузки показать пользователю список проблемных значений, а не молча потерять данные.
Дополнительный контроль — проверка результата на пустую дату. Если функция вернула Дата(1,1,1) (отображается как 01.01.0001), значит преобразование не удалось или исходная строка была пустой. Сравнение Если Результат = '00010101' Тогда — стандартный способ такой проверки.
Как проверить результат
Осмысленная дата в ожидаемом диапазоне
01.01.0001 — преобразование не выполнено или строка пустая
Совпадают с исходной строкой
Значения переставлены местами — ошибка в порядке аргументов
Нет записей об ошибках преобразования
Исключения «Преобразование значения к типу Дата»
Особые случаи: время, двузначный год, локализация
Если строка содержит время («15.03.2026 14:30»), сначала отделите дату от времени по пробелу, затем разбирайте каждую часть отдельно. Время разбирается по двоеточию аналогично дате, а компоненты передаются в Дата(Год, Месяц, День, Час, Минута, Секунда).
Двузначный год («15.03.24») — источник неоднозначности. Платформа не угадывает столетие автоматически при ручном разборе, поэтому правило придётся задать самостоятельно: например, значения до 50 считать 2000-ми, остальные — 1900-ми. Такое правило обязательно согласуйте с логикой источника данных.
Строки с названиями месяцев («15 марта 2026» или «March 15, 2026») штатными средствами напрямую не разбираются. Потребуется таблица соответствия названий месяцев числам с учётом языка и падежа. Для русского языка учитывайте родительный падеж: «марта», а не «март».
Где это применяется на практике
Типовой сценарий — загрузка выписок, прайсов и заказов из CSV и Excel. Колонки с датами при чтении через ТекстовыйДокумент или табличный документ приходят как строки, и каждую нужно преобразовать перед записью в регистр или документ. Здесь правильный выбор — единая функция преобразования в общем модуле, а не разрозненный код в каждой обработке.
Второй сценарий — обмен через HTTP-запросы и файлы обмена, где даты сериализованы в ISO-формат. Третий — интерактивный ввод: когда пользователь вводит дату в строковое поле (например, в обработке без поля типа «Дата»), значение нужно проверить и преобразовать до использования в запросе.
Рекомендуемая практика — оформить преобразование одной универсальной функцией в общем модуле: она принимает строку, пробует несколько известных форматов, возвращает дату или пустое значение и при необходимости сообщение об ошибке. Это избавляет от копирования кода и централизует обработку ошибок.
- 1Выясните точный формат строки в источнике данных: порядок частей, разделители, наличие времени
- 2Выберите способ: Дата() для ГГГГММДД, XMLЗначение для ISO, ручной разбор для остального
- 3Напишите функцию преобразования с обёрткой Попытка/Исключение
- 4Проверьте результат на пустую дату 01.01.0001 и на перестановку дня и месяца
- 5Протестируйте на граничных значениях: 29 февраля, пустая строка, строка с буквами
Что важно запомнить
Прямой функции «строка в дату» в 1С 8 нет: используйте Дата("ГГГГММДДччммсс") для машинного формата, XMLЗначение для ISO и ручной разбор с Дата(Год, Месяц, День) для произвольных строк. Всегда обрабатывайте исключения и проверяйте результат на пустую дату и правильный порядок дня и месяца.
Частые вопросы
Почему Дата("15.03.2026") выдаёт ошибку?
Строковый вариант функции Дата() принимает только формат ГГГГММДД без разделителей. Точки, дефисы и пробелы не допускаются. Уберите разделители функцией СтрЗаменить и переставьте части в порядок год-месяц-день, либо разберите строку на числа и вызовите Дата(Год, Месяц, День).
Как преобразовать строку «2026-03-15T14:30:00» из веб-сервиса?
Используйте XMLЗначение(Тип("Дата"), СтрокаЗначения) — она понимает формат ISO 8601 с буквой «T» между датой и временем. Предварительно убедитесь, что строка не содержит смещения часового пояса, которое нужно учесть отдельно.
Как проверить, что строка вообще является датой, до преобразования?
Штатной функции проверки нет. Практический подход — выполнить преобразование внутри Попытка/Исключение: если исключения не было, строка корректна. Дополнительно можно проверить длину строки и наличие только цифр и допустимых разделителей.
Что возвращать из функции, если строка не преобразовалась?
Общепринятый вариант — пустая дата Дата(1,1,1), которую легко проверить сравнением с '00010101'. Альтернатива — возвращать структуру с признаком успеха и текстом ошибки, если вызывающему коду нужно объяснение причины.
Как разобрать дату с двузначным годом, например «15.03.24»?
Разбейте строку по разделителю, преобразуйте год в число и добавьте столетие по согласованному правилу: например, значения меньше 50 считать 2000-ми годами, остальные — 1900-ми. Правило должно соответствовать логике источника данных.
Можно ли преобразовать строку «15 марта 2026» штатными средствами?
Напрямую — нет. Потребуется соответствие названий месяцев числам с учётом падежа («марта» = 3) и языка. Замените название месяца на число, затем соберите дату через Дата(Год, Месяц, День).