При разработке внешних обработок в «1С:Предприятие 8.3» на управляемых формах нередко возникает задача запросить у пользователя файл для последующей обработки его содержимого. Разберем типичную проблему: можно ли вызвать диалог выбора файла непосредственно из модуля объекта (например, внутри экспортной процедуры ВыполнитьОбработку) и как правильно организовать клиент-серверное взаимодействие.
Проанализируем, почему вызов интерактивного диалога из модуля объекта невозможен:
ДиалогВыбораФайла и другие методы пользовательского интерфейса доступны исключительно в клиентском контексте (тонкий клиент, веб-клиент, толстый клиент). Попытка обращения к интерактивным методам на сервере приводит к ошибке компиляции или выполнения.C:\Temp\file.xlsx, существующий у пользователя на рабочем столе, отсутствует на сервере. Поэтому передавать прямой путь к файлу между клиентом и сервером в общем случае некорректно.Рассмотрим верный подход к реализации данной задачи. Логика должна быть разделена на два ключевых шага:
Для современной платформы 1С 8.3 рекомендуется использовать асинхронный метод НачатьПомещениеФайлаНаСервер(). Он совмещает в себе открытие диалогового окна выбора файла и автоматическую загрузку выбранного файла на сервер во временное хранилище без блокировки интерфейса.
Рассмотрим пример кода в модуле формы обработки:
&НаКлиенте
Процедура ВыбратьИОбработатьФайл(Команда)
// Создаем описание оповещения для обработки результата
ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеВыбораФайла", ЭтотОбъект);
// Запускаем асинхронный диалог выбора файла с автоматической помещением во временное хранилище
НачатьПомещениеФайлаНаСервер(
ОписаниеОповещения,
,
,
Новый УточнениеКонтекстаЗагрузкиФайла,
УникальныйИдентификатор
);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершениеВыбораФайла(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат; // Пользователь отменил выбор
КонецЕсли;
// Передаем полученный адрес временного хранилища на сервер
ОбработатьФайлНаСервере(Результат.Адрес);
КонецПроцедуры
Получив адрес временного хранилища, перейдем в серверный контекст формы, преобразуем реквизит формы Объект в прикладной объект внешней обработки через метод РеквизитФормыВЗначение() и вызовем экспортную процедуру модуля объекта:
&НаСервере
Процедура ОбработатьФайлНаСервере(АдресФайла)
// Преобразуем контекст формы в прикладной объект
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
// Вызываем экспортную процедуру модуля объекта, передавая адрес во временном хранилище
ОбъектОбработки.ВыполнитьОбработку(АдресФайла);
КонецПроцедуры
В модуле объекта внешней обработки считываем двоичные данные из временного хранилища с помощью функции ПолучитьИзВременногоХранилища() и выполняем необходимые манипуляции:
Процедура ВыполнитьОбработку(АдресФайла) Экспорт
// Получаем двоичные данные файла из временного хранилища
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла);
// Сохраняем во временный файл на стороне сервера для обработки
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// Чтение и алгоритм обработки файла...
// Удаляем временный файл после завершения работы
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
Выясним дополнительные нюансы, которые следует учитывать при работе с внешними обработками:
ВнешниеОбработки.Подключить(), по умолчанию она исполняется в безопасном режиме. В этом режиме серверному коду запрещен прямой доступ к файловой системе сервера. Для работы с файлами на сервере убедитесь, что безопасный режим отключен (передачей значения Ложь в соответствующий параметр метода Подключить).ПутьКФайлу типа Строка и включите сохранение настроек формы. Это позволит запоминать ранее выбранный путь между сеансами работы.