Как преобразовать строку с датой в нужный формат в 1С

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

В процессе разработки в среде 1С:Предприятие часто возникает задача трансформации данных. Одной из классических задач является преобразование даты из строкового представления в другой строковый формат или в объектный тип Дата. Рассмотрим ситуацию, когда у нас есть строка вида «08.09.2019 11:53», а нам необходимо получить компактную строку «201909081153» для выгрузки в файл, обмена данными или формирования уникального идентификатора.

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

Способ 1: Прямая работа со строкой через функцию Сред

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

Рассмотрим пример реализации:


ИсходнаяСтрока = "08.09.2019 11:53";
// Извлекаем части:
// Позиция 7, длина 4 — год (2019)
// Позиция 4, длина 2 — месяц (09)
// Позиция 1, длина 2 — день (08)
// Позиция 12, длина 2 — часы (11)
// Позиция 15, длина 2 — минуты (53)

Результат = Сред(ИсходнаяСтрока, 7, 4) + Сред(ИсходнаяСтрока, 4, 2) + Сред(ИсходнаяСтрока, 1, 2) + Сред(ИсходнаяСтрока, 12, 2) + Сред(ИсходнаяСтрока, 15, 2);

Этот метод максимально производителен, так как не требует создания объектов типа Дата, однако он крайне чувствителен к формату. Если во входящей строке внезапно изменятся разделители (например, вместо точек появятся тире), код вернет неверный результат.

Способ 2: Преобразование в тип Дата и использование функции Формат

Более правильным и гибким подходом в 1С считается предварительное преобразование строки в объектный тип Дата. Это позволяет системе «понимать» значение как календарную единицу. Выясним, как это сделать правильно.

Сначала преобразуем строку. Важно помнить, что функция Дата() требовательна к формату. Если передать ей строку «08.09.2019 11:53», она сработает только при определенных региональных настройках системы. Для получения гарантированного результата лучше всего использовать функцию Формат() для вывода.

Проанализируем следующий код:


СтрокаДата = "08.09.2019 11:53";
Попытка
    ОбъектДата = Дата(СтрокаДата);
    // Теперь используем мощный инструмент платформы — функцию Формат
    // ДФ=ггггММддЧЧмм задает вывод без разделителей
    РезультатСтрокой = Формат(ОбъектДата, "ДФ=ггггММддЧЧмм");
Исключение
    Сообщить("Не удалось распознать дату. Проверьте формат!");
КонецПопытки;

В данном примере параметр ДФ (Формат даты) позволяет нам сконструировать любую последовательность. Преимущество здесь в том, что Формат() автоматически добавит лидирующие нули, если это необходимо, и корректно обработает временные составляющие.

Способ 3: Использование Библиотеки стандартных подсистем (БСП)

Если ваша конфигурация построена на базе современных типовых решений (например, 1С:ERP, УТ 11 или БП 3.0), в вашем распоряжении есть готовые инструменты БСП. Разберем использование общего модуля ОбщегоНазначенияКлиентСервер.

Функция СтрокаВДату из этого модуля гораздо «умнее» встроенного конструктора. Она умеет разбирать даты, написанные через разные разделители, и не вызывает критическую ошибку при неверном формате, а возвращает пустую дату.


СтрокаДата = "08.09.2019 11:53";
// Используем функцию БСП для безопасного преобразования
ОбъектДата = ОбщегоНазначенияКлиентСервер.СтрокаВДату(СтрокаДата);

Если ЗначениеЗаполнено(ОбъектДата) Тогда
    Результат = Формат(ОбъектДата, "ДФ=ггггММддЧЧмм");
КонецЕсли;

Использование БСП — это признак профессиональной разработки, так как такие функции учитывают множество нюансов, которые программист может упустить при написании собственного парсера.

Способ 4: Современный метод через СтрРазделить

В версиях платформы 8.3.10 и выше появилась удобная функция СтрРазделить(). Посмотрим на ситуацию, когда формат даты может быть нестабильным (разное количество пробелов или разные разделители). Мы можем разбить строку в массив и собрать её заново.


ИсходнаяСтрока = "08.09.2019 11:53";
// Заменяем все возможные разделители на один универсальный (пробел)
ЧистаяСтрока = СтрЗаменить(ИсходнаяСтрока, ".", " ");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, ":", " ");

МассивЧастей = СтрРазделить(ЧистаяСтрока, " ", Ложь);

// Теперь собираем строку в нужном порядке по индексам
// МассивЧастей[0] - День, [1] - Месяц, [2] - Год, [3] - Час, [4] - Минута
Если МассивЧастей.Количество() >= 5 Тогда
    Результат = МассивЧастей[2] + МассивЧастей[1] + МассивЧастей[0] + МассивЧастей[3] + МассивЧастей[4];
КонецЕсли;

Этот способ делает код более читаемым. Вместо магических цифр (позиций символов) мы оперируем логическими частями даты. Это значительно упрощает отладку и поддержку программного кода в будущем.

Важные замечания по работе с датами

При работе с преобразованиями строк в даты необходимо учитывать несколько критических факторов:

  1. Региональные настройки: Помните, что сервер 1С и клиентское приложение могут иметь разные локальные настройки. Если на сервере установлена англоязычная ОС, строка «08.09.2019» может быть воспринята как 9 августа, а не 8 сентября. Всегда стремитесь к использованию универсального формата ГГГГММДДЧЧММСС.
  2. Пустые значения: Всегда проверяйте входящую строку на пустоту перед началом преобразований. Передача пустой строки в функцию Дата() приведет к ошибке выполнения.
  3. Производительность в циклах: Если вам нужно преобразовать тысячи строк в запросе или в цикле, метод с Формат() может быть медленнее, чем прямая работа со строкой. Выбирайте инструмент исходя из объема данных.

Подводя итог, можно сказать, что для разовых задач идеально подходит связка Дата() + Формат(), а для сложных интеграций и массовой обработки данных лучше использовать методы прямой работы со строками или специализированные функции БСП.

← На главную