Как получить полный путь к файлу в 1С и исправить ошибку запрета синхронных вызовов

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

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

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

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

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

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

Способ 1. Использование конструкции «Асинх / Ждать» (для платформы 8.3.18 и новее)

Проанализируем наиболее современный, лаконичный и читаемый способ решения задачи. Начиная с версии платформы 8.3.18, в платформе доступен асинхронный синтаксис, исключающий необходимость создания отдельных процедур обратного вызова.

Рассмотрим по шагам реализацию обработчика выбора файла в форме констант:

  1. Объявляем клиентскую процедуру с ключевым словом Асинх.
  2. Отключаем стандартную обработку выбора через СтандартнаяОбработка = Ложь.
  3. Создаем объект ДиалогВыбораФайла и настраиваем его параметры (заголовок, фильтры, режим выбора).
  4. Вызываем асинхронный метод ВыбратьАсинх() с оператором Ждать.
  5. Записываем полученный путь напрямую в реквизит формы констант через НаборКонстант.

Посмотрим на пример программного кода:


&НаКлиенте
Асинх Процедура ШаблонВыгрузкиВзаиморасчетовНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите файл шаблона";
    Диалог.Фильтр = "Файлы Excel (*.xlsx;*.xls)|*.xlsx;*.xls|Все файлы (*.*)|*.*";
    Диалог.МножественныйВыбор = Ложь;
    Диалог.Каталог = "F:\";
    
    ВыбранныеФайлы = Ждать Диалог.ВыбратьАсинх();
    
    Если ВыбранныеФайлы <> Неопределено Тогда
        // Получаем первый выбранный файл из массива
        НаборКонстант.ШаблонВыгрузкиВзаиморасчетов = ВыбранныеФайлы[0];
    КонецЕсли;

КонецПроцедуры

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

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

Разберем подробнее, как устроена данная схема:

  1. В основной процедуре инициализируем ДиалогВыбораФайла и вызываем Диалог.Показать(...), передав в него ОписаниеОповещения.
  2. В процедуре-обработчике оповещения анализируем переданный параметр ВыбранныеФайлы. Если пользователь не отменил выбор, в этой переменной будет содержаться массив строк с полными путями к выбранным файлам.

Посмотрим на пример кода:


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

&НаКлиенте
Процедура ШаблонВыгрузкиЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    
    Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
        // Записываем путь в основной реквизит формы констант
        НаборКонстант.ШаблонВыгрузкиВзаиморасчетов = ВыбранныеФайлы[0];
    КонецЕсли;
    
КонецПроцедуры

Обращение к реквизитам в форме констант

Частая ошибка начинающих разработчиков — попытка присвоить полученный путь переменной Элемент или обращение к Объект.ИмяРеквизита. В управляемых формах:

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

Важные архитектурные нюансы при работе с путями к файлам

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

  1. Клиент-серверное взаимодействие: Путь вида F:\Templates\file.xlsx получается на клиентском компьютере конкретного пользователя. Сервер 1С или другой пользователь сети не смогут получить доступ к этому диску, если он локальный. Для многопользовательской работы следует использовать сетевые ресурсы (UNC-пути вида \\ServerName\Share\file.xlsx) либо хранить сам файл внутри базы в реквизите с типом ХранилищеЗначения.
  2. Пробелы и кириллица в путях: Платформа 1С корректно обрабатывает кириллические символы и пробелы при чтении файлов штатными средствами. Однако при передаче пути в сторонние утилиты через ЗапуститьПриложение путь обязательно должен обрамляться дополнительными кавычками.
  3. Ограничения веб-клиента: В браузере из соображений безопасности получение прямого локального пути к файловой системе недоступно без предварительной установки и подключения расширения работы с файлами.
← На главную