В процессе разработки на платформе 1С:Предприятие часто возникает задача контроля актуальности данных во внешних файлах. Это может быть проверка лог-файлов, файлов обмена данными или конфигурационных файлов. Самый надежный способ определить, обновлялся ли файл — это узнать время его последнего изменения. Рассмотрим подробно, как это сделать правильно, избежав типичных ошибок новичков.
Первая и самая важная деталь, которую мы должны уяснить: в 1С существуют разные объекты для работы с файловой системой. Начинающие разработчики часто пытаются получить дату изменения через объекты, предназначенные для чтения содержимого, такие как ЧтениеТекста или ТекстовыйДокумент. Однако эти объекты «видят» только то, что находится внутри файла, а не информацию о самом файле в файловой системе.
Проанализируем типичную ошибку. Если мы напишем код следующим образом:
// ОШИБОЧНЫЙ ПУТЬ
ФайлТекст = Новый ЧтениеТекста("\\Srv-1\Exchange\data.txt");
Дата = ФайлТекст.ПолучитьВремяИзменения(); // Здесь возникнет ошибка
Метод ПолучитьВремяИзменения() не принадлежит объекту ЧтениеТекста. Для работы с атрибутами файла (размер, имя, расширение, дата изменения) нам необходим специализированный объект Файл.
Разберем правильный алгоритм действий. Для получения метаданных нам нужно создать экземпляр объекта Файл, передав в конструктор полный путь к нему. При этом сам файл не открывается для чтения, 1С просто обращается к операционной системе за информацией о записи в каталоге.
Рассмотрим рабочий пример кода:
ПутьКФайлу = "\\Srv-1\Exchange\report.txt";
ОбъектФайл = Новый Файл(ПутьКФайлу);
// Проверим, существует ли файл, прежде чем запрашивать дату
Если ОбъектФайл.Существует() Тогда
ДатаИзменения = ОбъектФайл.ПолучитьВремяИзменения();
Сообщить("Файл был изменен: " + ДатаИзменения);
Иначе
Сообщить("Файл по указанному пути не найден!");
КонецЕсли;
В этом примере метод ПолучитьВремяИзменения() возвращает значение типа Дата, которое содержит и число, и время (часы, минуты, секунды) последнего сохранения файла пользователем или другой программой.
Выясним важный нюанс: метод ПолучитьВремяИзменения() возвращает время в соответствии с часовым поясом того компьютера, на котором выполняется код. Если ваша информационная база распределена или сервер находится в другом регионе, это может вызвать путаницу.
Проанализируем ситуацию: для систем синхронизации данных лучше использовать метод ПолучитьУниверсальноеВремяИзменения(). Он возвращает время в формате UTC (по Гринвичу). Это гарантирует, что при сравнении дат файлов на разных серверах у вас не будет «скачков» из-за разницы часовых поясов или перехода на летнее время.
// Пример использования универсального времени
УниверсальнаяДата = ОбъектФайл.ПолучитьУниверсальноеВремяИзменения();
Когда мы работаем с сетевыми путями (например, \\Server\Folder\file.txt), нужно учитывать контекст выполнения кода. Разберем по шагам:
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С.