Почему метод КаталогВременныхФайлов() вызывает ошибку в тонком клиенте 1С и как это исправить?

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

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

Причина возникновения ошибки

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

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

Решение 1. Использование асинхронного метода с ОписаниемОповещения

Проанализируем классический способ решения через асинхронные вызовы с использованием объекта ОписаниеОповещения. Вместо прямого синхронного вызова КаталогВременныхФайлов() применяется асинхронная процедура НачатьПолучениеКаталогаВременныхФайлов().

Посмотрим на пример кода, реализующего этот подход:


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

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

Решение 2. Использование ключевых слов Асинх / Ждать (для платформы 8.3.18 и выше)

Рассмотрим современный и наиболее удобный способ асинхронного программирования в 1С. Начиная с версии платформы 8.3.18, доступен асинхронный метод КаталогВременныхФайловАсинхрон(). Он позволяет написать плоский линейный код с помощью ключевых слов Асинх и Ждать без создания процедур обработки результатов.

Рассмотрим пример реализации:


&НаКлиенте
Асинх Процедура СкачатьФайлКоманда(Команда)
    КаталогФайлов = Ждать КаталогВременныхФайловАсинхрон();
    // Продолжаем выполнение кода с полученным путем к каталогу
КонецПроцедура

Решение 3. Перенос работы с файлом на сторону сервера

Проанализируем архитектуру задачи. Если основной целью является скачивание файла из интернета и его последующая обработка (например, загрузка данных из файла Excel), то выполнять эти операции на клиенте не всегда целесообразно.

Посмотрим на преимущества переноса скачивания и чтения файла на сервер (директива &НаСервере или &НаСервереБезКонтекста):

  1. На сервере нет ограничений на использование синхронных методов, поэтому методы КаталогВременныхФайлов() и ПолучитьИмяВременногоФайла() работают в штатном режиме.
  2. Экономится сетевой трафик, так как файл загружается напрямую сервером через HTTPСоединение и не передается между клиентом и сервером.
  3. Обеспечивается стабильная работа в веб-клиенте без необходимости установки расширения работы с файлами.

Пример получения пути к временному файлу на сервере:


&НаСервере
Функция СкачатьФайлНаСервере(УРЛ)
    ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
    // Логика скачивания и сохранение файла по полученному пути
    Возврат ИмяФайла;
КонецФункции

Решение 4. Разрешение синхронных вызовов в свойствах конфигурации

Если конфигурация является самописной, не предназначена для работы через веб-клиент и переработка кода под асинхронные методы не планируется, можно изменить настройки базы:

  1. Откройте конфигурацию в режиме Конфигуратор.
  2. В дереве конфигурации нажмите правой кнопкой мыши на корневой элемент и выберите пункт Свойства.
  3. Найдите свойство «Режим использования синхронных вызовов элементов платформы и внешних компонент».
  4. Измените значение свойства с «Не использовать» на «Использовать» или «Использовать с предупреждениями».

После сохранения конфигурации вызов метода КаталогВременныхФайлов() будет выполнять работу в тонком клиенте без ошибок.

← На главную