В платформе 1С:Предприятие 7.7 встроенная функция Формат() значительно ограничена по сравнению с современными версиями 8.3. Одной из частых задач программиста становится приведение даты к международному стандарту ISO 8601 (например, 2020-04-07), который широко используется при обмене данными через XML, JSON или при работе с веб-сервисами. Поскольку штатного флага форматирования для такой строки не существует, нам придется реализовать это самостоятельно.
В данной статье мы подробно разберем несколько способов решения этой задачи: от простых однострочников до универсальных функций и продвинутых методов с использованием системных объектов Windows.
Самый очевидный и простой путь — это извлечение составляющих частей даты (год, месяц, число) и их последующая склейка в одну строку с добавлением разделителей. Рассмотрим наиболее лаконичный вариант, предложенный в обсуждении. Основная хитрость здесь заключается в использовании функции Формат() с параметром Ч(0)2, что позволяет автоматически дополнить число или месяц ведущим нулем, если они меньше 10.
Проанализируем пример кода:
// Пример получения текущей даты в формате ГГГГ-ММ-ДД
ТекДата = ТекущаяДата();
СтрДата = Формат(ДатаГод(ТекДата),"Ч(0)4") + "-" +
Формат(ДатаМесяц(ТекДата),"Ч(0)2") + "-" +
Формат(ДатаЧисло(ТекДата),"Ч(0)2");
// Результат будет: 2023-10-25
В этом примере ДатаГод возвращает четыре цифры года, а формат Ч(0)2 гарантирует, что месяц "5" превратится в "05", а число "7" в "07". Это критически важно для соблюдения стандарта.
Если вам необходимо часто преобразовывать даты в разных частях конфигурации, лучше всего вынести этот код в отдельную функцию в Глобальном модуле. Это позволит избежать ошибок дублирования кода и упростит его поддержку.
Рассмотрим оптимизированную функцию, которая учитывает особенности работы с XML-документами:
Функция ПреобразоватьДатуВISO(_Дата) Экспорт
Если ПустаяЗначение(_Дата) = 1 Тогда
Возврат ""; // Обработка пустой даты
КонецЕсли;
Год = ДатаГод(_Дата);
Мес = Прав("00" + ДатаМесяц(_Дата), 2);
Дн = Прав("00" + ДатаЧисло(_Дата), 2);
Возврат Строка(Год) + "-" + Мес + "-" + Дн;
КонецФункции
Обратите внимание на использование функции Прав(). Конструкция Прав("00" + Значение, 2) — это классический прием в 1С 7.7. Мы добавляем два нуля к строке и берем два правых символа. Таким образом, для значения "12" мы получим "0012" -> "12", а для "5" получим "005" -> "05".
Существует еще один интересный метод, основанный на предварительном преобразовании даты в строку сплошного вида (ГГГГММДД) с последующей нарезкой. В 1С 7.7 функция Формат() с параметром "ДГГГГММДД" выдает дату без точек, что удобно для дальнейшей обработки.
Разберем, как это работает:
Функция ФорматироватьДатуПоМаске(ВыбДата, Разделитель = "-")
// Получаем строку вида "20231025"
Стр = Формат(ВыбДата, "ДГГГГММДД");
// Вырезаем части строки
Результат = Лев(Стр, 4) + Разделитель + Сред(Стр, 5, 2) + Разделитель + Прав(Стр, 2);
Возврат Результат;
КонецФункции
Важное замечание: При реализации этого метода в обсуждении на форуме была допущена типичная ошибка — попытка использовать Лев() и Сред() непосредственно к объекту типа "Дата" без предварительного преобразования в формат ДГГГГММДД. Помните, что строковое представление даты по умолчанию в 1С 7.7 — это "ДД.ММ.ГГ", и попытка вырезать из него год может привести к неожиданным результатам.
Если ваша задача связана с формированием XML-файлов, самым надежным способом будет делегировать форматирование специализированным системным библиотекам. Объект MSXML2.DOMDocument умеет самостоятельно приводить типы данных 1С к стандартам XML.
Выясним, как реализовать автоматическое форматирование:
// Создаем объект XML
xmlДок = СоздатьОбъект("MSXML2.DOMDocument");
Узел = xmlДок.createElement("date_field");
// Указываем тип данных узла как 'date'
Узел.dataType = "date";
// Присваиваем дату 1С напрямую
Узел.nodeTypedValue = ТекущаяДата();
// Теперь в nodeValue или xml будет лежать дата в формате 2023-10-25
Сообщить(Узел.text);
Этот метод хорош тем, что он избавляет программиста от ручного контроля за разделителями и нулями. Система сама сформирует строку согласно спецификации W3C.
Иногда требуется вывести не просто дату, а метку времени (dateTime). В стандарте ISO 8601 это выглядит как 2023-10-25T14:30:00. Разберем, как добавить время к нашей дате.
Функция ПолучитьDateTimeXML(Дат, Время)
СтрДата = ПреобразоватьДатуВISO(Дат); // Используем функцию из Способа 2
Возврат СтрДата + "T" + Время;
КонецФункции
Здесь важно помнить, что функция ТекущееВремя() в 1С 7.7 сразу возвращает строку с разделителями-двоеточиями (например, "14:30:05"), что полностью соответствует требованиям XML.
ДатаГод() или ДатаМесяц() вызовут ошибку времени выполнения.Проанализировав все предложенные варианты, можно сделать вывод: хотя в 1С 7.7 нет одной встроенной команды для форматирования даты в ISO, комбинация функций Формат, Лев, Сред и Прав позволяет решить задачу любой сложности.