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