Разработка и Конфигурация · 11 мин
Как привести строку к дате в 1С
Как привести строку к дате в 1С: функция Дата(), форматы строки, обработка ошибок, разбор дат из файлов и внешних систем. Примеры кода и проверка результата.
Преобразование строки в дату — одна из самых частых задач при загрузке данных из файлов, обмене с внешними системами и разборе пользовательского ввода. Во встроенном языке 1С для этого есть штатный механизм: конструктор Дата(), который принимает строку и возвращает значение типа «Дата». Однако он работает только со строго определёнными форматами, и любое отклонение приводит к ошибке или к неверному результату.
Основная сложность в том, что реальные данные редко соответствуют ожидаемому формату: внешние системы отдают даты как «31.12.2026», «2026-12-31T15:30:00», «12/31/2026» или вовсе «31 декабря». Поэтому на практике почти всегда требуется либо предварительная нормализация строки, либо собственный разбор по шаблону. Ниже разобраны штатный способ, ручной парсинг, работа с датой-временем и типичные ошибки.
Штатный способ: конструктор Дата() со строковым параметром
Встроенная функция Дата() может принимать строку, содержащую дату в каноническом формате платформы. Поддерживаются два варианта: ГГГГММДД для даты без времени и ГГГГММДДЧЧММСС для даты со временем. Все компоненты пишутся подряд, без разделителей, с ведущими нулями.
Дата1 = Дата("20261231"); // 31.12.2026 0:00:00
Дата2 = Дата("20261231153000"); // 31.12.2026 15:30:00
Дата3 = Дата("2026123115"); // тоже допустимо: часы без минут и секунд
Строка может быть сокращённой: платформа допускает указание только года, года и месяца и так далее — недостающие компоненты принимают минимальные значения (месяц и день — 01, время — нули). Но на практике лучше всегда передавать полную строку, чтобы поведение было предсказуемым и не зависело от неочевидных правил дополнения.
Если строка не соответствует формату, возникает ошибка «Преобразование значения к типу Дата не может быть выполнено». Поэтому вызов конструктора с внешними данными всегда стоит оборачивать в Попытка...Исключение либо предварительно проверять строку.
Проверка строки перед преобразованием
Безопасный шаблон выглядит так: сначала убедиться, что строка состоит из 8 или 14 цифр, затем выполнить преобразование внутри попытки. Это защищает и от неверного формата, и от некорректных значений вроде месяца «13» или дня «45».
Функция СтрокаВДату(СтрокаДаты)
Результат = Неопределено;
Строка = СокрЛП(СтрокаДаты);
Если СтрДлина(Строка) = 8 Или СтрДлина(Строка) = 14 Тогда
Попытка
Результат = Дата(Строка);
Исключение
Результат = Неопределено;
КонецПопытки;
КонецЕсли;
Возврат Результат;
КонецФункции
Возврат Неопределено вместо падения с ошибкой позволяет вызывающему коду решить, что делать с проблемной записью: пропустить её, записать в журнал или подставить значение по умолчанию. Это стандартный подход при массовой загрузке, где одна «битая» строка не должна останавливать процесс.
Разбор строки в произвольном формате
Чаще всего внешние данные приходят в формате «ДД.ММ.ГГГГ» или «ГГГГ-ММ-ДД». Конструктор Дата() такие строки не примет, поэтому строку разбирают на компоненты и собирают дату из чисел: Дата(Год, Месяц, День). Для разбиения удобно использовать СтрРазделить.
Функция РазобратьДату(СтрокаДаты)
Части = СтрРазделить(СокрЛП(СтрокаДаты), ".");
Если Части.Количество() <> 3 Тогда
Возврат Неопределено;
КонецЕсли;
Попытка
День = Число(Части[0]);
Месяц = Число(Части[1]);
Год = Число(Части[2]);
Возврат Дата(Год, Месяц, День);
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункции
Формат с дефисами и другими разделителями
Если разделитель другой, его достаточно заменить перед разбором или указать в СтрРазделить. Универсальный приём — привести все типовые разделители к одному:
Строка = СтрЗаменить(СтрокаДаты, "-", ".");
Строка = СтрЗаменить(Строка, "/", ".");
Строка = СтрЗаменить(Строка, " ", ".");
После такой нормализации дальнейший разбор идёт единообразно. Учтите, что замена пробела оправдана только если в строке нет времени — иначе пробел между датой и временем тоже будет заменён.
Строка с датой и временем
Формат ISO вида «2026-12-31T15:30:00» часто встречается в JSON и веб-сервисах. Здесь строку делят на дату и время по символу «T» или пробелу, затем каждую часть разбирают отдельно, а дату собирают из шести чисел.
Части = СтрРазделить(СтрокаДаты, "T");
ЧастиДаты = СтрРазделить(Части[0], "-");
ЧастиВремени = СтрРазделить(Части[1], ":");
Результат = Дата(
Число(ЧастиДаты[0]), Число(ЧастиДаты[1]), Число(ЧастиДаты[2]),
Число(ЧастиВремени[0]), Число(ЧастиВремени[1]), Число(ЧастиВремени[2]));
Если время может отсутствовать, перед обращением к Части[1] проверяйте количество элементов массива. Обращение к несуществующему индексу вызовет ошибку, которая не перехватывается логикой разбора даты.
- 1Определите фактический формат строки в источнике данных
- 2Нормализуйте разделители и удалите лишние пробелы
- 3Разбейте строку на компоненты через СтрРазделить
- 4Преобразуйте компоненты в числа и соберите дату через Дата(Год, Месяц, День, Час, Мин, Сек)
- 5Проверьте результат и обработайте ошибочные строки отдельно
Альтернатива: нормализация строки под канонический формат
Вместо разбора на числа можно собрать из исходной строки каноническую строку «ГГГГММДДЧЧММСС» и передать её в Дата(). Это удобно, когда порядок компонентов известен, а разделители произвольные: достаточно удалить все нецифровые символы и переставить фрагменты при необходимости.
// Из "31.12.2026" делаем "20261231"
Части = СтрРазделить(СтрокаДаты, ".");
Канон = Части[2] + Дополнить(Части[1]) + Дополнить(Части[0]);
Результат = Дата(Канон);
Функция дополнения нужна, чтобы месяц «3» превратился в «03». Проще всего использовать Формат(Число(Части[1]), "ЧЦ=2; ЧВН=") или ручную подстановку ведущего нуля. Оба подхода — разбор на числа и сборка канонической строки — равноправны; выбирайте тот, который читается проще в вашем коде.
Сравнение вариантов
Быстро и коротко, но работает только с форматом ГГГГММДД[ЧЧММСС]; требует предварительной нормализации внешних данных
Универсально для любых разделителей и порядка компонентов; больше кода и больше мест для ошибок индексации
Подходит как защитный слой, но не как основной способ разбора форматов, отличных от канонического
Частые ошибки и как их избежать
Самая распространённая проблема — перепутанный порядок дня и месяца. Строка «05.06.2026» в российском формате означает 5 июня, но если данные пришли из системы с американским форматом, это 6 мая. Преобразование пройдёт без ошибки в обоих случаях, а расхождение обнаружится только при сверке. Всегда уточняйте формат у поставщика данных, а не угадывайте его по одной строке.
Вторая типичная ошибка — двузначный год. Строка «31.12.24» после разбора даст год 24, и Дата(24, 12, 31) вернёт дату 24-го года, а не 2026-го. Перед сборкой даты проверяйте длину компонента года и при необходимости дополняйте его до четырёх цифр по согласованному правилу.
Третья группа ошибок — пустые строки и значения вроде «00.00.0000», которые внешние системы используют как признак отсутствия даты. Такие строки нужно отсеивать до преобразования, иначе получите либо ошибку, либо дату вида 30.11.0001, которая потом «протечёт» в отчёты.
Проверка результата преобразования
После преобразования убедитесь, что дата имеет ожидаемое значение. Минимальная проверка — сравнение с пустой датой: Если Результат = '00010101' Тогда .... Более строгий вариант — проверка попадания года в разумный диапазон и сверка нескольких преобразованных строк с эталонными значениями из источника.
При массовой загрузке полезно вести счётчик успешных и отклонённых строк и выводить пользователю примеры отклонённых значений. Это позволяет быстро понять, изменился ли формат в источнике, а не получать молча искажённые данные.
Как проверить результат
Дата с ожидаемым годом, месяцем и днём
Пустая дата 01.01.0001 или год вроде 24/0024
Преобразованное значение совпадает с тем, что видно в файле
День и месяц поменялись местами
Все строки обработаны, отклонённые зафиксированы с причиной
Часть строк потеряна молча или загрузка прервалась на первой ошибке
Ограничения и границы самостоятельной работы
Встроенный язык не содержит функции «распознать дату в любом формате». Локализованные строки («31 декабря 2026», «Dec 31, 2026») придётся разбирать собственным кодом с таблицей соответствия названий месяцев. Если источников с разными форматами много, имеет смысл оформить разбор как отдельную общую функцию с явным параметром «формат», а не размножать одноразовые преобразования по конфигурации.
При обмене через JSON и веб-сервисы учитывайте часовые пояса: строка с суффиксом «Z» или смещением «+03:00» описывает момент времени в конкретной зоне, и простое отбрасывание суффикса может сместить дату на сутки для ночных значений. Если в учёте важна дата без привязки к зоне, договоритесь с отправителем о передаче даты без времени.
Что важно запомнить
Канонический способ — Дата("ГГГГММДД[ЧЧММСС]"). Для остальных форматов строку нормализуют или разбирают через СтрРазделить и собирают дату из чисел. Преобразование всегда защищают проверками и Попытка/Исключение, а результат сверяют с эталоном.
Как преобразовать строку «31.12.2026» в дату в 1С?
Напрямую Дата("31.12.2026") не сработает. Разбейте строку через СтрРазделить по точке, преобразуйте части в числа и соберите дату: Дата(Число(Части[2]), Число(Части[1]), Число(Части[0])).
Почему возникает ошибка «Преобразование значения к типу Дата не может быть выполнено»?
Конструктор Дата() принимает только строки вида ГГГГММДД или ГГГГММДДЧЧММСС без разделителей. Любые точки, дефисы, слэши, буквы или неверная длина строки вызывают эту ошибку. Проверяйте и нормализуйте строку до вызова.
Можно ли преобразовать дату с временем из формата ISO?
Да. Разбейте строку по символу «T» или пробелу на дату и время, каждую часть разбейте по «-» и «:» соответственно, затем вызовите Дата(Год, Месяц, День, Час, Минута, Секунда) с числовыми значениями. Не забудьте проверить наличие части с временем.
Что делать с пустой строкой или значением «00.00.0000»?
Отсекайте такие значения до преобразования: проверяйте строку на пустоту и на шаблон-заглушку. Для них обычно возвращают пустую дату '00010101' или Неопределено — в зависимости от того, что ожидает дальнейшая логика.
Как проверить, что строка содержит корректную дату?
Комбинируйте два приёма: синтаксическую проверку (длина, только цифры, правильные разделители) и преобразование внутри Попытка/Исключение. Дополнительно проверяйте диапазоны: месяц от 1 до 12, день от 1 до 31, год в осмысленных границах.
Есть ли в 1С готовая функция разбора даты в любом формате?
Нет, такой универсальной функции во встроенном языке нет. Штатно поддерживается только канонический формат. Для остальных форматов пишут собственную функцию разбора, которую при повторном использовании выносят в общий модуль.