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

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

Перевод пользователей с тонкого клиента на работу через веб-клиент в браузере — частая задача при масштабировании бизнеса и предоставлении удаленного доступа. Однако разработчики сразу сталкиваются с серьезным препятствием: современные браузеры (Google Chrome, Mozilla Firefox, Microsoft Edge) из соображений безопасности и стабильности полностью заблокировали поддержку синхронных вызовов в программном коде JavaScript. Это привело к тому, что привычные синхронные методы работы с локальной файловой системой в 1С перестали функционировать.

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

Почему возникает ошибка «расширение не подключено» при установленном плагине?

Рассмотрим ситуацию, когда в Google Chrome расширение 1CExtension успешно скачано и активировано, локальный код возвращает признак успешного подключения, но система все равно выдает ошибку о том, что расширение не подключено. Проанализируем технические причины этой проблемы.

Современное расширение работы с файлами для браузеров использует двухкомпонентную архитектуру. Оно состоит из двух независимых частей:

  1. Браузерное расширение — устанавливается непосредственно из интернет-магазина Chrome Web Store. Оно отвечает только за интерфейсную связь между веб-страницей 1С и операционной системой.
  2. Нативное приложение-хост (Native Messaging Host) — локальная программа-прослойка, которая устанавливается в саму операционную систему Windows или Linux (часто через установщик 1cext-setup). Именно она имеет прямой доступ к жесткому диску вашего компьютера.

Если пользователь установил расширение в браузере, но служба безопасности Windows или антивирус заблокировали установку локального компонента (либо у пользователя не хватило прав администратора), браузерная часть не сможет связаться с операционной системой. Для платформы 1С это выглядит как отсутствие подключения.

Также в корпоративных сетях системные администраторы часто блокируют технологию Native Messaging через групповые политики. Для решения этой проблемы необходимо проверить ветку системного реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts

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

Еще одна частая ошибка кроется в логике инициализации старого программного кода. Посмотрим на пример некорректной реализации инициализации подключения:


Процедура ОбновитьИзФайлаНаДиске(ОбработчикРезультата, ДанныеФайла, ИдентификаторФормы)
    Если Не РасширениеРаботыСФайламиПодключено Тогда
        Оповещение = Новый ОписаниеОповещения("РасширениеПодключено", ЭтотОбъект);
        НачатьПодключениеРасширенияРаботыСФайлами(Оповещение);
    КонецЕсли;
    // Ошибка! Основной код процедуры продолжает выполняться здесь сразу, 
    // не дожидаясь, пока отработает асинхронное "РасширениеПодключено"
КонецПроцедуры

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

Решение проблемы циклов с асинхронными вызовами

Разберем сложную задачу: как переписать синхронную проверку существования файлов (метод Существует()), если она вызывается внутри цикла. В старых версиях платформы приходилось использовать метод НачатьПроверкуСуществования() совместно с объектом ОписаниеОповещения.

Обычный цикл Для Каждого в таком случае использовать невозможно. Асинхронный вызов не блокирует выполнение основного потока, и цикл мгновенно прокрутится до конца, отправив пачку запросов в пустоту, не дождавшись ответов от файловой системы. Раньше разработчикам приходилось конструировать сложные рекурсивные цепочки вызовов, передавая индекс текущего элемента и массив файлов во входящих параметрах процедур-оповещений. Это приводило к так называемому «callback hell» (адским обратным вызовам) и делало код нечитаемым.

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

Проанализируем, как изящно и просто выглядит решение этой задачи в современном синтаксисе:


&НаКлиенте
Асинх Процедура ПроверитьСуществованиеФайловНаДиске()
    
    Для Каждого СтрокаТаблицы Из СписокФайловДляПроверки Цикл
        ФайлПроверки = Новый Файл(СтрокаТаблицы.ПутьКФайлу);
        
        // Поток выполнения приостанавливается на этой строке до получения ответа от ОС,
        // при этом интерфейс браузера остается отзывчивым и не зависает!
        ФайлСуществует = Ждать ФайлПроверки.СуществуетАсинх();
        
        Если ФайлСуществует Тогда
            СтрокаТаблицы.Статус = "Найден на диске";
        Иначе
            СтрокаТаблицы.Статус = "Отсутствует";
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Использование конструкции Ждать перед асинхронным методом (все современные методы имеют суффикс ...Асинх) позволяет писать асинхронный код последовательно, сохраняя привычную логику работы обычных циклов.

Работа с файлами без установки расширений в браузер

Часто в компаниях действуют жесткие правила безопасности, запрещающие установку любых сторонних плагинов и программ на компьютеры пользователей (особенно если сотрудники работают со своих личных устройств или планшетов под управлением macOS, iOS, Android). Выясним, можно ли организовать работу с файлами вообще без расширения.

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

Для загрузки файлов на сервер мы можем применить асинхронный метод ПоместитьФайлыНаСерверАсинх(). Посмотрим на пример его использования:


&НаКлиенте
Асинх Процедура ЗагрузитьФайлНаСервер()
    
    ПараметрыЗагрузки = Новый ПараметрыПомещенияФайла;
    ПараметрыЗагрузки.Интерактивно = Истина; // Откроет стандартный диалог браузера
    
    РезультатЗагрузки = Ждать ПоместитьФайлыНаСерверАсинх(,,, ПараметрыЗагрузки, УникальныйИдентификатор);
    
    Если РезультатЗагрузки <> Неопределено Тогда
        Для Каждого Файл Из РезультатЗагрузки Цикл
            // Файл успешно загружен во временное хранилище на сервере 1С
            АдресХранилища = Файл.Адрес;
            ИмяФайла = Файл.СсылкаНаФайл.Имя;
            ПоказатьПредупреждение(, "Файл " + ИмяФайла + " успешно загружен!");
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Важное ограничение: при работе без расширения из соображений безопасности браузер скрывает от платформы 1С полный путь к локальному файлу на диске (доступно только имя файла) и не позволяет программно изменять файлы на компьютере клиента без явного интерактивного подтверждения пользователем. Но для стандартных задач «выбрать файл с компьютера -> прикрепить к документу в базе» расширение больше не требуется.

Альтернатива: Тонкий клиент через веб-сервер и PWA

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

Рассмотрим две отличные альтернативы полноценному веб-клиенту в браузере:

  1. Тонкий клиент 1С с подключением по HTTP/HTTPS. Многие ошибочно полагают, что тонкому клиенту обязательно нужно прямое сетевое подключение к серверу приложений или SQL. Это не так. Тонкий клиент может запускаться и работать через обычную публикацию базы на веб-сервере (IIS или Apache). Пользователь получает ту же скорость работы и минимальный трафик, что и в браузере, но при этом у него полностью и без ограничений доступны все локальные ресурсы компьютера, включая синхронные методы работы с файлами. Тонкий клиент разработан под Windows, macOS, Linux и даже под Android.
  2. Использование технологии PWA (Progressive Web Apps). Начиная с версии 8.3.18, веб-клиент 1С поддерживает PWA. Пользователь может «установить» веб-сайт базы данных прямо из браузера как отдельное приложение. Оно будет запускаться в изолированном окне без интерфейсных элементов браузера (без адресной строки, вкладок и т.д.), работая быстрее обычного веб-клиента и обеспечивая более тесную интеграцию с операционной системой устройства.

Таким образом, выбор между доработкой кода под асинхронные вызовы браузера, использованием бесплагинной загрузки или переходом на тонкий клиент по HTTP зависит от конкретных бизнес-требований вашей компании к безопасности и удобству работы сотрудников.

← На главную