Рассмотрим ситуацию, с которой часто сталкиваются разработчики при работе с файловой системой локального компьютера пользователя через веб-клиент. При попытке получить дату изменения файла или каталога с помощью метода НачатьПолучениеВремениИзменения платформы 1С может возникать системная ошибка: "Fail to get modification time". При этом использование стандартной конструкции Попытка-Исключение не спасает — платформа не перехватывает ошибку, и операция завершается аварийно.
Проанализируем детально, почему это происходит, чем поведение современных браузеров отличается от устаревшего Internet Explorer, и по шагам разберем способы корректной обработки подобных исключений.
Выясним причину, по которой возникает отказ в доступе. В современных операционных системах Windows существуют системные файлы, эксклюзивно заблокированные ядром ОС. К ним относятся файлы подкачки и гибернации, такие как hiberfil.sys, pagefile.sys и swapfile.sys. При попытке расширения 1С для браузера прочитать атрибуты таких файлов происходит жесткий отказ на уровне ОС.
Посмотрим на разницу в поведении браузеров:
Важно помнить, что достучаться до файловой системы клиента из браузера без установленного расширения 1С для работы с файлами невозможно. Это базовое требование безопасности, защищающее данные пользователя.
Разберем архитектурный нюанс. Почему код, обернутый в Попытка-Исключение, игнорирует ошибку при использовании метода НачатьПолучениеВремениИзменения?
Методы, начинающиеся со слова Начать..., используют старую модель асинхронности, основанную на процедурах-коллбэках (описаниях оповещения). Когда мы пишем такой код, конструкция Попытка-Исключение проверяет только успешность инициализации асинхронного вызова в текущем контексте. Реальное же обращение к системному файлу и сама ошибка происходят в фоновом процессе браузера уже после того, как выполнение вышло из блока Попытка. Ошибка возникает в другом контексте, и штатный механизм перехвата 1С оказывается бессилен.
Начиная с версии платформы 1С:Предприятие 8.3.18, появился новый стандарт работы с асинхронностью, основанный на концепции обещаний (Promises). Для решения проблемы с перехватом системных исключений платформы необходимо перейти на использование метода ПолучитьВремяИзмененияАсинх совместно с оператором Ждать.
Оператор Ждать приостанавливает выполнение текущего потока кода до завершения операции. Если на уровне расширения веб-браузера происходит отказ в доступе (например, при попытке прочитать атрибуты pagefile.sys), платформа корректно пробрасывает эту ошибку обратно в вызывающий код. Теперь Попытка-Исключение начинает работать так, как от нее ожидают.
Посмотрим на пример правильной реализации:
&НаКлиенте
Асинх Процедура ПроверитьВремяИзмененияФайла(ПутьКФайлу)
ФайлОбъект = Новый Файл(ПутьКФайлу);
Попытка
ВремяИзменения = Ждать ФайлОбъект.ПолучитьВремяИзмененияАсинх();
Сообщить("Файл изменен: " + Строка(ВремяИзменения));
Исключение
ИнформацияОбОшибке = ОписаниеОшибки();
Сообщить("Ошибка при доступе к файлу: " + ИнформацияОбОшибке);
// Здесь можно добавить логику пропуска системных файлов
КонецПопытки;
КонецПроцедуры
Если специфика проекта или версия платформы не позволяет перейти на методы с суффиксом ...Асинх, рассмотрим дополнительные программные практики, которые уберегут веб-клиент от аварийных завершений.
C:\). Задайте жесткие ограничения: разрешайте пользователю работать только с безопасными каталогами, такими как папка Документы или специально созданная директория для обмена..sys (hiberfil.sys, pagefile.sys, swapfile.sys) и известные скрытые папки операционной системы нужно просто игнорировать и пропускать в цикле обхода файлов.Таким образом, комбинируя новые механизмы асинхронной работы платформы 1С с грамотными архитектурными ограничениями, мы можем построить стабильную работу с файловой системой на стороне веб-клиента без раздражающих пользователя вылетов интерфейса.