При разработке механизмов интеграции или простых обработок выгрузки данных часто возникает ситуация, когда дата в выходном файле формата CSV упорно отображается со временем (например, "31.12.2023 00:00:00"). Это происходит даже в тех случаях, когда в свойствах реквизитов конфигурации или на форме тип данных ограничен только датой. Разберем подробно, почему так происходит, и как добиться корректного результата.
Прежде всего, нам необходимо осознать важный технический нюанс: файл CSV (Comma-Separated Values) — это обычный текстовый файл. В нем не существует встроенных типов данных, таких как "Дата" или "Число". Все, что записывается в такой файл, является строкой символов.
Когда мы пытаемся передать объект типа Дата напрямую в процедуру записи текстового файла, платформа 1С автоматически преобразует этот объект в строку по умолчанию, используя системный формат "Дата + Время". Именно поэтому настройки формата в метаданных или на форме не влияют на результат выгрузки — они предназначены для отображения в интерфейсе 1С, а не для записи в текст.
Самый надежный и профессиональный способ — это явное преобразование даты в строку нужного вида перед записью. Проанализируем возможности основной функции 1С для этих целей. Функция Формат() всегда возвращает строковое значение, что идеально подходит для CSV.
Для выгрузки только даты мы можем использовать параметр ДЛФ (Дата Локального Формата) или ДФ (Маска даты). Рассмотрим оба варианта:
Формат(Объект.Дата, "ДЛФ=Д") выгрузит дату в соответствии с региональными настройками системы (например, "31.12.2023"). Однако это может быть рискованно, если выгрузка происходит на сервере с другими языковыми стандартами.Посмотрим на пример кода с использованием маски:
// Пример формирования строки даты для CSV
ТекДата = ТекущаяДата();
СтрокаДляФайла = Формат(ТекДата, "ДФ=dd.MM.yyyy"); // Получим "31.12.2023"
// Либо международный стандарт (ISO), если принимает другая система
СтрокаДляФайлаISO = Формат(ТекДата, "ДФ=yyyy-MM-dd"); // Получим "2023-12-31"
Если по каким-то причинам вы не хотите использовать функцию форматирования, можно применить простое отсечение лишних символов. По умолчанию строковое представление даты в 1С занимает 19 символов (ДД.ММ.ГГГГ ЧЧ:ММ:СС). Чтобы оставить только дату, достаточно взять первые 10 символов.
Проанализируем пример такого подхода:
// Преобразование через строковые функции
ДатаСоВременем = Строка(Объект.Дата); // "31.12.2023 00:00:00"
ДатаБезВремени = Лев(ДатаСоВременем, 10); // "31.12.2023"
Важно: Этот метод менее надежен, чем Формат(), так как он зависит от текущего представления даты в сеансе пользователя.
Часто программисты сталкиваются с тем, что даже после правильной выгрузки (если открыть файл в текстовом редакторе типа "Блокнот", там все верно), заказчик жалуется на наличие времени. Выясним причину: Microsoft Excel при открытии CSV-файла пытается "угадать" типы данных.
Если Excel видит дату, он автоматически применяет к ячейке свой внутренний формат "Дата", который может включать время по умолчанию. Чтобы этого избежать, можно применить небольшую хитрость — выгружать дату как формулу, чтобы Excel воспринимал ее строго как текст.
Рассмотрим пример "обмана" Excel:
// Вместо записи значения 31.12.2023
// Записываем строку: ="31.12.2023"
ЗначениеДляCSV = "="" " + Формат(ДатаВыгрузки, "ДФ=dd.MM.yyyy") + """";
В этом случае Excel отобразит данные именно так, как они записаны, не пытаясь применить к ним автоматическое форматирование.
Разберем комплексный пример того, как правильно организовать выгрузку данных из табличной части обработки в файл CSV, учитывая обработку пустых дат и кодировку.
Процедура ВыполнитьВыгрузку()
// Создаем объект для записи текстового файла
ФайлCSV = Новый ЗаписьТекста("C:\export\data.csv", КодировкаТекста.UTF8);
// Рекомендуется добавить явный разделитель для Excel первой строкой
ФайлCSV.ЗаписатьСтроку("sep=;");
// Обходим строки табличной части
Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
// Обработка даты: проверяем на заполненность
Если ЗначениеЗаполнено(СтрокаТЧ.ДатаДокумента) Тогда
ДатаСтрокой = Формат(СтрокаТЧ.ДатаДокумента, "ДФ=dd.MM.yyyy");
Иначе
ДатаСтрокой = ""; // Пустая дата в 1С (01.01.0001) не должна попадать в файл
КонецЕсли;
// Собираем строку данных (через точку с запятой)
СтрокаДанных = СтрокаТЧ.Номер + ";" + ДатаСтрокой + ";" + СтрокаТЧ.Контрагент;
ФайлCSV.ЗаписатьСтроку(СтрокаДанных);
КонецЦикла;
ФайлCSV.Закрыть();
Сообщить("Выгрузка завершена успешно!");
КонецПроцедуры
Для создания качественного файла выгрузки следует учитывать еще несколько важных моментов:
КодировкаТекста.UTF8. Если же файл предназначен для старых версий Excel или специализированного ПО, может потребоваться КодировкаТекста.ANSI (Windows-1251).ЗначениеЗаполнено(), иначе в файле появится некорректная дата, которую Excel может интерпретировать как 30.12.1899.;), так как запятая используется как десятичный разделитель в числах.Таким образом, для решения задачи выгрузки даты без времени в CSV необходимо отказаться от надежд на свойства реквизитов и использовать явное преобразование в строку через Формат(Дата, "ДФ=dd.MM.yyyy"). Это обеспечит стабильный результат, который будет корректно восприниматься как сторонними программами, так и пользователями при просмотре в Excel.