Как в 1С 7.7 преобразовать дату в формат ГГГГ-ММ-ДД

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

В процессе разработки на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с необходимостью привести стандартную дату (которая обычно отображается в формате ДД.ММ.ГГ) к международному стандарту ISO 8601 (ГГГГ-ММ-ДД). Такая задача критически важна при выгрузке данных в форматы XML, JSON, при работе с прямыми SQL-запросами или интеграции с веб-сервисами. В отличие от версии 8.3, где формат задается одной строкой в функции Формат(), версия 7.7 требует более детального подхода.

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

Метод 1: Классический разбор даты на составляющие

Это самый понятный и надежный способ. Мы последовательно получаем год, месяц и число, преобразуем их в строки нужной длины и объединяем с помощью дефисов. Рассмотрим пример реализации в виде функции:


Функция ПреобразоватьДатуВISO(_Дата)
    // Получаем год как число и преобразуем в строку
    СтрГод = Строка(ДатаГод(_Дата));
    
    // Для месяца и числа важно обеспечить лидирующий ноль, если значение меньше 10
    // Используем хитрость с добавлением "00" и взятием правых двух символов
    СтрМес = Прав("00" + ДатаМесяц(_Дата), 2);
    СтрЧис = Прав("00" + ДатаЧисло(_Дата), 2);
    
    Возврат(СтрГод + "-" + СтрМес + "-" + СтрЧис);
КонецФункции

Разберем, почему мы используем Прав("00" + ..., 2). Функция ДатаМесяц() возвращает число. Если месяц — январь (1), то простая конвертация в строку даст "1", а нам для формата ГГГГ-ММ-ДД нужно "01". Добавляя два нуля спереди и забирая два знака справа, мы гарантированно получаем корректный формат для любого месяца и числа.

Метод 2: Использование функции Формат() для числовых значений

В 1С 7.7 функция Формат() имеет специфические параметры для работы с числами, которые позволяют автоматически добавлять лидирующие нули. Это делает код более лаконичным. Проанализируем следующую конструкцию:


ТекстДаты = Формат(ДатаГод(ТекущаяДата()), "Ч(0)4") + "-" + 
            Формат(ДатаМесяц(ТекущаяДата()), "Ч(0)2") + "-" + 
            Формат(ДатаЧисло(ТекущаяДата()), "Ч(0)2");

В данном примере параметр "Ч(0)2" означает: преобразовать число в строку длиной 2 символа, заполняя пустоты нулями. Для года используется "Ч(0)4", что обеспечивает четырехзначный формат. Этот способ считается более "профессиональным" с точки зрения использования встроенных возможностей языка.

Метод 3: Оптимизированный строковый метод (через ДГГГГММДД)

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

Рассмотрим алгоритм:

  1. Преобразуем дату в строку формата "ГГГГММДД".
  2. Используя функции Лев(), Сред() и Прав(), вставляем разделители.

Стр = Формат(ВыбДата, "ДГГГГММДД");
Результат = Лев(Стр, 4) + "-" + Сред(Стр, 5, 2) + "-" + Прав(Стр, 2);

Этот метод работает быстрее, так как обращение к объекту типа Дата происходит всего один раз, а дальнейшая работа идет с примитивным типом Строка.

Метод 4: Манипуляции со стандартным форматом через подмену разделителей

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


// Получаем дату в формате ДД.ММ.ГГГГ
ТекСтр = Формат(ТекущаяДата(), "ДДДММГГГГ");
// Заменяем точки на разделитель строк, чтобы "разбить" дату
ТекСтр = СтрЗаменить(ТекСтр, ".", РазделительСтрок);
// Собираем в обратном порядке с дефисами
Результат = СтрПолучитьСтроку(ТекСтр, 3) + "-" + 
            СтрПолучитьСтроку(ТекСтр, 2) + "-" + 
            СтрПолучитьСтроку(ТекСтр, 1);

Этот метод демонстрирует гибкость языка 1С 7.7, хотя он менее очевиден для новичков, чем классический разбор по частям.

Метод 5: Использование функции Шаблон()

Если вам нужно вставить дату в середину длинного текста, удобно использовать функцию Шаблон(). Она позволяет вычислять выражения прямо внутри строки. Выясним, как это выглядит на практике:


ТекстСообщения = Шаблон("Дата выгрузки: [ДатаГод(РабочаяДата)]-[Прав(""0""+ДатаМесяц(РабочаяДата),2)]-[Прав(""0""+ДатаЧисло(РабочаяДата),2)]");

Здесь всё преобразование записывается в одну строку, что удобно для формирования логов или текстов сообщений пользователю.

Важный нюанс: Обработка пустых дат

Проанализируем ситуацию, когда переменная даты не заполнена (00.00.00). Большинство вышеперечисленных методов вернут странный результат, например, "0-00-00". При работе с XML или SQL это может привести к ошибке. Поэтому всегда рекомендуется добавлять проверку:


Если ПустаяДата(ВыбДата) = 1 Тогда
    Результат = "1900-01-01"; // Или пустая строка, в зависимости от задачи
Иначе
    // Используем любой из методов выше
    Результат = Формат(ВыбДата, "ДГГГГММДД");
    Результат = Лев(Результат, 4) + "-" + Сред(Результат, 5, 2) + "-" + Прав(Результат, 2);
КонецЕсли;

В системах управления базами данных (SQL Server) минимальная дата часто ограничена 1753-м годом, поэтому если вы готовите строку для SQL-запроса, учитывайте этот факт при обработке пустых значений 1С.

Заключение

Мы рассмотрели основные способы преобразования даты в формат ГГГГ-ММ-ДД в среде 1С 7.7. Для большинства задач оптимальным будет Метод 3 (через "ДГГГГММДД") из-за его высокой производительности и лаконичности кода. Если же важна максимальная читаемость для других разработчиков, лучше придерживаться Метода 1.

← На главную