В процессе разработки на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с необходимостью привести стандартную дату (которая обычно отображается в формате ДД.ММ.ГГ) к международному стандарту ISO 8601 (ГГГГ-ММ-ДД). Такая задача критически важна при выгрузке данных в форматы XML, JSON, при работе с прямыми SQL-запросами или интеграции с веб-сервисами. В отличие от версии 8.3, где формат задается одной строкой в функции Формат(), версия 7.7 требует более детального подхода.
В этой статье мы подробно разберем несколько проверенных способов реализации этой задачи, проанализируем их эффективность и научимся избегать типичных ошибок, связанных с пустыми датами.
Это самый понятный и надежный способ. Мы последовательно получаем год, месяц и число, преобразуем их в строки нужной длины и объединяем с помощью дефисов. Рассмотрим пример реализации в виде функции:
Функция ПреобразоватьДатуВISO(_Дата)
// Получаем год как число и преобразуем в строку
СтрГод = Строка(ДатаГод(_Дата));
// Для месяца и числа важно обеспечить лидирующий ноль, если значение меньше 10
// Используем хитрость с добавлением "00" и взятием правых двух символов
СтрМес = Прав("00" + ДатаМесяц(_Дата), 2);
СтрЧис = Прав("00" + ДатаЧисло(_Дата), 2);
Возврат(СтрГод + "-" + СтрМес + "-" + СтрЧис);
КонецФункции
Разберем, почему мы используем Прав("00" + ..., 2). Функция ДатаМесяц() возвращает число. Если месяц — январь (1), то простая конвертация в строку даст "1", а нам для формата ГГГГ-ММ-ДД нужно "01". Добавляя два нуля спереди и забирая два знака справа, мы гарантированно получаем корректный формат для любого месяца и числа.
В 1С 7.7 функция Формат() имеет специфические параметры для работы с числами, которые позволяют автоматически добавлять лидирующие нули. Это делает код более лаконичным. Проанализируем следующую конструкцию:
ТекстДаты = Формат(ДатаГод(ТекущаяДата()), "Ч(0)4") + "-" +
Формат(ДатаМесяц(ТекущаяДата()), "Ч(0)2") + "-" +
Формат(ДатаЧисло(ТекущаяДата()), "Ч(0)2");
В данном примере параметр "Ч(0)2" означает: преобразовать число в строку длиной 2 символа, заполняя пустоты нулями. Для года используется "Ч(0)4", что обеспечивает четырехзначный формат. Этот способ считается более "профессиональным" с точки зрения использования встроенных возможностей языка.
Существует еще более быстрый способ получения строки без дефисов, которую потом можно легко "разрезать". В 1С 7.7 формат "ДГГГГММДД" выдает дату в виде сплошной строки цифр (например, "20231025"). Мы можем использовать это для минимизации вызовов функций работы с датой.
Рассмотрим алгоритм:
Лев(), Сред() и Прав(), вставляем разделители.
Стр = Формат(ВыбДата, "ДГГГГММДД");
Результат = Лев(Стр, 4) + "-" + Сред(Стр, 5, 2) + "-" + Прав(Стр, 2);
Этот метод работает быстрее, так как обращение к объекту типа Дата происходит всего один раз, а дальнейшая работа идет с примитивным типом Строка.
Иногда программисты используют нестандартные подходы, например, замену точек на другие символы. Рассмотрим один из таких примеров, который часто встречается в старых конфигурациях:
// Получаем дату в формате ДД.ММ.ГГГГ
ТекСтр = Формат(ТекущаяДата(), "ДДДММГГГГ");
// Заменяем точки на разделитель строк, чтобы "разбить" дату
ТекСтр = СтрЗаменить(ТекСтр, ".", РазделительСтрок);
// Собираем в обратном порядке с дефисами
Результат = СтрПолучитьСтроку(ТекСтр, 3) + "-" +
СтрПолучитьСтроку(ТекСтр, 2) + "-" +
СтрПолучитьСтроку(ТекСтр, 1);
Этот метод демонстрирует гибкость языка 1С 7.7, хотя он менее очевиден для новичков, чем классический разбор по частям.
Если вам нужно вставить дату в середину длинного текста, удобно использовать функцию Шаблон(). Она позволяет вычислять выражения прямо внутри строки. Выясним, как это выглядит на практике:
ТекстСообщения = Шаблон("Дата выгрузки: [ДатаГод(РабочаяДата)]-[Прав(""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.