Перевод пользователей с тонкого клиента на работу через веб-клиент в браузере — частая задача при масштабировании бизнеса и предоставлении удаленного доступа. Однако разработчики сразу сталкиваются с серьезным препятствием: современные браузеры (Google Chrome, Mozilla Firefox, Microsoft Edge) из соображений безопасности и стабильности полностью заблокировали поддержку синхронных вызовов в программном коде JavaScript. Это привело к тому, что привычные синхронные методы работы с локальной файловой системой в 1С перестали функционировать.
В этой статье мы подробно разберем, как решить проблемы асинхронного взаимодействия браузера с веб-клиентом 1С, выясним причины ошибок при подключении расширения работы с файлами, научимся обходить ограничения циклов при проверке существования файлов и рассмотрим современные альтернативные сценарии работы.
Рассмотрим ситуацию, когда в Google Chrome расширение 1CExtension успешно скачано и активировано, локальный код возвращает признак успешного подключения, но система все равно выдает ошибку о том, что расширение не подключено. Проанализируем технические причины этой проблемы.
Современное расширение работы с файлами для браузеров использует двухкомпонентную архитектуру. Оно состоит из двух независимых частей:
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С полный путь к локальному файлу на диске (доступно только имя файла) и не позволяет программно изменять файлы на компьютере клиента без явного интерактивного подтверждения пользователем. Но для стандартных задач «выбрать файл с компьютера -> прикрепить к документу в базе» расширение больше не требуется.
Если специфика работы ваших сотрудников требует непрерывной и сложной работы с локальными файлами, интеграции с торговым оборудованием или локальными принтерами, то использование браузера может стать постоянным источником трудностей.
Рассмотрим две отличные альтернативы полноценному веб-клиенту в браузере:
Таким образом, выбор между доработкой кода под асинхронные вызовы браузера, использованием бесплагинной загрузки или переходом на тонкий клиент по HTTP зависит от конкретных бизнес-требований вашей компании к безопасности и удобству работы сотрудников.