Как преобразовать дату в формат YYYY-MM-DD в 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В платформе 1С:Предприятие 7.7 встроенная функция Формат() значительно ограничена по сравнению с современными версиями 8.3. Одной из частых задач программиста становится приведение даты к международному стандарту ISO 8601 (например, 2020-04-07), который широко используется при обмене данными через XML, JSON или при работе с веб-сервисами. Поскольку штатного флага форматирования для такой строки не существует, нам придется реализовать это самостоятельно.

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

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

Самый очевидный и простой путь — это извлечение составляющих частей даты (год, месяц, число) и их последующая склейка в одну строку с добавлением разделителей. Рассмотрим наиболее лаконичный вариант, предложенный в обсуждении. Основная хитрость здесь заключается в использовании функции Формат() с параметром Ч(0)2, что позволяет автоматически дополнить число или месяц ведущим нулем, если они меньше 10.

Проанализируем пример кода:


// Пример получения текущей даты в формате ГГГГ-ММ-ДД
ТекДата = ТекущаяДата();
СтрДата = Формат(ДатаГод(ТекДата),"Ч(0)4") + "-" + 
          Формат(ДатаМесяц(ТекДата),"Ч(0)2") + "-" + 
          Формат(ДатаЧисло(ТекДата),"Ч(0)2");
// Результат будет: 2023-10-25

В этом примере ДатаГод возвращает четыре цифры года, а формат Ч(0)2 гарантирует, что месяц "5" превратится в "05", а число "7" в "07". Это критически важно для соблюдения стандарта.

Способ 2: Создание универсальной функции для XML

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

Рассмотрим оптимизированную функцию, которая учитывает особенности работы с XML-документами:


Функция ПреобразоватьДатуВISO(_Дата) Экспорт
    Если ПустаяЗначение(_Дата) = 1 Тогда
        Возврат ""; // Обработка пустой даты
    КонецЕсли;
    
    Год  = ДатаГод(_Дата);
    Мес  = Прав("00" + ДатаМесяц(_Дата), 2);
    Дн   = Прав("00" + ДатаЧисло(_Дата), 2);
    
    Возврат Строка(Год) + "-" + Мес + "-" + Дн;
КонецФункции

Обратите внимание на использование функции Прав(). Конструкция Прав("00" + Значение, 2) — это классический прием в 1С 7.7. Мы добавляем два нуля к строке и берем два правых символа. Таким образом, для значения "12" мы получим "0012" -> "12", а для "5" получим "005" -> "05".

Способ 3: Использование промежуточного строкового представления

Существует еще один интересный метод, основанный на предварительном преобразовании даты в строку сплошного вида (ГГГГММДД) с последующей нарезкой. В 1С 7.7 функция Формат() с параметром "ДГГГГММДД" выдает дату без точек, что удобно для дальнейшей обработки.

Разберем, как это работает:


Функция ФорматироватьДатуПоМаске(ВыбДата, Разделитель = "-")
    // Получаем строку вида "20231025"
    Стр = Формат(ВыбДата, "ДГГГГММДД"); 
    
    // Вырезаем части строки
    Результат = Лев(Стр, 4) + Разделитель + Сред(Стр, 5, 2) + Разделитель + Прав(Стр, 2);
    Возврат Результат;
КонецФункции

Важное замечание: При реализации этого метода в обсуждении на форуме была допущена типичная ошибка — попытка использовать Лев() и Сред() непосредственно к объекту типа "Дата" без предварительного преобразования в формат ДГГГГММДД. Помните, что строковое представление даты по умолчанию в 1С 7.7 — это "ДД.ММ.ГГ", и попытка вырезать из него год может привести к неожиданным результатам.

Способ 4: Профессиональный подход через MSXML (COM-объекты)

Если ваша задача связана с формированием 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.

Способ 5: Работа с временем в формате XML

Иногда требуется вывести не просто дату, а метку времени (dateTime). В стандарте ISO 8601 это выглядит как 2023-10-25T14:30:00. Разберем, как добавить время к нашей дате.


Функция ПолучитьDateTimeXML(Дат, Время)
    СтрДата = ПреобразоватьДатуВISO(Дат); // Используем функцию из Способа 2
    Возврат СтрДата + "T" + Время;
КонецФункции

Здесь важно помнить, что функция ТекущееВремя() в 1С 7.7 сразу возвращает строку с разделителями-двоеточиями (например, "14:30:05"), что полностью соответствует требованиям XML.

Типичные ошибки и советы

  1. Пустые даты: Всегда проверяйте входящую дату на пустоту. В 1С 7.7 пустая дата отображается как "00.00.00". Если ее просто преобразовать в ISO, вы можете получить некорректную строку "0-00-00", которую не примет ни одна внешняя система.
  2. Производительность: Если вам нужно преобразовать тысячи дат (например, при выгрузке большого справочника), используйте самый простой способ из первого раздела. Создание COM-объекта на каждой итерации цикла существенно замедлит работу.
  3. Проверка типа: Убедитесь, что переменная, которую вы передаете в функцию, действительно имеет тип "Дата". Если туда попадет строка, функции ДатаГод() или ДатаМесяц() вызовут ошибку времени выполнения.

Проанализировав все предложенные варианты, можно сделать вывод: хотя в 1С 7.7 нет одной встроенной команды для форматирования даты в ISO, комбинация функций Формат, Лев, Сред и Прав позволяет решить задачу любой сложности.

← На главную