Разработка и Конфигурация · 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Определите точный формат исходной строки и её разделители
- 2Разбейте строку через СтрРазделить по разделителю
- 3Преобразуйте каждую часть в число функцией Число()
- 4Соберите результат вызовом Дата(Год, Месяц, День, ...)
- 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 КонецЕсли — но только если такое допущение соответствует смыслу данных.
Выбор метода под конкретный источник данных
Выбор метода определяется форматом строки, а не личными предпочтениями. Определите формат по документации источника или по реальным примерам данных, затем применяйте соответствующий вариант из таблицы.
| Формат строки | Пример | Метод |
|---|---|---|
| ГГГГММДД (цифры подряд) | 20260425 | Дата(Строка) |
| ISO 8601 | 2026-04-25T14:30:00 | XMLЗначение(Тип("Дата"), Строка) |
| ДД.ММ.ГГГГ и подобные | 25.04.2026 | СтрРазделить + Дата(Год, Месяц, День) |
| Текстовый месяц | 25 апреля 2026 | Ручной разбор с сопоставлением названий месяцев |
Если формат входных данных не гарантирован (пользовательский ввод, файлы от разных контрагентов), полезно сделать единую функцию преобразования: она последовательно пробует известные форматы и возвращает либо дату, либо признак ошибки. Такая функция централизует логику и избавляет от дублирования проверок по всему коду.
Как выбрать способ преобразования
Обратная задача и смежные приёмы
Обратное преобразование — дату в строку — выполняется функцией Формат(Дата, "ДФ=...") с шаблоном, например Формат(ТекущаяДата(), "ДФ=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. Но сначала убедитесь по спецификации источника данных, что такое допущение корректно — иначе старые архивные данные могут быть интерпретированы неверно.
Есть ли разница между Дата() и ТекущаяДата() при работе со строками?
Да, это разные функции. Дата() — конструктор, создающий значение даты из чисел или строки. ТекущаяДата() возвращает текущую дату и время сеанса и к преобразованию строк отношения не имеет. Для получения даты из строки ТекущаяДата() не используется.