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

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

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

Различие между содержимым и метаданными

Первая и самая важная деталь, которую мы должны уяснить: в 1С существуют разные объекты для работы с файловой системой. Начинающие разработчики часто пытаются получить дату изменения через объекты, предназначенные для чтения содержимого, такие как ЧтениеТекста или ТекстовыйДокумент. Однако эти объекты «видят» только то, что находится внутри файла, а не информацию о самом файле в файловой системе.

Проанализируем типичную ошибку. Если мы напишем код следующим образом:


// ОШИБОЧНЫЙ ПУТЬ
ФайлТекст = Новый ЧтениеТекста("\\Srv-1\Exchange\data.txt");
Дата = ФайлТекст.ПолучитьВремяИзменения(); // Здесь возникнет ошибка

Метод ПолучитьВремяИзменения() не принадлежит объекту ЧтениеТекста. Для работы с атрибутами файла (размер, имя, расширение, дата изменения) нам необходим специализированный объект Файл.

Использование объекта Файл

Разберем правильный алгоритм действий. Для получения метаданных нам нужно создать экземпляр объекта Файл, передав в конструктор полный путь к нему. При этом сам файл не открывается для чтения, 1С просто обращается к операционной системе за информацией о записи в каталоге.

Рассмотрим рабочий пример кода:


ПутьКФайлу = "\\Srv-1\Exchange\report.txt";
ОбъектФайл = Новый Файл(ПутьКФайлу);

// Проверим, существует ли файл, прежде чем запрашивать дату
Если ОбъектФайл.Существует() Тогда
    ДатаИзменения = ОбъектФайл.ПолучитьВремяИзменения();
    Сообщить("Файл был изменен: " + ДатаИзменения);
Иначе
    Сообщить("Файл по указанному пути не найден!");
КонецЕсли;

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

Локальное и универсальное время

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

Проанализируем ситуацию: для систем синхронизации данных лучше использовать метод ПолучитьУниверсальноеВремяИзменения(). Он возвращает время в формате UTC (по Гринвичу). Это гарантирует, что при сравнении дат файлов на разных серверах у вас не будет «скачков» из-за разницы часовых поясов или перехода на летнее время.


// Пример использования универсального времени
УниверсальнаяДата = ОбъектФайл.ПолучитьУниверсальноеВремяИзменения();

Особенности работы на стороне сервера

Когда мы работаем с сетевыми путями (например, \\Server\Folder\file.txt), нужно учитывать контекст выполнения кода. Разберем по шагам:

  1. Выполнение на клиенте: 1С использует права текущего пользователя Windows. Если вы видите файл в проводнике, код его увидит.
  2. Выполнение на сервере: Если код запускается в фоновом задании или серверном модуле, доступ к файлу будет осуществляться от имени учетной записи, под которой запущена служба Агент сервера 1С:Предприятия (обычно это USR1CV8). Часто у этой учетной записи нет прав на сетевые папки, и метод Существует() вернет Ложь.

Совет: Всегда проверяйте права доступа серверного пользователя к ресурсу, если планируете автоматизировать проверку файлов.

Массовая проверка файлов

Если нам нужно получить даты изменения для большого количества файлов (например, в цикле по всей папке), создание объекта Новый Файл() для каждого элемента может работать медленно из-за большого количества обращений к системе. В такой ситуации рассмотрим более эффективный метод — НайтиФайлы().

Проанализируем пример массовой обработки:


МассивФайлов = НайтиФайлы("C:\Logs\", "*.log");
Для Каждого ТекущийФайл Из МассивФайлов Цикл
    // Объект 'ТекущийФайл' уже является объектом типа 'Файл'
    // Его свойства уже заполнены, дополнительно вызывать 'Новый Файл' не нужно
    Сообщить("Лог " + ТекущийФайл.Имя + " изменен: " + ТекущийФайл.ПолучитьВремяИзменения());
КонецЦикла;

Этот способ работает значительно быстрее, так как платформа получает информацию о группе файлов за один системный вызов.

Дополнительные возможности: Дата создания

Стоит отметить, что стандартный объект Файл в 1С не имеет метода для получения даты создания файла (только изменения). Если эта информация критически важна для вашей задачи, в среде Windows можно воспользоваться COM-объектами.

Посмотрим на пример использования FileSystemObject:


FSO = Новый COMОбъект("Scripting.FileSystemObject");
ФайлWindows = FSO.GetFile("C:\temp\data.txt");
ДатаСоздания = ФайлWindows.DateCreated;
Сообщить("Файл создан: " + ДатаСоздания);

Однако помните, что этот метод будет работать только на Windows-серверах. Если ваш сервер 1С работает под Linux, используйте только стандартные методы платформы 1С или системные команды оболочки через ЗапуститьПриложение.

Подведем итог: для получения времени изменения достаточно использовать связку Новый Файл(Путь) и метод ПолучитьВремяИзменения(). Это простой, быстрый и кроссплатформенный способ, встроенный в ядро 1С.

← На главную