При автоматизации работы с файлами в 1С, особенно при обработке изображений или документов, часто возникает необходимость не просто изменить содержимое файла, но и сохранить его исходные временные метки. Стандартные средства платформы 1С и популярные COM-объекты (такие как Scripting.FileSystemObject) предоставляют удобные инструменты для чтения дат и изменения времени последнего редактирования, однако задача установки даты создания файла часто ставит разработчиков в тупик.
В этой статье мы подробно разберем, почему стандартные методы не всегда работают, и рассмотрим несколько эффективных способов решения задачи: от встроенных функций 1С до использования мощных инструментов операционной системы Windows.
Рассмотрим типовую ситуацию. Для получения данных о файле программисты часто используют объект FileSystemObject. Проанализируем пример кода:
FSO = Новый COMОбъект("Scripting.FileSystemObject");
File = FSO.GetFile(ПутьКФайлу);
ДатаСоздания = File.DateCreated; // Только чтение
ДатаПоследнегоИзменения = File.DateLastModified; // Только чтение через FSO
Важно понимать, что объект File в библиотеке Scripting.FileSystemObject позволяет только считывать эти свойства. Попытка записать в них новое значение приведет к ошибке выполнения. В самой платформе 1С существует метод УстановитьВремяИзменения(), который работает для объектов типа Файл. Разберем, как это выглядит на практике:
НовыйФайл = Новый Файл(ПолноеИмяФайла);
НовыйФайл.УстановитьВремяИзменения(НужнаяДата);
Этот метод отлично справляется с изменением даты модификации, но, к сожалению, в 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 = '" + СтрокаДаты + "'""";
// Запускаем выполнение в скрытом окне
ЗапуститьПриложение(ТекстКоманды, , Истина);
Преимущества этого метода:
Если по каким-то причинам выполнение скриптов PowerShell ограничено политиками безопасности, можно воспользоваться легкими консольными утилитами. Одной из самых популярных является NirCmd. Она позволяет менять атрибуты файлов одной короткой командой.
Выясним, как выглядит синтаксис команды для изменения всех трех дат файла:
nircmd.exe setfiletime "C:\photo.jpg" "20-05-2023 10:00:00" "20-05-2023 10:00:00"
В коде 1С это реализуется аналогично запуску PowerShell, но через вызов исполняемого файла утилиты. Это бывает полезно, когда нужно обработать тысячи файлов с высокой скоростью.
Поскольку исходный вопрос касался обработки фотографий, важно рассмотреть критически важный аспект: разницу между датой файла в операционной системе и датой съемки внутри самого изображения. Проанализируем ситуацию подробнее.
Многие современные программы (галереи, облачные хранилища) игнорируют дату создания файла в Windows и смотрят на EXIF-метаданные (тег DateTimeOriginal). Если вы измените дату создания файла в Windows, но не измените EXIF, то при загрузке в телефон или Google Фото снимки все равно будут отображаться по старой дате.
Для работы с метаданными из 1С рекомендуется использовать профессиональный инструмент ExifTool. Пример команды для синхронизации всех внутренних дат с системными датами файла:
// Команда заставляет файл принять внутреннюю дату съемки равной дате создания файла
ТекстКоманды = "exiftool.exe ""-DateTimeOriginal>FileCreateDate"" " + ПолноеИмяФайла;
ЗапуститьПриложение(ТекстКоманды, , Истина);
Разберем несколько тонкостей, которые помогут избежать ошибок при реализации:
Формат(), чтобы избежать ошибок, связанных с региональными настройками системы (различие между форматами ДД.ММ.ГГГГ и ММ.ДД.ГГГГ).Подводя итог, можно сказать: несмотря на отсутствие прямого метода в языке 1С для установки даты создания, связка 1С и PowerShell является наиболее универсальным и "чистым" решением, которое закроет потребности большинства разработчиков.