При работе с внешними системами, обмене данными через JSON или интеграции с веб-сервисами часто возникает задача преобразования стандартной строки даты и времени вида "2019-10-28 19:03:21" в компактный цифровой формат "20191028190321". В этой статье мы разберем, как эффективно решить эту задачу с помощью регулярных выражений, рассмотрим современные возможности платформы 1С и классические методы для старых версий.
Рассмотрим исходную строку. Она содержит цифры и символы-разделители: дефисы, пробелы и двоеточия. Чтобы получить только цифры, нам нужно найти все нецифровые символы и заменить их на «пустую строку». Проанализируем возможные шаблоны (паттерны) регулярных выражений:
[\-:\s]. Здесь в квадратных скобках указаны конкретные символы: дефис (экранирован), двоеточие и пробельный символ. Это точное, но узкоспециализированное решение.\D. Этот символ обозначает любую «не-цифру». Это более надежный вариант, так как он удалит любые случайные символы (точки, запятые, буквы), которые могут по ошибке оказаться в строке, оставив только чистый цифровой ряд.Начиная с версии платформы 8.3.24, разработчикам больше не нужно обращаться к системным библиотекам Windows. Платформа получила встроенный объект РегулярноеВыражение. Разберем по шагам, как выполнить замену с его помощью:
Сначала мы инициализируем объект выражения, передавая в него паттерн и настройки. Метод Заменить() позволяет выполнить трансформацию одной строкой.
// Создаем объект регулярного выражения
// Используем \D для поиска всех не-цифр
РегВыр = Новый РегулярноеВыражение("\\D");
ИсходнаяСтрока = "2019-10-28 19:03:21";
// Выполняем замену всех найденных вхождений на пустую строку
Результат = РегВыр.Заменить(ИсходнаяСтрока, "");
Сообщить(Результат); // Выведет: 20191028190321
Обратите внимание на двойной обратный слэш \\D. В языке 1С символ слэша является служебным, поэтому для передачи его в движок регулярных выражений его необходимо экранировать.
Если ваша конфигурация работает на версии платформы ниже 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", что не соответствует нашей задаче.
Выясним причину, почему иногда стоит отказаться от регулярных выражений. Если формат строки всегда строго фиксирован, использование СтрЗаменить() или функций работы с датами будет работать быстрее, так как не требует инициализации тяжелых объектов RegExp. Проанализируем пример:
ИсходнаяСтрока = "2019-10-28 19:03:21";
// Цепочка замен
Результат = СтрЗаменить(ИсходнаяСтрока, "-", "");
Результат = СтрЗаменить(Результат, ":", "");
Результат = СтрЗаменить(Результат, " ", "");
// Или через Формат, если исходные данные — тип Дата
Если ТипЗнч(ЗначениеДаты) = Тип("Дата") Тогда
Результат = Формат(ЗначениеДаты, "ДФ=yyyyMMddHHmmss");
КонецЕсли;
Этот способ предпочтителен для высоконагруженных участков кода (например, при обработке тысяч строк в цикле), так как регулярные выражения потребляют больше вычислительных ресурсов.
Рассмотрим подробнее вопрос совместимости. Это критически важно для серверных приложений:
Таким образом, для современных систем 1С лучшим выбором будет использование нативного объекта РегулярноеВыражение с паттерном \D, так как это обеспечивает чистоту кода, безопасность данных и корректную работу на любой ОС.