Как исправить ошибку «Использование синхронных методов на клиенте запрещено!» при выборе файла или каталога в 1С?

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

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

Выясним причину такого поведения платформы, проанализируем механизмы блокировки и подробно разберем все способы решения этой проблемы с примерами готового кода.

Почему возникает эта ошибка?

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

  1. Режим использования синхронных вызовов расширений платформы и внешних компонент, а также Режим использования модальности в свойствах корневого узла конфигурации установлены в значение Не использовать. Это необходимо для обеспечения кроссплатформенности и бесперебойной работы в веб-клиенте, где браузеры блокируют синхронную остановку интерфейса.
  2. Параметр запуска клиента: при запуске системы в режиме отладки из Конфигуратора 1С автоматически передает ключ /EnableCheckModal. Этот параметр принудительно включает строгую проверку модальности и синхронности даже в тонком и толстом клиентах.

Синхронный метод ДиалогОткрытия.Выбрать() полностью останавливает выполнение клиентского скрипта и ожидает действий пользователя, что нарушает правила асинхронного взаимодействия. Чтобы исправить работу конфигурации или внешней обработки, необходимо переписать код на асинхронные методы.

Способ 1. Использование метода «Показать» и «ОписаниеОповещения»

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

Посмотрим на пример реализации обработчика начала выбора каталога:


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

&НаКлиенте
Процедура КаталогДляФайловЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    
    // Если пользователь закрыл диалог или отменил выбор, массив будет Неопределено
    Если ВыбранныеФайлы <> Неопределено Тогда
        Диалог = ДополнительныеПараметры.Диалог;
        Объект.КаталогДляФайлов = Диалог.Каталог + "\";
    КонецЕсли;
    
КонецПроцедуры

Проанализируем детали выполнения этого кода:

  1. Мы устанавливаем СтандартнаяОбработка = Ложь;, чтобы платформа не открывала собственное стандартное окно выбора значения поля.
  2. Создаем объект ОписаниеОповещения, куда передаем имя экспортной процедуры обратного вызова, контекст формы и дополнительные параметры через структуру.
  3. Процедура-обработчик завершения обязательно должна иметь модификатор Экспорт, иначе платформа не сможет вызвать ее при получении ответа от операционной системы.

Способ 2. Современный асинхронный код с ключевыми словами «Асинх» и «Ждать» (начиная с 8.3.18)

Рассмотрим современную альтернативу, появившуюся в современных версиях платформы 1С:Предприятие. Использование конструкций Асинх и Ждать позволяет избежать разделения одного действия на две разные процедуры и сохраняет линейность программного кода.

Посмотрим, как выглядит тот же самый выбор папки с использованием метода ВыбратьАсинх():


&НаКлиенте
Асинх Процедура КаталогДляФайловНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    ДиалогОткрытия = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
    ДиалогОткрытия.Каталог = "";
    ДиалогОткрытия.МножественныйВыбор = Ложь;
    ДиалогОткрытия.Заголовок = "Выберите каталог для загрузки.";
    
    РезультатВыбора = Ждать ДиалогОткрытия.ВыбратьАсинх();
    
    Если РезультатВыбора <> Неопределено Тогда
        Объект.КаталогДляФайлов = ДиалогОткрытия.Каталог + "\";
    КонецЕсли;
    
КонецПроцедуры

Разберем преимущества этого способа: процедура объявляется с модификатором Асинх, а перед вызовом функции выбора указывается оператор Ждать. Выполнение функции приостанавливается до ответа пользователя, но интерфейс клиента не «зависает», и ошибка времени выполнения не генерируется.

Способ 3. Изменение настроек конфигурации (для нетиповых конфигураций)

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

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

Важное предупреждение: этот способ не рекомендуется стандартами разработки «1С». Включение синхронных вызовов сделает невозможным запуск базы в веб-клиенте через интернет-браузер и приведет к проблемам при переносе решения в облачные сервисы.

Важные особенности при работе с файлами

Обратим внимание на нюансы клиент-серверной архитектуры платформы:

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