Как обработать ошибку получения времени изменения файла в веб-клиенте 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Рассмотрим ситуацию, с которой часто сталкиваются разработчики при работе с файловой системой локального компьютера пользователя через веб-клиент. При попытке получить дату изменения файла или каталога с помощью метода НачатьПолучениеВремениИзменения платформы 1С может возникать системная ошибка: "Fail to get modification time". При этом использование стандартной конструкции Попытка-Исключение не спасает — платформа не перехватывает ошибку, и операция завершается аварийно.

Проанализируем детально, почему это происходит, чем поведение современных браузеров отличается от устаревшего Internet Explorer, и по шагам разберем способы корректной обработки подобных исключений.

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

Выясним причину, по которой возникает отказ в доступе. В современных операционных системах Windows существуют системные файлы, эксклюзивно заблокированные ядром ОС. К ним относятся файлы подкачки и гибернации, такие как hiberfil.sys, pagefile.sys и swapfile.sys. При попытке расширения 1С для браузера прочитать атрибуты таких файлов происходит жесткий отказ на уровне ОС.

Посмотрим на разницу в поведении браузеров:

  1. Internet Explorer (IE): Исторически расширение 1С в IE работало на базе технологии COM/ActiveX. Эта архитектура позволяла получать более глубокий доступ к ядру ОС, из-за чего часть системных ограничений обходилась без видимых ошибок веб-клиента.
  2. Современные браузеры (Chrome, Firefox, Opera, Edge): Используют строгую изолированную «песочницу». Они общаются с внешними компонентами (включая расширение 1С) через технологию Native Messaging. В результате браузеры жестко подчиняются системным блокировкам ОС, транслируя отказ в ошибку "Fail to get modification time".

Важно помнить, что достучаться до файловой системы клиента из браузера без установленного расширения 1С для работы с файлами невозможно. Это базовое требование безопасности, защищающее данные пользователя.

Почему конструкция Попытка-Исключение не работает со старыми методами

Разберем архитектурный нюанс. Почему код, обернутый в Попытка-Исключение, игнорирует ошибку при использовании метода НачатьПолучениеВремениИзменения?

Методы, начинающиеся со слова Начать..., используют старую модель асинхронности, основанную на процедурах-коллбэках (описаниях оповещения). Когда мы пишем такой код, конструкция Попытка-Исключение проверяет только успешность инициализации асинхронного вызова в текущем контексте. Реальное же обращение к системному файлу и сама ошибка происходят в фоновом процессе браузера уже после того, как выполнение вышло из блока Попытка. Ошибка возникает в другом контексте, и штатный механизм перехвата 1С оказывается бессилен.

Решение 1: Переход на новые асинхронные методы (Promises)

Начиная с версии платформы 1С:Предприятие 8.3.18, появился новый стандарт работы с асинхронностью, основанный на концепции обещаний (Promises). Для решения проблемы с перехватом системных исключений платформы необходимо перейти на использование метода ПолучитьВремяИзмененияАсинх совместно с оператором Ждать.

Оператор Ждать приостанавливает выполнение текущего потока кода до завершения операции. Если на уровне расширения веб-браузера происходит отказ в доступе (например, при попытке прочитать атрибуты pagefile.sys), платформа корректно пробрасывает эту ошибку обратно в вызывающий код. Теперь Попытка-Исключение начинает работать так, как от нее ожидают.

Посмотрим на пример правильной реализации:


&НаКлиенте
Асинх Процедура ПроверитьВремяИзмененияФайла(ПутьКФайлу)
    
    ФайлОбъект = Новый Файл(ПутьКФайлу);
    
    Попытка
        ВремяИзменения = Ждать ФайлОбъект.ПолучитьВремяИзмененияАсинх();
        Сообщить("Файл изменен: " + Строка(ВремяИзменения));
    Исключение
        ИнформацияОбОшибке = ОписаниеОшибки();
        Сообщить("Ошибка при доступе к файлу: " + ИнформацияОбОшибке);
        // Здесь можно добавить логику пропуска системных файлов
    КонецПопытки;

КонецПроцедуры

Решение 2: Архитектурные рекомендации по обходу проблемы

Если специфика проекта или версия платформы не позволяет перейти на методы с суффиксом ...Асинх, рассмотрим дополнительные программные практики, которые уберегут веб-клиент от аварийных завершений.

  1. Ограничение области сканирования. Проблема чаще всего возникает при попытке обхода корня системного диска (например, диска C:\). Задайте жесткие ограничения: разрешайте пользователю работать только с безопасными каталогами, такими как папка Документы или специально созданная директория для обмена.
  2. Использование черных списков. Программно фильтруйте файлы по их расширению или имени до того, как вызывать метод получения времени. Файлы с расширением .sys (hiberfil.sys, pagefile.sys, swapfile.sys) и известные скрытые папки операционной системы нужно просто игнорировать и пропускать в цикле обхода файлов.
  3. Предварительная проверка атрибутов. Перед запросом времени изменения имеет смысл получить атрибуты файла. Если файл обладает атрибутами "Системный" (System) или "Скрытый" (Hidden), попытку чтения его даты модификации лучше пропустить во избежание ошибки доступа.

Таким образом, комбинируя новые механизмы асинхронной работы платформы 1С с грамотными архитектурными ограничениями, мы можем построить стабильную работу с файловой системой на стороне веб-клиента без раздражающих пользователя вылетов интерфейса.

← На главную