Разработка и Конфигурация · 11 мин
Как получить дату создания файла в 1С
Как получить дату создания файла в 1С через объект Файл, методы ПолучитьВремяИзменения и НайтиФайлы. Примеры кода, ограничения платформы и типичные ошибки.
Задача узнать дату создания файла возникает в 1С при обмене данными, загрузке выписок, обработке вложений и проверке актуальности выгрузок. На практике здесь есть важный нюанс: встроенный язык платформы напрямую отдаёт только время последнего изменения файла, а не дату его создания. Это ограничение объекта «Файл», и обходить его приходится либо соглашением о том, что изменение равно созданию, либо через средства операционной системы.
Ниже разобраны рабочие способы: получение времени изменения через объект «Файл», массовый сбор дат через «НайтиФайлы», получение настоящей даты создания через WScript.Shell и PowerShell на Windows, а также особенности работы на клиенте и на сервере. Все примеры кода можно вставить в общий модуль или обработку и адаптировать под свои пути.
Какие даты файла существуют и что умеет платформа 1С
Файловая система хранит несколько временных отметок: дату создания, дату последнего изменения и дату последнего доступа. Разработчиков чаще всего интересует первая, но объект «Файл» во встроенном языке 1С предоставляет методы только для времени изменения: ПолучитьВремяИзменения() и УстановитьВремяИзменения(). Метода «ПолучитьВремяСоздания» в платформе нет.
Это важно понимать до написания кода: если бизнес-логика требует именно дату создания (например, отсекать старые выгрузки по моменту появления файла), стандартного метода недостаточно. Во многих прикладных сценариях, впрочем, время изменения оказывается достаточным — при загрузке данных файл обычно создаётся и сразу заполняется, и обе даты практически совпадают.
Получаем время изменения через объект «Файл»
Базовый приём — создать объект «Файл» по полному пути и вызвать метод получения времени. Перед чтением даты следует проверить существование файла, иначе метод вернёт пустую дату, что легко принять за ошибку логики.
ФайлНаДиске = Новый Файл("C:\Обмен\выписка.xml");
Если ФайлНаДиске.Существует() Тогда
ДатаФайла = ФайлНаДиске.ПолучитьВремяИзменения();
Сообщить("Файл изменён: " + ДатаФайла);
Иначе
Сообщить("Файл не найден");
КонецЕсли;
Метод возвращает значение типа «Дата» с точностью до секунд. Дата универсальная, без привязки к часовому поясу сеанса, — при сравнении с текущей датой используйте ТекущаяДатаСеанса() осознанно: на сервере и клиенте часовые пояса могут различаться, и разница в несколько часов способна «сломать» отбор свежих файлов.
Если файл лежит на сетевом ресурсе, путь указывают в формате UNC (\\Сервер\Обмен\файл.xml). У учётной записи, под которой работает сервер 1С, должны быть права чтения на этот каталог — иначе Существует() вернёт «Ложь» даже при наличии файла.
Массовое получение дат через «НайтиФайлы»
Когда нужно обработать каталог целиком — например, найти самый свежий файл выгрузки, — удобнее метод НайтиФайлы(). Он возвращает массив объектов «Файл», и у каждого можно прочитать время изменения без повторного создания объектов.
МассивФайлов = НайтиФайлы("C:\Обмен", "*.xml");
ПоследняяДата = Дата(1, 1, 1);
СвежийФайл = Неопределено;
Для Каждого ТекФайл Из МассивФайлов Цикл
ДатаФайла = ТекФайл.ПолучитьВремяИзменения();
Если ДатаФайла > ПоследняяДата Тогда
ПоследняяДата = ДатаФайла;
СвежийФайл = ТекФайл;
КонецЕсли;
КонецЦикла;
У функции есть третий параметр — признак поиска в подкаталогах. Если передать Истина, поиск станет рекурсивным, что удобно для архивов с вложенной структурой, но заметно медленнее на больших деревьях каталогов. Маска поддерживает несколько шаблонов, разделённых точкой с запятой: ".xml;.csv".
- 1Проверьте, что каталог доступен тому контексту, где выполняется код (клиент или сервер)
- 2Вызовите НайтиФайлы с путём и маской нужного расширения
- 3Переберите массив и сравните ПолучитьВремяИзменения() каждого файла
- 4Сохраните файл с максимальной датой и проверьте, что он вообще найден
- 5Обработайте ситуацию пустого каталога отдельной веткой логики
Как получить именно дату создания на Windows
Через WScript.Shell (Shell.Application)
Настоящую дату создания на Windows даёт объектная модель Shell. Код создаёт COM-объект и читает расширенные свойства файла. Способ работает только там, где доступна Windows и разрешено создание COM-объектов, — обычно это толстый клиент или сервер под Windows.
Shell = Новый COMОбъект("Shell.Application");
Папка = Shell.NameSpace("C:\Обмен");
Элемент = Папка.ParseName("выписка.xml");
ДатаСоздания = Папка.GetDetailsOf(Элемент, 4); // индекс столбца «Дата создания»
Номер столбца в GetDetailsOf зависит от версии Windows и локализации, поэтому надёжный вариант — перебрать индексы и искать колонку по заголовку «Дата создания» через Папка.GetDetailsOf(Неопределено, Индекс). Возвращаемое значение — строка, которую нужно дополнительно преобразовать в тип «Дата»; строка может содержать нестандартные пробелы, которые мешают разбору.
Через PowerShell
Более предсказуемый вариант — запустить PowerShell и вернуть дату в однозначном формате ISO, который легко разбирается в 1С:
СтрокаКоманды = "powershell -Command ""(Get-Item 'C:\Обмен\выписка.xml').CreationTime.ToString('yyyy-MM-dd HH:mm:ss')""";
WshShell = Новый COMОбъект("WScript.Shell");
Результат = WshShell.Exec(СтрокаКоманды);
Вывод = Результат.StdOut.ReadAll();
Полученную строку преобразуют в дату вручную через Дата() с подстановкой частей или функцией разбора. Способ медленнее прямого вызова из-за запуска процесса, поэтому для массовой обработки тысяч файлов его стоит заменить одним скриптом, выводящим даты всех файлов каталога сразу.
Файл = Новый Файл("C:\Обмен\выписка.xml");
Если Файл.Существует() Тогда
ДатаИзменения = Файл.ПолучитьВремяИзменения();
КонецЕсли;Клиент, сервер и тонкие места контекста
Файл, видимый на компьютере пользователя, недоступен серверу 1С, и наоборот. Если код выполняется на сервере, путь должен указывать на диск сервера или сетевой ресурс, доступный учётной записи службы агента. Частая ошибка — отладка на клиенте проходит успешно, а в регламентном задании тот же путь «не существует».
В тонком и веб-клиенте прямой доступ к файловой системе ограничен: потребуется расширение работы с файлами и методы НачатьПомещениеФайла() / НачатьПолучениеФайлов(). Через НачатьПолучениеФайлов() можно получить описание передаваемого файла, включающее время изменения, — это стандартный способ узнать дату файла на клиенте без COM-объектов.
COM-объекты Shell и WScript недоступны на Linux-сервере и в веб-клиенте. Если решение должно быть кроссплатформенным, ограничьтесь временем изменения через объект «Файл» либо переносите логику чтения даты создания на сторону, где установлена Windows.
Проверка результата и типичные ошибки
После получения даты её стоит проверить на адекватность: пустая дата (01.01.0001) означает, что файл не найден или метод не отработал. Дата в будущем — признак расхождения часов между машинами, что типично для сетевых каталогов и чревато ошибками отбора «файлов за сегодня».
Ещё одна ловушка — копирование файлов. При копировании средствами ОС дата создания обычно становится моментом копирования, а время изменения сохраняется от исходного файла. Если выгрузка приходит от сторонней системы, уточните, какая именно отметка отражает нужное событие, иначе отбор будет работать не так, как ожидает бизнес-логика.
Как проверить результат
Дата заполнена и близка к ожидаемому моменту появления файла
Пустая дата 01.01.0001 или дата в будущем
Путь указывает на диск того узла, где исполняется код
Код на сервере ссылается на локальный диск пользователя
Выбранная отметка (создание или изменение) соответствует логике отбора
После копирования отбираются не те файлы
Выбор подхода под задачу
Для типовых обменов — загрузки выписок, прайсов, выгрузок из других систем — почти всегда достаточно времени изменения через объект «Файл» или «НайтиФайлы»: код простой, кроссплатформенный и не требует внешних компонентов. К дате создания через Shell или PowerShell имеет смысл обращаться только когда требование зафиксировано явно, например в аудите происхождения файлов.
Сравнение вариантов
Подходит для большинства обменов; кроссплатформенно, но возвращает время изменения, а не создания
Оптимально для поиска свежего файла в каталоге; медленно на больших деревьях с рекурсией
Даёт настоящую дату создания; только Windows и только там, где разрешены COM-объекты
Точный формат даты и гибкость; накладные расходы на запуск процесса, только Windows
Частые вопросы
Есть ли в 1С метод ПолучитьВремяСоздания?
Нет. Объект «Файл» во встроенном языке предоставляет только ПолучитьВремяИзменения() и УстановитьВремяИзменения(). Дату создания получают средствами операционной системы — через Shell.Application, PowerShell или файловые API.
Почему ПолучитьВремяИзменения возвращает пустую дату?
Чаще всего файл по указанному пути не существует или нет прав на чтение каталога. Проверьте путь, права учётной записи (для сервера — учётной записи службы агента 1С) и доступность сетевого ресурса.
Как узнать дату файла в веб-клиенте?
Напрямую через объект «Файл» — никак, доступ к файловой системе ограничен. Используйте НачатьПолучениеФайлов() с расширением работы с файлами: в описании передаваемого файла доступно время изменения. Дату создания таким способом получить нельзя.
Чем дата создания отличается от даты изменения на практике?
Дата создания фиксирует момент появления файла, дата изменения — момент последней записи в него. При копировании файл получает новую дату создания, но сохраняет старую дату изменения, поэтому результаты отбора по этим отметкам могут заметно различаться.
Работает ли чтение даты создания на Linux-сервере 1С?
Через COM-объекты и PowerShell — нет, это Windows-технологии. На Linux доступно только время изменения через объект «Файл»; дату создания многие файловые системы Linux либо не хранят, либо отдают через специфические вызовы, недоступные из встроенного языка.
Как сравнить дату файла с текущей без ошибок часовых поясов?
Приведите обе величины к одному основанию: либо сравнивайте с датой, полученной на той же машине, где лежит файл, либо явно учитывайте смещение часового пояса сервера. Для отбора «свежих» файлов надёжнее брать самую новую дату в каталоге, а не сравнивать с текущим временем.
Что важно запомнить
Стандартный объект «Файл» отдаёт только время изменения — для большинства обменов этого достаточно. Настоящую дату создания получают через Shell.Application или PowerShell на Windows. Всегда проверяйте существование файла, контекст выполнения (клиент или сервер) и поведение дат после копирования.