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

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

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

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

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

Способ 1. Изменение свойств конфигурации (быстрое решение)

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

Выполним следующие шаги в Конфигураторе:

  1. Откроем дерево метаданных и перейдем в свойства корневого элемента (самый верхний узел с названием вашей конфигурации).
  2. Найдем раздел «Совместимость».
  3. Рассмотрим свойство «Режим использования модальности». Если установлено «Не использовать», то вызов модальных окон (например, ОткрытьФормуМодально()) будет приводить к ошибке. Установим значение «Использовать», если это необходимо.
  4. Найдем свойство «Режим использования синхронных вызовов...». Именно оно отвечает за работу методов Вопрос(), Предупреждение() и ДиалогВыбораФайла.Выбрать(). Установим его в значение «Использовать», чтобы разрешить синхронный код.

Важно: В типовых современных конфигурациях (таких как БП 3.0, УТ 11, ERP) эти свойства по умолчанию установлены в «Не использовать». Именно поэтому в них нельзя использовать старый стиль написания кода.

Способ 2. Использование механизма «ОписаниеОповещения» (стандарт 8.3.15)

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

Посмотрим на пример трансформации кода для диалога выбора файла:

Старый (запрещенный) вариант:


&НаКлиенте
Процедура ВыбратьФайл(Команда)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Если Диалог.Выбрать() Тогда // Здесь произойдет ошибка
        ПутьКФайлу = Диалог.ПолноеИмяФайла;
        // дальнейшая логика
    КонецЕсли;
КонецПроцедуры

Новый (рекомендуемый) вариант:


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

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

Обратите внимание, что процедура завершения обязательно должна иметь признак Экспорт, иначе платформа не сможет к ней обратиться.

Способ 3. Асинхронные функции (современный подход 8.3.18+)

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

Разберем пример с вопросом пользователю:


&НаКлиенте
Асинх Процедура ЗаполнитьДанные(Команда)
    
    ТекстВопроса = "Табличная часть будет очищена. Продолжить?";
    // Используем Ждать перед вызовом асинхронной версии метода
    Результат = Ждать ВопросАсинх(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
    
    Если Результат = КодВозвратаДиалога.Да Тогда
        // Код выполняется только после того, как пользователь нажал "Да"
        ОчиститьТабличнуюЧасть();
    КонецЕсли;
    
КонецПроцедуры

Этот подход значительно упрощает чтение кода, так как нам не нужно разрывать логику на две разные процедуры. Список «запрещенных» методов теперь имеет свои «Асинх»-аналоги:

Таблица замены устаревших методов

Выясним, какие еще методы требуют замены при переходе на асинхронную модель работы:

  1. Выбор из меню: Вместо ВыбратьИзМеню() используйте ПоказатьВыборИзМеню() или ВыбратьИзМенюАсинх().
  2. Предупреждение: Вместо Предупреждение() используйте ПоказатьПредупреждение().
  3. Ввод значения: Вместо ВвестиЗначение() используйте ПоказатьВводЗначения().
  4. Открытие формы: Вместо ОткрытьФормуМодально() используйте ОткрытьФорму() с параметром описания оповещения о закрытии.

Как найти все проблемные места в конфигурации?

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

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

Практический совет: При проектировании асинхронного интерфейса помните о User Experience (UX). Поскольку код не «замораживает» форму, пользователь может успеть нажать на кнопку повторно, пока диалог выбора файла еще открыт. Рекомендуется программно блокировать элементы управления или устанавливать флаги состояния, чтобы избежать дублирования действий.

Использование асинхронности — это не просто требование платформы, а стандарт современной разработки. Переход на Асинх/Ждать или ОписаниеОповещения делает ваши приложения более отзывчивыми и готовыми к работе в любых условиях — от локального ПК до мобильного браузера.

← На главную