Как программно сформировать имя файла с текущей датой в 1С 8.3

Программист 1С v8.3 (Управляемые формы)
← На главную

В процессе разработки в среде 1С:Предприятие 8.3 часто возникает задача автоматического сохранения печатных форм, отчетов или выгрузок в файлы. Одной из ключевых деталей такой задачи является формирование понятного и уникального имени файла, которое обычно включает в себя текущую дату. В этой статье мы подробно разберем, как правильно преобразовать дату в строку для использования в пути к файлу, рассмотрим стандартные и альтернативные методы, а также коснемся нюансов работы в клиент-серверном режиме.

Использование основной функции Формат()

Самый простой и эффективный способ получить дату в нужном виде — использовать встроенную функцию Формат(). Рассмотрим стандартную ситуацию: нам нужно сохранить таблицу в формате xlsx с именем вида "2024-10-21-sm.xlsx".

Многие начинающие разработчики пытаются собрать строку «вручную», складывая части даты, как показано в этом примере:


ПутьДоФайлаXLSX = "C:\ggg\" + Формат(Дата, "ДФ=гггг") + "-" + Формат(Дата, "ДФ=ММ") + "-" + Формат(Дата, "ДФ=дд") + "-sm.xlsx";

Проанализируем этот код: он рабочий, но избыточный. Функция Формат() вызывается трижды, что усложняет чтение программы. Вместо этого мы рекомендуем использовать единую маску формата. Разберем более изящное решение:


ТекущаяДатаЗначение = ТекущаяДата(); // или значение из реквизита
СтрокаДаты = Формат(ТекущаяДатаЗначение, "ДФ=yyyy-MM-dd");
ПутьДоФайлаXLSX = "C:\ggg\" + СтрокаДаты + "-sm.xlsx";
ТабДок.Записать(ПутьДоФайлаXLSX, ТипФайлаТабличногоДокумента.XLSX);

В данном случае параметр ДФ=yyyy-MM-dd (или гггг-ММ-дд) сразу преобразует дату в нужный формат с разделителями-дефисами. Обратите внимание, что регистр букв в маске имеет значение: MM — это месяц, а mm — минуты.

Современный подход с использованием функции СтрШаблон

Начиная с версии платформы 8.3.6, разработчикам доступна функция СтрШаблон(). Она делает код формирования путей гораздо более читаемым, избавляя его от нагромождения операторов сложения строк ("плюсиков"). Давайте посмотрим, как это выглядит на практике:


ИмяФайла = СтрШаблон("%1-sm.xlsx", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));
ПолныйПуть = "C:\ggg\" + ИмяФайла;

Такой подход позволяет наглядно видеть структуру будущего имени файла. Символ %1 заменяется на результат функции форматирования. Если в имени файла должно быть несколько параметров (например, имя сотрудника и дата), СтрШаблон становится незаменимым инструментом.

Обработка времени и лидирующих нулей

Иногда задача усложняется: нужно добавить в имя файла не только дату, но и точное время (часы, минуты, секунды). Рассмотрим ситуацию, когда программисты пытаются вручную добавлять "0" к числам меньше 10:


// Не самый удачный пример
ДеньДаты = ?(СтрДлина(День(ТекущаяДата()))=1, "0"+День(ТекущаяДата()),День(ТекущаяДата()));

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

МинутыСтрокой = Прав("0" + Минута(ТекущаяДата()), 2);

Однако для формирования имени файла с датой и временем лучше всего применить комплексную маску в Формат():


// Формат: ГГГГММДД_ЧЧММСС
ИмяСДатойВременем = Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss");

Нюансы: ТекущаяДата() против ТекущаяДатаСеанса()

При работе в клиент-серверном варианте важно понимать разницу между этими функциями. Рассмотрим ситуацию: сервер находится в Москве, а пользователь — во Владивостоке.

  1. ТекущаяДата() — вернет время сервера (московское).
  2. ТекущаяДатаСеанса() — вернет время с учетом часового пояса, установленного для конкретного пользователя.

Практический совет: для имен файлов, которые формируются по инициативе пользователя (например, отчеты), всегда используйте ТекущаяДатаСеанса(). Это позволит избежать путаницы, когда пользователь сохраняет файл в 10 утра, а в имени файла видит 3 часа ночи.

Использование XMLСтрока для стандартизации

Существует еще один быстрый способ получить дату в международном формате (ISO) без использования масок. Это функция XMLСтрока(). Она часто применяется для технических целей, но может быть полезна и здесь:

ДатаISO = Лев(XMLСтрока(ТекущаяДата()), 10); // Получим "2024-10-21"

Этот метод хорош тем, что он всегда возвращает дату в формате YYYY-MM-DD вне зависимости от локальных настроек операционной системы или сеанса 1С.

Безопасность и запрещенные символы

Проанализируем важный аспект: безопасность имен файлов. В операционной системе Windows запрещено использование символов \ / : * ? " < > | в названиях файлов. Если вы формируете имя файла на основе данных из базы (например, «ИмяКонтрагента_Дата»), в строку могут попасть кавычки или двоеточия.

Если в вашей конфигурации используется БСП (Библиотека стандартных подсистем), мы рекомендуем использовать готовые методы для очистки строк:


// Пример использования БСП для формирования пути
ИмяФайла = "Отчет_По_Контрагенту_" + Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd");
БезопасноеИмя = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла, "_");
ПолныйПуть = ФайловаяСистемаКлиентСервер.КомбинироватьПути("C:\Exports", БезопасноеИмя + ".xlsx");

Метод КомбинироватьПути (или ОбъединитьПути) автоматически расставит правильные разделители (слеши), что избавит вас от ошибок "двойных слешей" или их отсутствия при склейке строк вручную.

Итоги

Разберем основные выводы нашего исследования:

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

← На главную