Дата создания файла во встроенном языке 1С: что умеет платформа и как обойти её ограничения
Содержание
У объекта Файл во встроенном языке 1С 8.3 нет метода, который возвращает время создания файла. Платформа отдаёт только время изменения: ПолучитьВремяИзменения() и ПолучитьУниверсальноеВремяИзменения(). Чтобы получить именно дату создания, в Windows используют COM-объект Scripting.FileSystemObject и его свойство DateCreated, в Linux — системную утилиту stat.
Ограничение касается платформы, а не конфигурации: одинаково в Бухгалтерии, ЗУП, УТ и в собственной разработке. Ниже — рабочий код для каждого случая, разбор, где он выполняется, и что делать с часовыми поясами.
Какие даты файла платформа 1С отдаёт штатно
Объект создают конструктором Новый Файл(ПолныйПуть). Сам конструктор не проверяет, есть ли файл на диске, поэтому первым делом вызывают Существует().
Что доступно у объекта Файл:
- 📄
Существует(),ЭтоФайл(),ЭтоКаталог()— проверки; - 📏
Размер()— размер в байтах; - 🕒
ПолучитьВремяИзменения()— время последнего изменения в местном времени компьютера, где выполняется код; - 🌐
ПолучитьУниверсальноеВремяИзменения()— то же время в UTC; - ✏️
УстановитьВремяИзменения()иУстановитьУниверсальноеВремяИзменения()— запись времени изменения; - 🔒
ПолучитьТолькоЧтение(),ПолучитьНевидимость()— атрибуты.
Времени создания и времени последнего доступа в этом списке нет. Для клиентского кода есть асинхронные варианты методов (с суффиксом Асинх), но и среди них дата создания не появилась.
Файл = Новый Файл("C:\Обмен\выгрузка.xml");
Если Файл.Существует() Тогда
ВремяИзменения = Файл.ПолучитьВремяИзменения();
Сообщить("Изменён: " + Формат(ВремяИзменения, "ДФ='дд.ММ.гггг ЧЧ:мм:сс'"));
КонецЕсли;
Часто «дату создания» просят там, где на самом деле нужна дата изменения: найти свежую выгрузку, удалить старые логи, проверить, обновился ли файл обмена. Для таких задач хватает штатного метода, и код работает и в Windows, и в Linux без внешних объектов.
Дата создания действительно нужна, когда важен момент появления файла: скан пришёл в папку, архив положили на сервер, файл подгрузил сторонний робот. Тогда переходите к следующим разделам.
Получение времени создания файла через FileSystemObject в Windows
Scripting.FileSystemObject есть в любой Windows. У объекта файла, который возвращает метод GetFile, три свойства с датами:
| Свойство | Что означает |
|---|---|
DateCreated | время создания файла в этой файловой системе |
DateLastModified | время последнего изменения содержимого |
DateLastAccessed | время последнего обращения |
1С преобразует COM-дату в обычное значение типа Дата, поэтому результат сразу можно сравнивать, форматировать и записывать в реквизиты.
Функция ДатаСозданияФайла(ПолныйПуть) Экспорт
ФС = Новый COMОбъект("Scripting.FileSystemObject");
Если Не ФС.FileExists(ПолныйПуть) Тогда
Возврат Неопределено;
КонецЕсли;
ФайлCOM = ФС.GetFile(ПолныйПуть);
Возврат ФайлCOM.DateCreated;
КонецФункции
Для каталога код тот же, только вместо FileExists и GetFile вызывают FolderExists и GetFolder. Свойство DateCreated у папки тоже есть.
Как обойти всю папку
Если нужно получить даты по множеству файлов, найдите их штатной функцией НайтиФайлы, а COM-объект создайте один раз. Создание COM-объекта на каждой итерации заметно тормозит на папках с тысячами файлов.
Функция ДатыСозданияВКаталоге(Каталог, Маска = "*.*") Экспорт
Результат = Новый ТаблицаЗначений;
Результат.Колонки.Добавить("Имя");
Результат.Колонки.Добавить("Создан");
Результат.Колонки.Добавить("Изменён");
ФС = Новый COMОбъект("Scripting.FileSystemObject");
Найденные = НайтиФайлы(Каталог, Маска, Ложь);
Для Каждого Файл Из Найденные Цикл
Если Не Файл.ЭтоФайл() Тогда
Продолжить;
КонецЕсли;
ФайлCOM = ФС.GetFile(Файл.ПолноеИмя);
Строка = Результат.Добавить();
Строка.Имя = Файл.Имя;
Строка.Создан = ФайлCOM.DateCreated;
Строка.Изменён = Файл.ПолучитьВремяИзменения();
КонецЦикла;
Результат.Сортировать("Создан Убыв");
Возврат Результат;
КонецФункции
Где этот код можно выполнять
- 🖥️ На клиенте — в тонком и толстом клиенте под Windows. Тогда читаются файлы на компьютере пользователя.
- 🗄️ На сервере — если сервер 1С работает под Windows. Тогда читаются файлы сервера.
- 🚫 В веб-клиенте и в клиенте под Linux или macOS COM недоступен.
Оборачивайте вызов в Попытка ... Исключение: если файл удалили между НайтиФайлы и GetFile или к нему нет прав, COM выбросит исключение, и без обработки упадёт вся процедура.
Дата создания файла на сервере под Linux
На Linux COM-объектов нет. Время создания (birth time) хранят современные файловые системы, например ext4, и его показывает утилита stat. Формат %W выводит его в секундах от 1 января 1970 года UTC, а если файловая система эту дату не хранит — выводит 0.
Поддержка зависит от версии ядра и пакета coreutils. На старых дистрибутивах stat может не знать время создания вовсе — проверьте командой в терминале сервера: stat --format=%W /путь/к/файлу.
Функция ДатаСозданияФайлаLinux(ПолныйПуть) Экспорт
ИмяВывода = ПолучитьИмяВременногоФайла("txt");
Команда = "sh -c ""stat --format=%W '" + ПолныйПуть + "' > '" + ИмяВывода + "'""";
ЗапуститьПриложение(Команда, , Истина);
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ИмяВывода);
СтрокаСекунд = СокрЛП(Текст.ПолучитьТекст());
УдалитьФайлы(ИмяВывода);
Попытка
Секунд = Число(СтрокаСекунд);
Исключение
Возврат Неопределено;
КонецПопытки;
Если Секунд = 0 Тогда
Возврат Неопределено; // файловая система не хранит дату создания
КонецЕсли;
ДатаUTC = Дата(1970, 1, 1) + Секунд;
Возврат МестноеВремя(ДатаUTC);
КонецФункции
Путь подставляется в строку команды оболочки. Если он приходит от пользователя или из внешней системы, проверьте, что в нём нет одинарных кавычек и символов вроде ; и $. Иначе строка выполнит не то, что задумано.
Сетевые папки, смонтированные через SMB или NFS, часто не отдают время создания вообще. На таких путях stat вернёт 0, и функция вернёт Неопределено — это нормальный исход, а не ошибка в коде.
Файл в хранилище 1С: какие даты сохраняются после загрузки
Когда пользователь выбирает файл в форме, на сервер уходят только его содержимое и имя. Методы помещения файлов (ПоместитьФайл, НачатьПомещениеФайлов и более новые асинхронные варианты с описанием через СсылкаНаФайл) дату создания не передают. Во временном хранилище и в реквизите типа ХранилищеЗначения лежат ДвоичныеДанные, а у двоичных данных дат нет.
Из этого следует простое правило: дату создания нужно прочитать на клиенте до передачи файла и отправить на сервер отдельным параметром. После загрузки восстановить её уже неоткуда.
Порядок такой:
- На клиенте получите путь к выбранному файлу.
- Прочитайте дату через
FileSystemObject(тонкий клиент под Windows) или возьмите время изменения через объектФайл. - Поместите файл во временное хранилище.
- Вызовите серверную процедуру и передайте ей адрес хранилища вместе с датой.
- На сервере запишите дату в реквизит документа или справочника.
В веб-клиенте этот путь закрыт: браузер по своим правилам безопасности не сообщает странице ни полный путь, ни дату создания файла.
Присоединённые файлы в типовых конфигурациях
В конфигурациях на БСП (Бухгалтерия, ЗУП, УТ, ERP) вложения хранятся в справочниках присоединённых файлов. В их реквизитах есть ДатаСоздания — это момент, когда файл добавили в базу, а не дата создания исходника на диске. Время изменения исходного файла на момент загрузки сохраняется в реквизите ДатаМодифицированияУниверсальная, в UTC.
Если бизнес-процессу нужна именно дата создания документа-первоисточника (например, дата скана), её приходится сохранять в отдельный реквизит описанным выше способом.
Сетевые папки и права: почему код работает у вас, но не на сервере
Код из конфигуратора на вашем компьютере читает файлы от имени вашей учётной записи Windows. Серверный код выполняет рабочий процесс rphost от имени учётной записи службы сервера 1С. Отсюда типовые проблемы:
- 🔤 Подключённые сетевые диски не видны. Буква
Z:существует только в сеансе пользователя. На сервере используйте UNC-путь вида\\fileserver\scan\договор.pdf. - 🔑 Нет прав у учётной записи службы. Дайте ей право чтения на сетевую папку и на сам ресурс общего доступа. Если служба работает от локальной учётной записи, доступ к чужому серверу ей не выдать — нужна доменная учётная запись.
- 🛡️ Безопасный режим. В безопасном режиме создавать COM-объекты и запускать внешние программы запрещено. Расширения конфигурации и внешние обработки часто работают именно так. Тогда либо снимают флаг безопасного режима у расширения, либо выдают разрешения через профили безопасности кластера.
- 🐢 Медленная сеть.
GetFileпо UNC делает запрос к файловому серверу на каждый файл. На папке в десятки тысяч файлов обход может занимать минуты — запускайте такие задачи фоновым заданием.
Смена учётной записи службы сервера 1С требует её перезапуска. Перезапуск обрывает все сеансы пользователей, поэтому делайте его вне рабочего времени и предупредите коллег.
Почему дата создания бывает позже даты изменения
Это не баг 1С и не сбой COM. Так ведёт себя файловая система:
- 📋 Копирование создаёт новый файл. Время создания становится временем копирования, а время изменения переносится из исходника. Скопировали вчерашний отчёт сегодня — создан сегодня, изменён вчера.
- 📦 Распаковка архива обычно восстанавливает время изменения из архива, а время создания ставит текущим.
- ➡️ Перемещение в пределах одного диска сохраняет обе даты. Перемещение на другой диск или по сети ведёт себя как копирование.
- 📧 Сохранение вложения из почты даёт и создание, и изменение в момент сохранения.
Практический вывод: если нужен момент, когда файл появился в папке обмена, дата создания подходит. Если нужен возраст содержимого, надёжнее время изменения.
Сравнение способов получения даты
| Способ | Что даёт | Где работает | Ограничения |
|---|---|---|---|
Файл.ПолучитьВремяИзменения() | время изменения, местное | везде, кроме веб-клиента для локальных файлов | даты создания нет |
Файл.ПолучитьУниверсальноеВремяИзменения() | время изменения, UTC | там же | даты создания нет |
FileSystemObject.DateCreated | время создания, местное | Windows: тонкий и толстый клиент, сервер | нужен COM, не работает в безопасном режиме |
stat --format=%W | время создания, UTC в секундах | сервер на Linux | зависит от файловой системы и версии coreutils |
Реквизит ДатаСоздания в присоединённых файлах | момент загрузки в базу | конфигурации на БСП | это не дата файла на диске |
Часовые пояса и формат вывода даты
Все способы, кроме stat и универсального времени изменения, возвращают дату в местном времени того компьютера, где выполнялся код. Если клиент в Новосибирске, а сервер в Москве, одна и та же функция на клиенте и на сервере даст разницу в 4 часа.
Чтобы не путаться, храните в базе время в UTC, а на экран выводите в нужном поясе:
// местное время компьютера → UTC
ДатаUTC = УниверсальноеВремя(ДатаСоздания);
// UTC → время часового пояса сеанса пользователя
ДатаДляПоказа = МестноеВремя(ДатаUTC, ЧасовойПоясСеанса());
ЧасовойПояс() возвращает пояс компьютера, где выполняется код. ЧасовойПоясСеанса() — пояс, установленный для сеанса; его можно задать для пользователя в информационной базе. Для сравнения с датой документа используйте ТекущаяДатаСеанса(), а не ТекущаяДата(): первая учитывает пояс сеанса.
Форматы вывода, которые пригодятся:
| Задача | Выражение | Пример результата |
|---|---|---|
| Для пользователя | Формат(Дата, "ДФ='дд.ММ.гггг ЧЧ:мм:сс'") | 07.10.2026 14:05:09 |
| Для имени файла | Формат(Дата, "ДФ=ггггММдд_ЧЧммсс") | 20261007_140509 |
| Для XML и JSON | XMLСтрока(Дата) | 2026-10-07T14:05:09 |
| Секунды Unix | Дата - Дата(1970, 1, 1) от даты в UTC | число секунд |
Разность двух дат в 1С — число секунд. Поэтому возраст файла в днях считают так: Цел((ТекущаяДатаСеанса() - ДатаСоздания) / 86400). В сутках 86 400 секунд (24 × 60 × 60).
Частые вопросы
Можно ли изменить дату создания файла из 1С?
УстановитьВремяИзменения(). Свойство DateCreated в FileSystemObject доступно только для чтения.Почему DateCreated возвращает 01.01.1980 или другую странную дату?
Работает ли FileSystemObject в 64-разрядном сервере 1С?
Scripting.FileSystemObject зарегистрирован в Windows и для 32-, и для 64-разрядных процессов, отдельная регистрация не нужна.Как узнать дату создания файла внутри DOCX или PDF?
Сколько стоит обойти папку с 10 000 файлов через COM?
GetFile идёт отдельным обращением к файловому серверу. Выносите такой обход в фоновое задание.