При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда привычный код вызова диалога выбора файла или окна вопроса перестает работать, выдавая ошибку: «Использование синхронных методов на клиенте запрещено!». Эта проблема особенно актуальна при создании конфигураций «с нуля» или при переносе кода из старых версий (например, из 8.2 или ранних редакций 8.3) в современные решения на базе управляемых форм. Разберем подробно, почему возникает эта ошибка и какими способами ее можно устранить.
Для начала проанализируем архитектурные изменения в платформе 1С. Основная причина отказа от синхронных методов — это развитие веб-клиента и мобильных платформ. В современных браузерах выполнение скрипта полностью останавливается (замораживается), если вызывается модальное окно, ожидающее ответа пользователя. Это негативно сказывается на пользовательском опыте и стабильности работы. Чтобы обеспечить идентичное поведение системы в тонком клиенте, веб-клиенте и на мобильных устройствах, фирма «1С» внедрила асинхронную модель взаимодействия. В этой модели интерфейс не блокируется, а выполнение кода продолжается в специально назначенной процедуре-обработчике после того, как пользователь совершит действие в диалоговом окне.
Если вам необходимо быстро запустить старый код в новой базе и вы не готовы прямо сейчас переписывать все процедуры, можно изменить настройки самой конфигурации. Однако помните, что это считается временной мерой или «костылем», так как в будущем платформа может полностью перестать поддерживать синхронные вызовы.
Выполним следующие шаги в Конфигураторе:
ОткрытьФормуМодально()) будет приводить к ошибке. Установим значение «Использовать», если это необходимо.Вопрос(), Предупреждение() и ДиалогВыбораФайла.Выбрать(). Установим его в значение «Использовать», чтобы разрешить синхронный код.Важно: В типовых современных конфигурациях (таких как БП 3.0, УТ 11, ERP) эти свойства по умолчанию установлены в «Не использовать». Именно поэтому в них нельзя использовать старый стиль написания кода.
Рассмотрим правильный с точки зрения современной разработки подход. Вместо того чтобы ждать ответа от функции Выбрать() непосредственно в текущей процедуре, мы создаем объект ОписаниеОповещения, который указывает системе, какую процедуру нужно вызвать после того, как пользователь выберет файл или нажмет кнопку в диалоге.
Посмотрим на пример трансформации кода для диалога выбора файла:
Старый (запрещенный) вариант:
&НаКлиенте
Процедура ВыбратьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Если Диалог.Выбрать() Тогда // Здесь произойдет ошибка
ПутьКФайлу = Диалог.ПолноеИмяФайла;
// дальнейшая логика
КонецЕсли;
КонецПроцедуры
Новый (рекомендуемый) вариант:
&НаКлиенте
Процедура ВыбратьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
// Создаем описание оповещения, указывая имя процедуры-обработчика
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
// Вместо Выбрать() используем метод Показать()
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено Тогда
ПутьКФайлу = ВыбранныеФайлы[0];
// алгоритм обработки файла
КонецЕсли;
КонецПроцедуры
Обратите внимание, что процедура завершения обязательно должна иметь признак Экспорт, иначе платформа не сможет к ней обратиться.
Проанализируем наиболее современный и элегантный метод, появившийся в последних версиях платформы. Он позволяет писать код, который визуально похож на синхронный, но технически работает асинхронно. Это достигается с помощью ключевых слов Асинх и Ждать.
Разберем пример с вопросом пользователю:
&НаКлиенте
Асинх Процедура ЗаполнитьДанные(Команда)
ТекстВопроса = "Табличная часть будет очищена. Продолжить?";
// Используем Ждать перед вызовом асинхронной версии метода
Результат = Ждать ВопросАсинх(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Если Результат = КодВозвратаДиалога.Да Тогда
// Код выполняется только после того, как пользователь нажал "Да"
ОчиститьТабличнуюЧасть();
КонецЕсли;
КонецПроцедуры
Этот подход значительно упрощает чтение кода, так как нам не нужно разрывать логику на две разные процедуры. Список «запрещенных» методов теперь имеет свои «Асинх»-аналоги:
Вопрос() заменяется на ВопросАсинх()Предупреждение() заменяется на ПредупреждениеАсинх()Диалог.Выбрать() заменяется на Диалог.ВыбратьАсинх()Выясним, какие еще методы требуют замены при переходе на асинхронную модель работы:
ВыбратьИзМеню() используйте ПоказатьВыборИзМеню() или ВыбратьИзМенюАсинх().Предупреждение() используйте ПоказатьПредупреждение().ВвестиЗначение() используйте ПоказатьВводЗначения().ОткрытьФормуМодально() используйте ОткрытьФорму() с параметром описания оповещения о закрытии.Если база данных большая, искать каждый вызов Вопрос() вручную крайне неэффективно. Рассмотрим инструменты автоматизации поиска. В Конфигураторе предусмотрена специальная проверка:
Практический совет: При проектировании асинхронного интерфейса помните о User Experience (UX). Поскольку код не «замораживает» форму, пользователь может успеть нажать на кнопку повторно, пока диалог выбора файла еще открыт. Рекомендуется программно блокировать элементы управления или устанавливать флаги состояния, чтобы избежать дублирования действий.
Использование асинхронности — это не просто требование платформы, а стандарт современной разработки. Переход на Асинх/Ждать или ОписаниеОповещения делает ваши приложения более отзывчивыми и готовыми к работе в любых условиях — от локального ПК до мобильного браузера.