К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как в строке найти дату в 1С

Как найти дату в строке в 1С: функции СтрНайти, Дата(), преобразование строки в дату, работа с регулярными шаблонами и проверка результата.

Задача найти дату внутри строки возникает в 1С регулярно: при загрузке данных из файлов, обработке наименований документов, разборе текстов выписок, импорте прайсов и обмене с внешними системами. Дата может быть записана в самых разных форматах — «12.05.2026», «2026-05-12», «12 мая 2026», — и встроенного оператора «найти дату в строке» в языке 1С нет. Поэтому задача решается комбинацией поиска подстроки, разбора по разделителям и преобразования в тип Дата.

Выбор подхода зависит от того, насколько предсказуем формат. Если дата всегда стоит в известной позиции и записана одинаково, достаточно функций работы со строками. Если формат плавает или дата «утоплена» в произвольном тексте, потребуется более аккуратный разбор с проверками, иначе вместо даты в базу попадёт пустое значение или ошибка преобразования.

Ниже разобраны рабочие приёмы: поиск по известному шаблону, разбор строки по разделителям, преобразование через функцию Дата(), обработка текстовых месяцев и контроль результата. Все примеры применимы во встроенном языке 1С:Предприятие 8.

Как определить, в каком виде дата записана в строке

Прежде чем писать код, посмотрите на реальные данные. Откройте несколько десятков строк из источника — файла загрузки, наименования, комментария — и выпишите встречающиеся форматы. Чаще всего встречаются «ДД.ММ.ГГГГ», «ДД.ММ.ГГ», «ГГГГ-ММ-ДД», «ГГГГММДДЧЧММСС» и варианты с текстовым месяцем.

Важно понять, стоит ли дата в фиксированной позиции. Например, в имени файла «Реализация_12.05.2026_№154.pdf» дату можно найти по шаблону с точками, а в строке «оплата по счёту от 12.05.2026 поступила» — только по контексту. От этого зависит, хватит ли простого поиска подстроки или нужен перебор фрагментов текста.

Отдельно проверьте наличие времени. Строка вида «12.05.2026 14:30:00» требует разбора и даты, и времени, а функция Дата() принимает до шести аргументов: год, месяц, день, час, минута, секунда. Если время не нужно, его достаточно отсечь.

Формат фиксированныйНапример, всегда ДД.ММ.ГГГГ

Достаточно разбора по разделителям

Позиция известнаДата в начале или конце строки

Подойдут Лев, Прав или Сред

Дата в произвольном текстеПозиция плавает

Нужен поиск по шаблону и перебор фрагментов

Текстовый месяц«12 мая 2026»

Потребуется соответствие названий месяцев числам

Поиск подстроки с датой через СтрНайти

Базовый инструмент — функция СтрНайти (в старых версиях платформы — Найти). Она возвращает позицию первого вхождения подстроки. Если дата начинается после известного маркера, например после слова «от », позицию вычисляют так:

СтрокаИсточник = "Счёт на оплату от 12.05.2026 № 154";

ПозицияМаркера = СтрНайти(СтрокаИсточник, "от ");

Если ПозицияМаркера > 0 Тогда

НачалоДаты = ПозицияМаркера + СтрДлина("от ");

СтрокаДаты = Сред(СтрокаИсточник, НачалоДаты, 10); // "12.05.2026"

КонецЕсли;

Длина 10 символов соответствует формату «ДД.ММ.ГГГГ». Этот приём надёжен, только если день и месяц всегда двузначные. Если в данных встречается «1.5.2026», фиксированная длина даст обрезанную строку, и преобразование завершится ошибкой.

Для защиты от обрыва строки проверяйте, что найденный фрагмент действительно похож на дату: длина не меньше ожидаемой, разделители на своих местах, а символы — цифры и точки. Простейшая проверка — убедиться, что Сред(СтрокаДаты, 3, 1) = "." и Сред(СтрокаДаты, 6, 1) = "." для формата с точками.

Разбор строки по разделителям

Когда длина компонентов даты плавает, надёжнее разбить строку по разделителю. В платформе есть функция СтрРазделить, возвращающая массив частей:

СтрокаДаты = "1.5.2026";

Части = СтрРазделить(СтрокаДаты, ".");

Если Части.Количество() = 3 Тогда

День = Число(Части[0]);

Месяц = Число(Части[1]);

Год = Число(Части[2]);

