Разработка и Конфигурация · 9 мин
Как сделать дату из строки в 1С
Как преобразовать строку в дату в 1С: функция Дата(), форматы строк, работа с XML, проверка результата и типичные ошибки с примерами кода.
Во встроенном языке 1С нет отдельной функции вида «СтрокаВДату», поэтому преобразование строки в дату выполняется через конструктор Дата(), который умеет принимать строковое представление, или через разбор строки на составные части. Выбор способа зависит от того, в каком формате записана исходная строка: внутренний формат 1С, ISO 8601, «дд.мм.гггг» или произвольный текст из файла.
Чаще всего задача возникает при загрузке данных из CSV, Excel, JSON или XML, при обмене с внешними системами и при парсинге ответов веб-сервисов. Во всех этих случаях дата приходит текстом, и её нужно безопасно превратить в значение типа «Дата», чтобы использовать в отборах, запросах и реквизитах документов.
Ниже разобраны рабочие способы преобразования, ограничения каждого из них, проверка результата и типичные ошибки, из-за которых вместо даты получается пустое значение или неверные данные.
Как устроен тип «Дата» и почему строка не преобразуется сама
Тип «Дата» в 1С хранит дату и время с точностью до секунды. Автоматического неявного преобразования строки в дату платформа не выполняет: присваивание строки реквизиту типа «Дата» либо вызовет ошибку преобразования, либо даст пустую дату — в зависимости от контекста. Поэтому преобразование всегда делают явно в коде.
Конструктор Дата() имеет две основные формы. Первая принимает числовые параметры: Дата(Год, Месяц, День, Час, Минута, Секунда), где время можно опустить. Вторая принимает один строковый параметр во внутреннем формате платформы: Дата("20260315143000") — ГГГГММДДччммсс без разделителей.
Способ 1. Конструктор Дата() со строкой во внутреннем формате
Если строка уже имеет вид «ГГГГММДДччммсс», преобразование выполняется одной строкой кода. Часы, минуты и секунды можно опустить — тогда время будет 00:00:00.
ДатаИзСтроки = Дата("20260315"); // 15.03.2026 0:00:00
ДатаСВременем = Дата("20260315143000"); // 15.03.2026 14:30:00
Если входная строка содержит разделители, их предварительно убирают функцией СтрЗаменить(). Это работает, когда порядок частей в строке уже «год-месяц-день», например «2026-03-15»:
Строка = "2026-03-15";
Нормализованная = СтрЗаменить(Строка, "-", "");
ДатаИзСтроки = Дата(Нормализованная);
Способ 2. Разбор строки «дд.мм.гггг» на части
Самый частый формат в российских выгрузках — «дд.мм.гггг» или «дд.мм.гг». Конструктор с одной строкой его не поймёт, поэтому строку разбивают по разделителю через СтрРазделить() и собирают дату из чисел.
Функция СтрокаВДату(СтрокаДаты)
Части = СтрРазделить(СтрокаДаты, ".");
Если Части.Количество() <> 3 Тогда
Возврат Дата(1, 1, 1); // пустая дата как признак ошибки
КонецЕсли;
День = Число(Части[0]);
Месяц = Число(Части[1]);
Год = Число(Части[2]);
Если Год < 100 Тогда
Год = Год + 2000; // осторожно: уточните правило для ваших данных
КонецЕсли;
Возврат Дата(Год, Месяц, День);
КонецФункции
Обратите внимание на двузначный год: «15.03.24» без коррекции превратится в год 24, то есть в начало первого века. Правило дополнения до четырёх знаков зависит от источника данных — единого стандарта здесь нет, и его нужно согласовать с тем, кто формирует файл.
- 1Определите точный формат исходной строки по образцу данных
- 2Уберите лишние пробелы функцией СокрЛП()
- 3Разбейте строку на части через СтрРазделить() по разделителю
- 4Преобразуйте части в числа и соберите дату конструктором Дата(Год, Месяц, День)
- 5Проверьте результат: он не должен быть пустой датой
Способ 3. Даты из XML, JSON и веб-сервисов
При обмене через XML даты обычно передаются в формате ISO 8601: «2026-03-15T14:30:00». Для таких данных платформа предлагает штатный механизм — функции работы с XML-датой, а также сериализацию XDTO, которая преобразует значения автоматически при чтении объекта.
Если чтение выполняется вручную, строку ISO можно нормализовать: убрать дефисы, двоеточия и символ «T», получив внутренний формат платформы:
Строка = "2026-03-15T14:30:00";
С = СтрЗаменить(Строка, "-", "");
С = СтрЗаменить(С, "T", "");
С = СтрЗаменить(С, ":", "");
ДатаИзСтроки = Дата(С);
В JSON даты нередко приходят в виде «/Date(1710502200000)/» (миллисекунды Unix) или в текстовом виде. При чтении через ПрочитатьJSON можно указать параметр преобразования дат, либо обработать значение вручную: Unix-время переводится в дату прибавлением секунд к дате 01.01.1970 с учётом часового пояса.
Проверка корректности результата
После преобразования результат обязательно проверяют. Первый признак ошибки — пустая дата Дата(1,1,1). Второй — значение, выходящее за разумные границы предметной области: дата документа в 1900 году или в далёком будущем почти всегда означает неверный разбор строки.
Полезный приём — обратное форматирование: преобразуйте полученную дату обратно в строку через Формат(ДатаИзСтроки, "ДЛФ=D") и сравните с исходным значением. Совпадение подтверждает корректность разбора.
Если Не ЗначениеЗаполнено(ДатаИзСтроки) Тогда
// фиксируем ошибку в журнале загрузки, строку пропускаем
КонецЕсли;
Как проверить результат
Дата заполнена и попадает в ожидаемый диапазон
Пустая дата 01.01.0001 или явно нереалистичный год
Формат(Дата, "ДЛФ=D") совпадает с исходной строкой
День и месяц переставлены местами
Часы и минуты соответствуют источнику
Смещение на величину часового пояса
Типичные ошибки и ограничения
Главная ошибка — предположение, что Дата("15.03.2026") сработает. Конструктор с одной строкой понимает только внутренний формат, строка с точками даст ошибку или пустое значение. Вторая частая проблема — перестановка дня и месяца при разборе строк из зарубежных источников, где принят формат «мм/дд/гггг».
Ещё одно ограничение: диапазон допустимых дат в 1С ограничен, и значения за его пределами вызывают ошибку. Также помните, что Число() выбросит исключение на нечисловых символах — поэтому разбор строк из внешних файлов оборачивают в Попытка...Исключение с записью проблемной строки в журнал.
Выбор способа под конкретную задачу
Для внутренних строк платформы и формата «ГГГГ-ММ-ДД» достаточно конструктора Дата() с удалением разделителей. Для пользовательских форматов «дд.мм.гггг» пишут функцию-разборщик с проверками. Для XML и обменов через XDTO используют штатную сериализацию, которая преобразует даты без ручного кода. Для JSON с Unix-временем — арифметику от 01.01.1970 с поправкой на часовой пояс.
Как выбрать действие
Что важно запомнить
Преобразование строки в дату делается конструктором Дата(): либо строкой во внутреннем формате ГГГГММДДччммсс, либо числами после разбора строки. Результат всегда проверяют на пустую дату и разумность значения, а внешние данные обрабатывают через Попытка...Исключение.
Частые вопросы
Почему Дата("15.03.2026") возвращает пустую дату или ошибку?
Конструктор с одним строковым параметром распознаёт только внутренний формат платформы ГГГГММДДччммсс без разделителей. Строку «15.03.2026» нужно разбить на части и собрать дату через Дата(2026, 3, 15).
Как преобразовать строку с временем «15.03.2026 14:30»?
Разделите строку на дату и время по пробелу, затем каждую часть разбейте по своему разделителю и передайте все шесть чисел в конструктор: Дата(Год, Месяц, День, Час, Минута, Секунда).
Как отличить неудачное преобразование от реальной пустой даты?
Используйте признак ошибки отдельно от результата: например, функция возвращает структуру с полями «Успешно» и «Дата», либо при ошибке записывает строку в журнал. Сравнение с Дата(1,1,1) показывает только факт пустоты, но не её причину.
Что делать, если формат строки в файле непостоянный?
Сначала соберите статистику реальных значений из файла и определите все встречающиеся шаблоны. Затем в функции разбора проверяйте строку на соответствие каждому шаблону по очереди, а неподходящие значения отправляйте в протокол ошибок для ручного разбора.
Можно ли преобразовать строку в дату в запросе 1С?
Штатной функции преобразования строки в дату в языке запросов нет. Обычно строку преобразуют в коде перед передачей в запрос параметром, либо используют выражение ДАТАВРЕМЯ(Год, Месяц, День) с извлечёнными числовыми частями, если они хранятся отдельно.
Как обрабатывать даты «15 марта 2026» словами?
Штатных средств для такого формата нет. Нужна функция с соответствием названий месяцев числам: строка разбивается на слова, название месяца заменяется номером, после чего дата собирается конструктором. Учитывайте регистр букв и возможные сокращения.