Как вызвать диалог выбора файла из модуля объекта внешней обработки в 1С?

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

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

Анализ архитектурных ограничений платформы

Проанализируем, почему вызов интерактивного диалога из модуля объекта невозможен:

  1. Серверный контекст модуля объекта: Модуль объекта внешней обработки всегда исполняется на сервере. Объект ДиалогВыбораФайла и другие методы пользовательского интерфейса доступны исключительно в клиентском контексте (тонкий клиент, веб-клиент, толстый клиент). Попытка обращения к интерактивным методам на сервере приводит к ошибке компиляции или выполнения.
  2. Разделение файловых систем: В клиент-серверном варианте работы сервер «1С:Предприятие» и клиентское приложение физически могут располагаться на разных компьютерах. Локальный путь вида C:\Temp\file.xlsx, существующий у пользователя на рабочем столе, отсутствует на сервере. Поэтому передавать прямой путь к файлу между клиентом и сервером в общем случае некорректно.

Правильная архитектура работы с файлами

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

  1. Интерактивный выбор файла и его загрузка во временное хранилище на клиенте (в модуле формы внешней обработки).
  2. Передача адреса временного хранилища на сервер и вызов экспортного метода модуля объекта.

Шаг 1. Выбор и помещение файла во временное хранилище на клиенте

Для современной платформы 1С 8.3 рекомендуется использовать асинхронный метод НачатьПомещениеФайлаНаСервер(). Он совмещает в себе открытие диалогового окна выбора файла и автоматическую загрузку выбранного файла на сервер во временное хранилище без блокировки интерфейса.

Рассмотрим пример кода в модуле формы обработки:


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

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

Шаг 2. Обращение к модулю объекта на сервере

Получив адрес временного хранилища, перейдем в серверный контекст формы, преобразуем реквизит формы Объект в прикладной объект внешней обработки через метод РеквизитФормыВЗначение() и вызовем экспортную процедуру модуля объекта:


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

Шаг 3. Извлечение и обработка данных в модуле объекта

В модуле объекта внешней обработки считываем двоичные данные из временного хранилища с помощью функции ПолучитьИзВременногоХранилища() и выполняем необходимые манипуляции:


Процедура ВыполнитьОбработку(АдресФайла) Экспорт
    
    // Получаем двоичные данные файла из временного хранилища
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла);
    
    // Сохраняем во временный файл на стороне сервера для обработки
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    // Чтение и алгоритм обработки файла...
    
    // Удаляем временный файл после завершения работы
    УдалитьФайлы(ИмяВременногоФайла);
    
КонецПроцедуры

Важные особенности и ограничения

Выясним дополнительные нюансы, которые следует учитывать при работе с внешними обработками:

  1. Безопасный режим: Если внешняя обработка подключается программно через метод ВнешниеОбработки.Подключить(), по умолчанию она исполняется в безопасном режиме. В этом режиме серверному коду запрещен прямой доступ к файловой системе сервера. Для работы с файлами на сервере убедитесь, что безопасный режим отключен (передачей значения Ложь в соответствующий параметр метода Подключить).
  2. Отладка и автоматическое сохранение пути: Если обработка используется в сценариях тестирования и вам не требуется каждый раз выбирать файл заново, добавьте на форму реквизит ПутьКФайлу типа Строка и включите сохранение настроек формы. Это позволит запоминать ранее выбранный путь между сеансами работы.
← На главную