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

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

Переход на работу через веб-клиент часто ставит перед разработчиками непростую задачу: привычные синхронные методы, которые годами работали в тонком или толстом клиенте, в браузере попросту не поддерживаются. Это связано с политикой безопасности современных браузеров, таких как Chrome, Firefox или Safari, которые работают в режиме «песочницы» и блокируют прямой доступ к файловой системе пользователя. В этой статье мы подробно разберем, как адаптировать код для веб-клиента, правильно настроить расширения и обойти ограничения «малой кровью».

Почему возникают сложности при работе в Chrome

Проанализируем ситуацию: в Internet Explorer многие операции выполнялись через механизмы ActiveX, что давало 1С практически неограниченный доступ к локальным ресурсам. Современные браузеры требуют использования расширения для работы с файлами. Однако даже при его наличии нельзя просто вызвать функцию ПодключитьРасширениеРаботыСФайлами() и ожидать, что выполнение кода приостановится до завершения операции. Вызовы должны стать асинхронными.

Переход на асинхронную модель вызовов

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

Вместо попытки выполнить всё в одной процедуре, нам необходимо разделить алгоритм на две части: инициацию вызова и обработку результата. Для этого используется объект ОписаниеОповещения.

Посмотрим на пример правильной структуры кода:


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

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

Выясним причину, по которой код из сообщения №9 в обсуждении не работал: автор пытался сохранить логику типовой конфигурации «подряд», вызывая асинхронный метод внутри условия. В результате 1С продолжала выполнять «типовой текст конфы» еще до того, как расширение успевало инициализироваться.

Особенности установки локальных компонентов

Важно понимать, что для работы в Chrome недостаточно просто установить расширение 1CExtension из интернет-магазина. Для полноценного взаимодействия с ОС требуется наличие установленного на компьютере модуля расширения веб-клиента. Проанализируем цепочку взаимодействия: браузерное расширение обращается к локальному приложению 1С, которое, в свою очередь, имеет права на выполнение операций в Windows или Linux.

Если вы столкнулись с тем, что флаг Подключено возвращает Истина, но команды всё равно не выполняются, проверьте следующие моменты:

Альтернативный метод: Использование JS и HTTP-сервисов

Иногда возникают ситуации, когда использование стандартного расширения невозможно или нестабильно. Рассмотрим более сложный, но гибкий вариант «малой крови» — использование поля HTML-документа. Этот метод позволяет передать файл на сервер без использования тяжеловесных механизмов 1С.

Мы можем разместить на форме элемент ПолеHTMLДокумента и использовать стандартный input type="file". После выбора файла небольшим скриптом на JavaScript данные отправляются в HTTP-сервис 1С.

Пример реализации отправки данных через JavaScript:


var formData = new FormData();
// Получаем файл из элемента input
formData.append("myFile", document.getElementById("file").files[0], 'document_name.pdf');

var xhr = new XMLHttpRequest();
// Указываем путь к вашему HTTP-сервису в базе 1С
xhr.open("POST", "http://server/base/hs/FileExchange/Upload");

// Можно добавить заголовки для идентификации документа в 1С
xhr.setRequestHeader("X-Document-ID", "uuid-вашего-документа");

xhr.send(formData);

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

Использование БСП для минимизации трудозатрат

Если ваша конфигурация построена на базе БСП (Библиотеки стандартных подсистем), рекомендуем использовать программный интерфейс подсистемы РаботаСФайлами. Разработчики БСП уже реализовали «обертки», которые автоматически проверяют тип клиента. Вместо прямого вызова НачатьПомещениеФайла, стоит использовать процедуры из общего модуля РаботаСФайламиКлиент, такие как ПоместитьФайлНаСервер.

Это позволит вам сохранить читаемость кода и обеспечит кросс-браузерную совместимость без необходимости глубокого погружения в специфику API каждого браузера.

Рекомендации по работе с путями файлов

Проанализируем еще одно ограничение: современные браузеры из соображений безопасности скрывают полный путь к файлу (например, вместо C:\Documents\File.txt вы получите просто File.txt или C:\fakepath\File.txt). Если ваша логика завязана на знании точного расположения файла на диске пользователя, ее придется пересмотреть.

В веб-клиенте правильной стратегией является:

  1. Выбор файла пользователем через диалог.
  2. Помещение файла во временное хранилище на сервере 1С.
  3. Обработка данных на стороне сервера.
  4. Если нужно вернуть файл пользователю — использование метода ПолучитьФайл.

Таким образом, использование асинхронных вызовов через ОписаниеОповещения или современные Promises (в версиях платформы 8.3.18+) является единственным надежным способом обеспечить стабильную работу 1С в веб-клиенте через Chrome.

← На главную