Если Год < 100 Тогда

Год = Год + 2000; // для формата ДД.ММ.ГГ

КонецЕсли;

Результат = Дата(Год, Месяц, День);

КонецЕсли;

Обратите внимание на двузначный год. Значение «24» нужно явно дополнять до 2026, иначе получится дата 24 года. Границу века выбирайте осознанно: для архивных документов «24» может означать и 1924 год, хотя в учётных данных это редкость.

Для формата с временем сначала отделите дату от времени разбором по пробелу, затем каждую часть разбирайте по своим разделителям: дату — по точкам или дефисам, время — по двоеточиям. После этого соберите значение через Дата(Год, Месяц, День, Час, Минута, Секунда).

1c
Части = СтрРазделить("1.5.2026", "."); Результат = Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));

Преобразование строки в дату через Дата()

Функция Дата() работает в двух режимах. Первый — числовой: Дата(2026, 5, 12) возвращает 12 мая 2026. Это основной и самый управляемый способ, потому что вы сами контролируете порядок компонентов.

Второй — строковый: Дата("20260512143000") разбирает строку во внутреннем формате ГГГГММДДЧЧММСС. Допустимы усечённые варианты: «20260512» — только дата. Этот режим удобен при обмене с системами, которые отдают дату сплошной цифровой строкой, например в выгрузках банков или XML-потоках.

ДатаИзСтроки = Дата("20260512");        // 12.05.2026 0:00:00

ДатаВремя = Дата("20260512143000"); // 12.05.2026 14:30:00

Если исходная строка в другом порядке — «12052026», — сначала переставьте компоненты функциями Сред и конкатенацией, а затем передайте результат в Дата(). Попытка скормить функции строку «12.05.2026» напрямую приведёт к ошибке преобразования.

Дата в произвольном тексте и текстовые месяцы

Когда дата «плавает» по строке, применяют перебор: строку разбивают на слова или сканируют посимвольно, выделяя фрагменты из цифр и разделителей, а каждый кандидат проверяют попыткой преобразования. В управляемых формах и на сервере также доступна работа с регулярными выражениями через COM-объект VBScript.RegExp на Windows-сервере, что заметно упрощает поиск шаблона «две цифры, точка, две цифры, точка, четыре цифры».

Для текстовых месяцев («12 мая 2026») создайте соответствие названий числам. Учтите, что в реальных данных месяцы встречаются в разных падежах и регистрах: «мая», «Май», «МАЯ». Приводите слово к нижнему регистру через НРег перед поиском в соответствии.

Месяцы = Новый Соответствие;

Месяцы.Вставить("января", 1); Месяцы.Вставить("февраля", 2);

Месяцы.Вставить("марта", 3); Месяцы.Вставить("апреля", 4);

Месяцы.Вставить("мая", 5); Месяцы.Вставить("июня", 6);

// ... и так далее

НомерМесяца = Месяцы[НРег(СловоМесяц)];

Если соответствие вернуло Неопределено, слово не является месяцем — пропускайте такой фрагмент, а не подставляйте значение по умолчанию. Подстановка «первого января» вместо нераспознанной даты — частая причина скрытых ошибок в загруженных данных.

Маршрут решения

Как выбрать способ разбора

Формат и позиция даты фиксированыИспользуйте СтрНайти + Сред и преобразование Дата(год, месяц, день)
Длина компонентов плавает, но разделитель одинРазбейте строку через СтрРазделить и соберите дату из частей
Строка в формате ГГГГММДД или ГГГГММДДЧЧММССПередайте её напрямую в Дата(строка)
Дата в произвольном тексте с текстовым месяцемРазбивайте на слова и используйте соответствие названий месяцев числам

Проверка результата и типичные ошибки

Любое преобразование завершайте контролем. Пустая дата в 1С — это Дата(1,1,1), и проверка выглядит так: Если Результат = Дата(1,1,1) Тогда ... КонецЕсли. Дополнительно полезно проверять разумность значения: дата загрузки не должна быть в далёком будущем или раньше даты начала ведения учёта.

Числовые компоненты перед сборкой проверяйте диапазонами: месяц от 1 до 12, день от 1 до 31. Более строгая проверка — сравнить результат обратным форматированием: Формат(Результат, "ДЛФ=D") и сопоставить с исходным фрагментом. Расхождение означает, что разбор пошёл не по тому шаблону.

