Разработка и Конфигурация · 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.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 год, хотя в учётных данных это редкость.
Для формата с временем сначала отделите дату от времени разбором по пробелу, затем каждую часть разбирайте по своим разделителям: дату — по точкам или дефисам, время — по двоеточиям. После этого соберите значение через Дата(Год, Месяц, День, Час, Минута, Секунда).
Части = СтрРазделить("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.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) и контролем диапазона, а нераспознанные строки сохраняйте для доработки шаблонов.