Разделить местное и универсальное время изменения файла

Учебные задачи

Сначала проверяем своё UTC, затем отдельно местную дату. Не прибавляем вручную три часа: смысл временной шкалы задаётся выбранной парой методов и средой клиента.

Где и как запускать

Полный модуль пустой управляемой формы учебной EPF; клиент Windows с разрешённым доступом к своим временным файлам.

Подготовка

  1. Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.

  2. В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.

  3. Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.

  4. Файл создаётся на компьютере клиента Windows во временном каталоге. Веб-клиент и сервер для данного модуля не используйте.

  5. Требуется разрешённый в учебной базе доступ к локальной файловой системе. Не отключайте профиль безопасности рабочей базы ради запуска.

  6. Создаётся только собственный временный файл с режимом СоздатьНовый. После ожидания операций ресурсы закрываются, точное собственное имя удаляется.

  7. Файл содержит только собственную ASCII-строку ABC123 (6 байтов без BOM). Поток записи закрывается перед чтением/изменением атрибутов.

  8. Все файлы примера создаются заново. Скрытость/readonly при очистке снимаются только у собственного файла после закрытия, затем точное имя удаляется.

  9. Не заменяйте временное имя путём конфигурации, базы, документа или загруженного вами архива. Атрибуты и время меняются только у учебного файла.

&НаКлиенте
Асинх Процедура УчебныйПример(Команда)
    ИмяФайла = ПолучитьИмяВременногоФайла("bin");
    УчебныйФайл = Новый Файл(ИмяФайла);
    Если УчебныйФайл.Существует() Тогда
        ВызватьИсключение "Временное имя уже занято: чужой файл не открываем";
    КонецЕсли;
    Поток = Неопределено;
    Вид = Неопределено;
    Копия = Неопределено;
    СозданСвойФайл = Ложь;
    Попытка
        Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
        СозданСвойФайл = Истина;
        Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
        Поток.Записать(Буфер, 0, Буфер.Размер);
        Поток.Закрыть();
        Поток = Неопределено;
        UTC = Дата(2026, 10, 3, 12, 0, 0);
        Ждать УчебныйФайл.УстановитьУниверсальноеВремяИзмененияАсинх(UTC);
        ПолученноеUTC = Ждать УчебныйФайл.ПолучитьУниверсальноеВремяИзмененияАсинх();
        Сообщить(ПолученноеUTC = UTC);
        Сообщить(ТипЗнч(ПолученноеUTC) = Тип("Дата"));
        МестнаяДата = Дата(2026, 10, 4, 10, 0, 0);
        Ждать УчебныйФайл.УстановитьВремяИзмененияАсинх(МестнаяДата);
        ПолученнаяМестная = Ждать УчебныйФайл.ПолучитьВремяИзмененияАсинх();
        Сообщить(ПолученнаяМестная = МестнаяДата);
        Сообщить(ТипЗнч(ПолученнаяМестная) = Тип("Дата"));
        Размер = Ждать УчебныйФайл.РазмерАсинх();
        Сообщить(Размер = 6);
    Исключение
        Если Вид <> Неопределено Тогда
            Вид.Закрыть();
        КонецЕсли;
        Если Копия <> Неопределено Тогда
            Копия.Закрыть();
        КонецЕсли;
        Если Поток <> Неопределено Тогда
            Поток.Закрыть();
        КонецЕсли;
        Если СозданСвойФайл И УчебныйФайл.Существует() Тогда
            УчебныйФайл.УстановитьТолькоЧтение(Ложь);
            УчебныйФайл.УстановитьНевидимость(Ложь);
        КонецЕсли;
        Если СозданСвойФайл И УчебныйФайл.Существует() Тогда
            УдалитьФайлы(ИмяФайла);
        КонецЕсли;
        ВызватьИсключение;
    КонецПопытки;
    Если Вид <> Неопределено Тогда
        Вид.Закрыть();
    КонецЕсли;
    Если Копия <> Неопределено Тогда
        Копия.Закрыть();
    КонецЕсли;
    Если Поток <> Неопределено Тогда
        Поток.Закрыть();
    КонецЕсли;
    Если СозданСвойФайл И УчебныйФайл.Существует() Тогда
        УчебныйФайл.УстановитьТолькоЧтение(Ложь);
        УчебныйФайл.УстановитьНевидимость(Ложь);
    КонецЕсли;
    Если СозданСвойФайл Тогда
        УдалитьФайлы(ИмяФайла);
    КонецЕсли;
    Сообщить(Не УчебныйФайл.Существует());
КонецПроцедуры

Разбор по шагам

  1. Универсальную пару используем для своей условной отметки UTC 2026-10-03 12:00.

  2. Ожидаем обратное чтение UTC и проверяем значение/тип.

  3. Местную пару используем отдельно для 2026-10-04 10:00 по местному времени клиента.

  4. Код не вычисляет часовой пояс по разности этих дат и не меняет часы ОС; после проверок файл удаляется.

Как проверить результат

  1. На Windows/NTFS с режимом совместимости 8.2.13 или новее пять сравнений Истина.

  2. Файл не записывается после присвоения времени, поэтому сам урок не обновляет отметку новым содержимым.

  3. Последнее сравнение Истина: собственный временный файл удалён после снятия readonly/скрытости.

Ожидаемый результат

Проверены обе шкалы времени собственных файловых метаданных.

На что обратить внимание

  1. В старых режимах совместимости локальная пара имеет описанную в справке сезонную ошибку NTFS; для этого урока требуется 8.2.13 или новее.

  2. Дата 1С сама не несёт часовой пояс. Не смешивайте местную отметку и UTC при сравнении файлов обмена.

  3. Другие файловые системы могут округлять время иначе; совпадение здесь должно проверяться, не предполагается для всякого носителя.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.