Опасная ловушка — американский формат ММ/ДД/ГГГГГ в данных от зарубежных систем. Строка «05.12.2026» может означать и 5 декабря, и 12 мая. Если источник не документирован, проверьте по косвенным признакам: значения больше 12 в первой позиции однозначно указывают на день.

Типичные ошибки
01
Передача строки «12.05.2026» напрямую в Дата() — исключение, прерывающее обработку
02
Фиксированная длина фрагмента при плавающих числах — обрезанные значения вроде «1.5.202»
03
Игнорирование двузначного года — даты попадают в первый век
04
Отсутствие проверки на Дата(1,1,1) — пустые даты молча уходят в базу
05
Перепутанный порядок дня и месяца при обмене с зарубежными системами — систематическое смещение дат

Контрольные точки после загрузки

После массовой обработки строк сверьте результат с ожиданиями. Сделайте выборку загруженных значений и отсортируйте по дате: выбросы вроде 01.01.0001 или дат за пределами периода загрузки сразу покажут проблемные строки. Полезно вести счётчик распознанных и нераспознанных значений и выводить его в конце обработки.

Все строки, которые не удалось разобрать, сохраняйте в таблицу или протокол с исходным текстом. Это позволит дописать шаблоны разбора под реальные данные и повторить загрузку только для отказов, не трогая корректно обработанную часть.

Контрольные точки

Как проверить результат

Значение после преобразования
Норма

Осмысленная дата в ожидаемом периоде

Тревожный признак

Дата(1,1,1) или дата в далёком будущем/прошлом

Обратное форматирование
Норма

Формат(Результат, "ДЛФ=D") совпадает с исходным фрагментом

Тревожный признак

День и месяц переставлены или значение обрезано

Статистика обработки
Норма

Доля нераспознанных строк близка к нулю

Тревожный признак

Массовые отказы на одном типе строк — шаблон не подходит

Частые вопросы

Можно ли найти дату в строке без программирования?

Частично. В отборах и поиске по спискам доступен поиск по подстроке, но преобразовать найденный текст в тип Дата без кода нельзя. Для разовых задач проще выгрузить данные в табличный документ и обработать средствами поиска, а для регулярных загрузок — написать процедуру разбора.

Что вернёт Дата(), если строка некорректна?

Функция Дата(строка) при невозможности преобразования вызывает исключение, а не возвращает пустое значение. Поэтому вызов оборачивают в Попытка ... Исключение ... КонецПопытки и в ветке исключения присваивают результату Дата(1,1,1) или Неопределено.

Как обработать строку, где несколько дат?

Разбивайте текст на фрагменты и проверяйте каждый кандидат по шаблону, собирая результаты в массив. Определите правило выбора: например, в строке «счёт от 10.05.2026, оплата до 20.05.2026» первая дата — дата документа, вторая — срок оплаты, и привязывать их нужно к контекстным маркерам «от» и «до».

Работает ли СтрНайти в толстом клиенте и старых версиях?

Функции СтрНайти, СтрРазделить и другие с префиксом «Стр» появились в платформе 8.3.6. В более ранних версиях используются Найти() и ручной посимвольный разбор. Проверьте режим совместимости конфигурации: если он ниже 8.3.6, новые функции могут быть недоступны.

Как найти дату в строке запросом, а не кодом?

Язык запросов 1С имеет ограниченные строковые функции (ПОДСТРОКА, выражение поиска ПОДОБНО), но не умеет преобразовывать строку в дату. Практичный путь — выбрать строки запросом, а разбор даты выполнить в коде при обходе выборки.

Что делать с датами в формате Unix timestamp?

Число секунд с 01.01.1970 преобразуют сложением: Дата(1970,1,1) + ЧислоСекунд, учитывая часовой пояс источника. Сначала убедитесь, что значение именно в секундах, а не в миллисекундах — в последнем случае его нужно предварительно разделить на 1000.

Итог

Что важно запомнить

Поиск даты в строке в 1С — это всегда два шага: выделить фрагмент (СтрНайти, Сред, СтрРазделить) и преобразовать его в тип Дата. Функция Дата(строка) понимает только формат ГГГГММДД[ЧЧММСС], остальные форматы разбирают по компонентам. Каждое преобразование завершайте проверкой на Дата(1,1,1) и контролем диапазона, а нераспознанные строки сохраняйте для доработки шаблонов.