Как с помощью регулярного выражения убрать разделители из строки даты в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с внешними системами, обмене данными через JSON или интеграции с веб-сервисами часто возникает задача преобразования стандартной строки даты и времени вида "2019-10-28 19:03:21" в компактный цифровой формат "20191028190321". В этой статье мы разберем, как эффективно решить эту задачу с помощью регулярных выражений, рассмотрим современные возможности платформы 1С и классические методы для старых версий.

Анализ задачи и выбор паттерна

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

  1. Явное перечисление: паттерн [\-:\s]. Здесь в квадратных скобках указаны конкретные символы: дефис (экранирован), двоеточие и пробельный символ. Это точное, но узкоспециализированное решение.
  2. Универсальный метасимвол: паттерн \D. Этот символ обозначает любую «не-цифру». Это более надежный вариант, так как он удалит любые случайные символы (точки, запятые, буквы), которые могут по ошибке оказаться в строке, оставив только чистый цифровой ряд.

Решение 1: Использование нативных регулярных выражений (платформа 8.3.24 и выше)

Начиная с версии платформы 8.3.24, разработчикам больше не нужно обращаться к системным библиотекам Windows. Платформа получила встроенный объект РегулярноеВыражение. Разберем по шагам, как выполнить замену с его помощью:

Сначала мы инициализируем объект выражения, передавая в него паттерн и настройки. Метод Заменить() позволяет выполнить трансформацию одной строкой.


// Создаем объект регулярного выражения
// Используем \D для поиска всех не-цифр
РегВыр = Новый РегулярноеВыражение("\\D"); 

ИсходнаяСтрока = "2019-10-28 19:03:21";
// Выполняем замену всех найденных вхождений на пустую строку
Результат = РегВыр.Заменить(ИсходнаяСтрока, "");

Сообщить(Результат); // Выведет: 20191028190321

Обратите внимание на двойной обратный слэш \\D. В языке 1С символ слэша является служебным, поэтому для передачи его в движок регулярных выражений его необходимо экранировать.

Решение 2: Использование COM-объекта (для старых версий платформы)

Если ваша конфигурация работает на версии платформы ниже 8.3.24 и используется ОС Windows, стандартным способом является использование объекта VBScript.RegExp. Посмотрим на пример кода:


// Создаем объект через COM-соединение
РегЭкспо = Новый COMОбъект("VBScript.RegExp");

// Настраиваем параметры поиска
РегЭкспо.IgnoreCase = Ложь; // Учитывать регистр
РегЭкспо.Global = Истина;     // Искать ВСЕ вхождения, а не только первое
РегЭкспо.MultiLine = Ложь;   // Однострочный режим

// Устанавливаем паттерн для поиска не-цифр
РегЭкспо.Pattern = "\D";

ИсходнаяСтрока = "2019-10-28 19:03:21";
// Выполняем замену
Результат = РегЭкспо.Replace(ИсходнаяСтрока, "");

Сообщить(Результат); // Выведет: 20191028190321

Важный момент: Обязательно устанавливайте свойство Global = Истина. Если этого не сделать, регулярное выражение найдет и заменит только самый первый дефис, и вы получите результат "201910-28 19:03:21", что не соответствует нашей задаче.

Решение 3: Альтернативный метод через встроенные функции

Выясним причину, почему иногда стоит отказаться от регулярных выражений. Если формат строки всегда строго фиксирован, использование СтрЗаменить() или функций работы с датами будет работать быстрее, так как не требует инициализации тяжелых объектов RegExp. Проанализируем пример:


ИсходнаяСтрока = "2019-10-28 19:03:21";

// Цепочка замен
Результат = СтрЗаменить(ИсходнаяСтрока, "-", "");
Результат = СтрЗаменить(Результат, ":", "");
Результат = СтрЗаменить(Результат, " ", "");

// Или через Формат, если исходные данные — тип Дата
Если ТипЗнч(ЗначениеДаты) = Тип("Дата") Тогда
    Результат = Формат(ЗначениеДаты, "ДФ=yyyyMMddHHmmss");
КонецЕсли;

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

Сравнение методов и кроссплатформенность

Рассмотрим подробнее вопрос совместимости. Это критически важно для серверных приложений:

Таким образом, для современных систем 1С лучшим выбором будет использование нативного объекта РегулярноеВыражение с паттерном \D, так как это обеспечивает чистоту кода, безопасность данных и корректную работу на любой ОС.

← На главную