В процессе разработки на платформе 1С:Предприятие часто возникает необходимость анализа атрибутов файлов. Это может быть проверка актуальности выгруженных данных, контроль времени создания отчетов или автоматизация обработки внешних документов. В этой статье мы подробно разберем, какими инструментами располагает программист 1С для решения этой задачи, учитывая современные требования к кроссплатформенности и эффективности кода.
Самый простой и рекомендуемый способ получения даты изменения файла — использование встроенного объекта Файл. Этот метод является кроссплатформенным, что означает его корректную работу как на операционных системах семейства Windows, так и на Linux. Это особенно важно для современных серверных решений 1С.
Рассмотрим пример кода, который позволяет получить время последнего изменения документа:
ПутьКФайлу = "C:\Temp\Report.xlsx";
ВыбранныйФайл = Новый Файл(ПутьКФайлу);
Если ВыбранныйФайл.Существует() Тогда
ДатаИзменения = ВыбранныйФайл.ПолучитьВремяИзменения();
Сообщить("Файл был изменен: " + ДатаИзменения);
Иначе
Сообщить("Файл не найден по указанному пути.");
КонецЕсли;
Разберем по шагам этот алгоритм. Сначала мы инициализируем объект Файл, передавая в конструктор полный путь. Важно помнить, что само создание объекта не вызывает ошибку, если файла нет на диске, поэтому мы обязательно используем метод Существует(). Метод ПолучитьВремяИзменения() возвращает стандартное значение типа Дата, которое содержит и число, и время.
Часто задача стоит шире: нужно проверить даты всех файлов в определенной директории. Для этого оптимально использовать функцию НайтиФайлы(). Проанализируем ситуацию, когда нам нужно найти самый свежий файл в папке:
МассивФайлов = НайтиФайлы("C:\Exchange\", "*.xml");
СамаяСвежаяДата = Дата(1, 1, 1);
Для Каждого ТекущийФайл Из МассивФайлов Цикл
ДатаФайла = ТекущийФайл.ПолучитьВремяИзменения();
Если ДатаФайла > СамаяСвежаяДата Тогда
СамаяСвежаяДата = ДатаФайла;
КонецЕсли;
КонецЦикла;
Сообщить("Дата последнего обновления данных: " + СамаяСвежаяДата);
Этот метод удобен тем, что НайтиФайлы() сразу возвращает массив объектов типа Файл, и нам не нужно инициализировать каждый объект отдельно. Мы просто перебираем коллекцию и обращаемся к свойствам напрямую.
Встроенный объект Файл в 1С предоставляет доступ к дате изменения, но иногда бизнес-логика требует именно дату создания файла. В стандартных методах платформы 1С (до последних версий) прямой функции для получения даты создания нет. В этом случае, если система работает под Windows, мы можем прибегнуть к помощи ActiveX и объекта Scripting.FileSystemObject.
Рассмотрим, как реализовать этот метод:
ПутьКФайлу = "C:\Data\Log.txt";
Попытка
FSO = Новый COMОбъект("Scripting.FileSystemObject");
ФайлОбъект = FSO.GetFile(ПутьКФайлу);
ДатаСоздания = ФайлОбъект.DateCreated;
ДатаДоступа = ФайлОбъект.DateLastAccessed;
ДатаИзменения = ФайлОбъект.DateLastModified;
Сообщить("Создан: " + ДатаСоздания);
Сообщить("Изменен: " + ДатаИзменения);
Исключение
Сообщить("Ошибка при обращении к COM-объекту: " + ОписаниеОшибки());
КонецПопытки;
Важно: Данный код будет работать только на клиенте или сервере под управлением Windows. Если ваша база данных работает на Linux, использование COMОбъект вызовет критическую ошибку. Также учитывайте права доступа пользователя, под которым запущен процесс 1С.
В распределенных системах, где серверы могут находиться в разных часовых поясах, использование локального времени может привести к ошибкам синхронизации. В современных версиях платформы 8.3 рекомендуется использовать методы для работы с универсальным временем. Выясним, как получить время по Гринвичу:
Используйте метод ПолучитьУниверсальноеВремяИзменения(ИмяФайла). Это позволит вам сравнивать время файлов, созданных в разных регионах, без привязки к смещению часового пояса конкретного сервера.
ИмяФайла = "C:\Import\data.csv";
ВремяUTC = ПолучитьУниверсальноеВремяИзменения(ИмяФайла);
ЛокальноеВремя = УниверсальноеВремяВЛокальное(ВремяUTC);
Такой подход делает ваш код более профессиональным и устойчивым к изменениям системных настроек времени.
Если вы разрабатываете в современной конфигурации (например, УТ 11, ERP 2 или БП 3.0), настоятельно рекомендуем использовать возможности БСП. Проанализируем преимущества модуля ФайловаяСистема. Использование готовых функций из этого модуля позволяет избежать написания лишнего кода и обеспечивает дополнительную проверку безопасности.
Хотя БСП чаще всего использует те же встроенные методы, вызов функции ФайловаяСистема.ДанныеФайла(ПолноеИмяФайла) возвращает структуру со всеми необходимыми параметрами, включая размер и атрибуты, что сокращает количество обращений к дисковой подсистеме.
Разберем важный момент, связанный с особенностями работы Windows. Часто программисты путают дату создания и дату изменения. В Windows существует специфическое поведение: если вы копируете файл из одной папки в другую, дата создания файла становится текущей (момент копирования), а дата изменения сохраняется старой (когда реально редактировалось содержимое). Поэтому для проверки "возраста" именно данных, содержащихся в файле, всегда надежнее опираться на метод ПолучитьВремяИзменения().
В некоторых случаях требуется получить очень специфические данные, например, миллисекунды или расширенные атрибуты метаданных (для фотографий или видео). Для таких задач можно запустить PowerShell из кода 1С:
Команда = "powershell -command ""(Get-Item 'C:\Temp\file.txt').CreationTime.ToString('yyyy-MM-dd HH:mm:ss')""";
ЗапуститьПриложение(Команда, , Истина, КодВозврата);
Этот метод сложнее в реализации, так как требует обработки вывода команды через текстовый файл или временную таблицу, но он дает максимальную гибкость в управлении атрибутами файловой системы.
Подводя итог, можно сказать: для большинства задач в 1С достаточно стандартного объекта Файл и его метода ПолучитьВремяИзменения(). Если же вам критически важна дата создания, используйте FileSystemObject для Windows-систем, предварительно убедившись, что ваш код не будет выполняться в среде Linux.