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

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При автоматизации работы с файлами в 1С, особенно при обработке изображений или документов, часто возникает необходимость не просто изменить содержимое файла, но и сохранить его исходные временные метки. Стандартные средства платформы 1С и популярные COM-объекты (такие как Scripting.FileSystemObject) предоставляют удобные инструменты для чтения дат и изменения времени последнего редактирования, однако задача установки даты создания файла часто ставит разработчиков в тупик.

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

Ограничения стандартных методов (FileSystemObject и встроенные функции 1С)

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


FSO = Новый COMОбъект("Scripting.FileSystemObject");
File = FSO.GetFile(ПутьКФайлу);    
ДатаСоздания = File.DateCreated; // Только чтение
ДатаПоследнегоИзменения = File.DateLastModified; // Только чтение через FSO

Важно понимать, что объект File в библиотеке Scripting.FileSystemObject позволяет только считывать эти свойства. Попытка записать в них новое значение приведет к ошибке выполнения. В самой платформе 1С существует метод УстановитьВремяИзменения(), который работает для объектов типа Файл. Разберем, как это выглядит на практике:


НовыйФайл = Новый Файл(ПолноеИмяФайла);
НовыйФайл.УстановитьВремяИзменения(НужнаяДата);

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

Способ 1: Использование PowerShell через 1С

Использование оболочки PowerShell — это самый современный и надежный способ изменения любых атрибутов файла в среде Windows без установки дополнительного программного обеспечения. PowerShell имеет прямой доступ к .NET Framework и API файловой системы, что позволяет менять CreationTime (время создания), LastWriteTime (время изменения) и LastAccessTime (время последнего доступа).

Рассмотрим по шагам, как реализовать этот вызов из кода 1С. Мы воспользуемся методом ЗапуститьПриложение(). Проанализируем структуру команды:


// Путь к файлу должен быть полным
ПутьКФайлу = "C:\MyFiles\photo.jpg";
// Форматируем дату в понятный для PowerShell вид (ГГГГ-ММ-ДД ЧЧ:ММ:СС)
СтрокаДаты = Формат(НужнаяДата, "ДФ='yyyy-MM-dd HH:mm:ss'");

// Формируем команду PowerShell
// Мы обращаемся к объекту через Get-Item и устанавливаем свойство CreationTime
ТекстКоманды = "powershell -Command ""(Get-Item '" + ПутьКФайлу + "').CreationTime = '" + СтрокаДаты + "'""";

// Запускаем выполнение в скрытом окне
ЗапуститьПриложение(ТекстКоманды, , Истина);

Преимущества этого метода:

  1. Не требует внешних библиотек или компонент.
  2. Позволяет менять дату создания, изменения и доступа одновременно.
  3. Легко масштабируется для пакетной обработки файлов.

Способ 2: Использование внешних утилит (NirCmd)

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

Выясним, как выглядит синтаксис команды для изменения всех трех дат файла:

nircmd.exe setfiletime "C:\photo.jpg" "20-05-2023 10:00:00" "20-05-2023 10:00:00"

В коде 1С это реализуется аналогично запуску PowerShell, но через вызов исполняемого файла утилиты. Это бывает полезно, когда нужно обработать тысячи файлов с высокой скоростью.

Способ 3: Нюансы обработки фотографий (EXIF данные)

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

Многие современные программы (галереи, облачные хранилища) игнорируют дату создания файла в Windows и смотрят на EXIF-метаданные (тег DateTimeOriginal). Если вы измените дату создания файла в Windows, но не измените EXIF, то при загрузке в телефон или Google Фото снимки все равно будут отображаться по старой дате.

Для работы с метаданными из 1С рекомендуется использовать профессиональный инструмент ExifTool. Пример команды для синхронизации всех внутренних дат с системными датами файла:


// Команда заставляет файл принять внутреннюю дату съемки равной дате создания файла
ТекстКоманды = "exiftool.exe ""-DateTimeOriginal>FileCreateDate"" " + ПолноеИмяФайла;
ЗапуститьПриложение(ТекстКоманды, , Истина);

Важные рекомендации при работе с датами

Разберем несколько тонкостей, которые помогут избежать ошибок при реализации:

  1. Права доступа: Убедитесь, что у пользователя, под которым запущен сеанс 1С, есть права на запись в целевую папку и изменение атрибутов. Если 1С работает в клиент-серверном варианте, код должен исполняться "НаСервере", и права должны быть у пользователя службы 1С.
  2. Формат даты: При передаче даты в PowerShell или внешние утилиты всегда используйте явное форматирование через Формат(), чтобы избежать ошибок, связанных с региональными настройками системы (различие между форматами ДД.ММ.ГГГГ и ММ.ДД.ГГГГ).
  3. Эффект туннелирования: В Windows существует механизм "File System Tunneling". Если вы удаляете файл и быстро (в течение 15 секунд) создаете новый с тем же именем, система может автоматически присвоить ему дату создания удаленного файла. Чтобы гарантированно установить свою дату, используйте методы, описанные выше, после того как файл был окончательно сохранен вашей программой обработки.

Подводя итог, можно сказать: несмотря на отсутствие прямого метода в языке 1С для установки даты создания, связка 1С и PowerShell является наиболее универсальным и "чистым" решением, которое закроет потребности большинства разработчиков.

← На главную