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