При разработке функционала выбора файлов на управляемых формах в 1С:Предприятие 8.3 часто возникает ошибка времени выполнения: «Использование синхронных методов на клиенте запрещено!». Ошибка появляется при попытке вызвать модальный метод Диалог.Выбрать() в процедуре события НачалоВыбора.
Разберем подробно причины возникновения этой ошибки, выясним, как правильно переписать код на асинхронные методы, а также рассмотрим особенности сохранения полученного пути в форму констант и нюансы работы с файловыми путями на клиенте и сервере.
В современных конфигурациях 1С в свойствах корневого элемента метаданных (конфигурации) свойство «Режим использования модальности» установлено в значение Не использовать, а «Режим использования синхронных вызовов расширений работы с файлами» или синхронных вызовов платформы переведен в режим запрета. Это архитектурное требование платформы для обеспечения плавной работы интерфейса в веб-клиенте и мобильных приложениях, где блокирующие вызовы браузера или системы недопустимы.
Попытка вызвать устаревший метод Диалог.Выбрать() приводит к аварийному завершению процедуры. Для решения задачи необходимо использовать асинхронную модель работы.
Проанализируем наиболее современный, лаконичный и читаемый способ решения задачи. Начиная с версии платформы 8.3.18, в платформе доступен асинхронный синтаксис, исключающий необходимость создания отдельных процедур обратного вызова.
Рассмотрим по шагам реализацию обработчика выбора файла в форме констант:
Асинх.СтандартнаяОбработка = Ложь.ДиалогВыбораФайла и настраиваем его параметры (заголовок, фильтры, режим выбора).ВыбратьАсинх() с оператором Ждать.НаборКонстант.Посмотрим на пример программного кода:
&НаКлиенте
Асинх Процедура ШаблонВыгрузкиВзаиморасчетовНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл шаблона";
Диалог.Фильтр = "Файлы Excel (*.xlsx;*.xls)|*.xlsx;*.xls|Все файлы (*.*)|*.*";
Диалог.МножественныйВыбор = Ложь;
Диалог.Каталог = "F:\";
ВыбранныеФайлы = Ждать Диалог.ВыбратьАсинх();
Если ВыбранныеФайлы <> Неопределено Тогда
// Получаем первый выбранный файл из массива
НаборКонстант.ШаблонВыгрузкиВзаиморасчетов = ВыбранныеФайлы[0];
КонецЕсли;
КонецПроцедуры
Если конфигурация работает на более ранних версиях платформы (8.3.17 и ниже) либо используется механизм автоматического рефакторинга конфигуратора, алгоритм разделяется на две процедуры: инициализацию диалога и обработку завершения.
Разберем подробнее, как устроена данная схема:
ДиалогВыбораФайла и вызываем Диалог.Показать(...), передав в него ОписаниеОповещения.ВыбранныеФайлы. Если пользователь не отменил выбор, в этой переменной будет содержаться массив строк с полными путями к выбранным файлам.Посмотрим на пример кода:
&НаКлиенте
Процедура ШаблонВыгрузкиВзаиморасчетовНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл";
Диалог.Фильтр = "Файлы Excel (*.xlsx;*.xls)|*.xlsx;*.xls|Все файлы (*.*)|*.*";
Диалог.МножественныйВыбор = Ложь;
Диалог.Каталог = "F:\";
Оповещение = Новый ОписаниеОповещения("ШаблонВыгрузкиЗавершение", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ШаблонВыгрузкиЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
// Записываем путь в основной реквизит формы констант
НаборКонстант.ШаблонВыгрузкиВзаиморасчетов = ВыбранныеФайлы[0];
КонецЕсли;
КонецПроцедуры
Частая ошибка начинающих разработчиков — попытка присвоить полученный путь переменной Элемент или обращение к Объект.ИмяРеквизита. В управляемых формах:
Элемент события представляет собой элемент интерфейса (поле ввода), а не данные. Присвоение ему значения не изменяет данные формы.Объект, однако в форме констант основным реквизитом по умолчанию является НаборКонстант.НаборКонстант.ИмяКонстанты = ПутьКФайлу;.Выясним важные детали, которые необходимо учитывать при сохранении локальных путей к файлам:
F:\Templates\file.xlsx получается на клиентском компьютере конкретного пользователя. Сервер 1С или другой пользователь сети не смогут получить доступ к этому диску, если он локальный. Для многопользовательской работы следует использовать сетевые ресурсы (UNC-пути вида \\ServerName\Share\file.xlsx) либо хранить сам файл внутри базы в реквизите с типом ХранилищеЗначения.ЗапуститьПриложение путь обязательно должен обрамляться дополнительными кавычками.