Дата создания файла во встроенном языке 1С: что умеет платформа и как обойти её ограничения

· 9 мин

Содержание

У объекта Файл во встроенном языке 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С: какие даты сохраняются после загрузки

Когда пользователь выбирает файл в форме, на сервер уходят только его содержимое и имя. Методы помещения файлов (ПоместитьФайл, НачатьПомещениеФайлов и более новые асинхронные варианты с описанием через СсылкаНаФайл) дату создания не передают. Во временном хранилище и в реквизите типа ХранилищеЗначения лежат ДвоичныеДанные, а у двоичных данных дат нет.

Из этого следует простое правило: дату создания нужно прочитать на клиенте до передачи файла и отправить на сервер отдельным параметром. После загрузки восстановить её уже неоткуда.

Порядок такой:

  1. На клиенте получите путь к выбранному файлу.
  2. Прочитайте дату через FileSystemObject (тонкий клиент под Windows) или возьмите время изменения через объект Файл.
  3. Поместите файл во временное хранилище.
  4. Вызовите серверную процедуру и передайте ей адрес хранилища вместе с датой.
  5. На сервере запишите дату в реквизит документа или справочника.

В веб-клиенте этот путь закрыт: браузер по своим правилам безопасности не сообщает странице ни полный путь, ни дату создания файла.

Присоединённые файлы в типовых конфигурациях

В конфигурациях на БСП (Бухгалтерия, ЗУП, УТ, 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 и JSONXMLСтрока(Дата)2026-10-07T14:05:09
Секунды UnixДата - Дата(1970, 1, 1) от даты в UTCчисло секунд

Разность двух дат в 1С — число секунд. Поэтому возраст файла в днях считают так: Цел((ТекущаяДатаСеанса() - ДатаСоздания) / 86400). В сутках 86 400 секунд (24 × 60 × 60).

Частые вопросы

Можно ли изменить дату создания файла из 1С?
Штатно нет: платформа умеет записывать только время изменения через УстановитьВремяИзменения(). Свойство DateCreated в FileSystemObject доступно только для чтения.
Почему DateCreated возвращает 01.01.1980 или другую странную дату?
Так бывает с файлами с флешек и карт памяти в FAT32, из некоторых архивов и после сторонних утилит синхронизации. Это значение, записанное в файловой системе, а не ошибка кода.
Работает ли FileSystemObject в 64-разрядном сервере 1С?
Да. Scripting.FileSystemObject зарегистрирован в Windows и для 32-, и для 64-разрядных процессов, отдельная регистрация не нужна.
Как узнать дату создания файла внутри DOCX или PDF?
Это не дата файла на диске, а метаданные документа, которые записала программа-автор. Их читают разбором содержимого: DOCX — это ZIP-архив со служебным XML внутри. FileSystemObject их не видит.
Сколько стоит обойти папку с 10 000 файлов через COM?
Локально — обычно секунды, по сети — заметно дольше: каждый GetFile идёт отдельным обращением к файловому серверу. Выносите такой обход в фоновое задание.