В процессе разработки в среде 1С:Предприятие часто возникает задача трансформации данных. Одной из классических задач является преобразование даты из строкового представления в другой строковый формат или в объектный тип Дата. Рассмотрим ситуацию, когда у нас есть строка вида «08.09.2019 11:53», а нам необходимо получить компактную строку «201909081153» для выгрузки в файл, обмена данными или формирования уникального идентификатора.
Разберем по шагам несколько эффективных способов решения этой задачи, начиная от простых строковых манипуляций и заканчивая профессиональными методами с использованием встроенных механизмов платформы.
Если мы точно уверены в неизменности формата входящей строки, проанализируем самый простой метод — «нарезку» строки. Как было отмечено в обсуждении, позиции символов в стандартной дате фиксированы. Мы можем последовательно извлечь год, месяц, день, часы и минуты.
Рассмотрим пример реализации:
ИсходнаяСтрока = "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);
Этот метод максимально производителен, так как не требует создания объектов типа Дата, однако он крайне чувствителен к формату. Если во входящей строке внезапно изменятся разделители (например, вместо точек появятся тире), код вернет неверный результат.
Более правильным и гибким подходом в 1С считается предварительное преобразование строки в объектный тип Дата. Это позволяет системе «понимать» значение как календарную единицу. Выясним, как это сделать правильно.
Сначала преобразуем строку. Важно помнить, что функция Дата() требовательна к формату. Если передать ей строку «08.09.2019 11:53», она сработает только при определенных региональных настройках системы. Для получения гарантированного результата лучше всего использовать функцию Формат() для вывода.
Проанализируем следующий код:
СтрокаДата = "08.09.2019 11:53";
Попытка
ОбъектДата = Дата(СтрокаДата);
// Теперь используем мощный инструмент платформы — функцию Формат
// ДФ=ггггММддЧЧмм задает вывод без разделителей
РезультатСтрокой = Формат(ОбъектДата, "ДФ=ггггММддЧЧмм");
Исключение
Сообщить("Не удалось распознать дату. Проверьте формат!");
КонецПопытки;
В данном примере параметр ДФ (Формат даты) позволяет нам сконструировать любую последовательность. Преимущество здесь в том, что Формат() автоматически добавит лидирующие нули, если это необходимо, и корректно обработает временные составляющие.
Если ваша конфигурация построена на базе современных типовых решений (например, 1С:ERP, УТ 11 или БП 3.0), в вашем распоряжении есть готовые инструменты БСП. Разберем использование общего модуля ОбщегоНазначенияКлиентСервер.
Функция СтрокаВДату из этого модуля гораздо «умнее» встроенного конструктора. Она умеет разбирать даты, написанные через разные разделители, и не вызывает критическую ошибку при неверном формате, а возвращает пустую дату.
СтрокаДата = "08.09.2019 11:53";
// Используем функцию БСП для безопасного преобразования
ОбъектДата = ОбщегоНазначенияКлиентСервер.СтрокаВДату(СтрокаДата);
Если ЗначениеЗаполнено(ОбъектДата) Тогда
Результат = Формат(ОбъектДата, "ДФ=ггггММддЧЧмм");
КонецЕсли;
Использование БСП — это признак профессиональной разработки, так как такие функции учитывают множество нюансов, которые программист может упустить при написании собственного парсера.
В версиях платформы 8.3.10 и выше появилась удобная функция СтрРазделить(). Посмотрим на ситуацию, когда формат даты может быть нестабильным (разное количество пробелов или разные разделители). Мы можем разбить строку в массив и собрать её заново.
ИсходнаяСтрока = "08.09.2019 11:53";
// Заменяем все возможные разделители на один универсальный (пробел)
ЧистаяСтрока = СтрЗаменить(ИсходнаяСтрока, ".", " ");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, ":", " ");
МассивЧастей = СтрРазделить(ЧистаяСтрока, " ", Ложь);
// Теперь собираем строку в нужном порядке по индексам
// МассивЧастей[0] - День, [1] - Месяц, [2] - Год, [3] - Час, [4] - Минута
Если МассивЧастей.Количество() >= 5 Тогда
Результат = МассивЧастей[2] + МассивЧастей[1] + МассивЧастей[0] + МассивЧастей[3] + МассивЧастей[4];
КонецЕсли;
Этот способ делает код более читаемым. Вместо магических цифр (позиций символов) мы оперируем логическими частями даты. Это значительно упрощает отладку и поддержку программного кода в будущем.
При работе с преобразованиями строк в даты необходимо учитывать несколько критических факторов:
ГГГГММДДЧЧММСС.Дата() приведет к ошибке выполнения.Формат() может быть медленнее, чем прямая работа со строкой. Выбирайте инструмент исходя из объема данных.Подводя итог, можно сказать, что для разовых задач идеально подходит связка Дата() + Формат(), а для сложных интеграций и массовой обработки данных лучше использовать методы прямой работы со строками или специализированные функции БСП.