С появлением управляемого приложения, web-клиентов и т.д. изменилась и философия программирования на платформе 1С:Предприятие. Если раньше все применяемые методы были синхронными, то теперь появляются еще и асинхронные. И если вы хотите, чтобы ваша конфигурация работала не только на толстом или тонком клиенте, но и на web-клиенте, мобильном приложении или в облаке 1С:Fresh, то придется пользоваться именно асинхронными методами.
В чем же разница? Если коротко, то:
- Синхронные методы блокируют выполнение кода до их завершения.
- Асинхронные методы позволяют коду выполняться дальше, при этом отслеживается момент их завершения.
Асинхронные методы на сегодняшний день существуют только для некоторых операций:
- с блокирующими/диалоговыми окнами для пользователя;
- с файлами;
- с криптографией;
- с внешними компонентами.
Асинхронные методы существуют только на клиенте. На сервере по-прежнему доступны синхронные методы (если они вообще существуют).
Общие принципы использования асинхронных методов
Асинхронные методы обычно имеют в своем названии слова Начать или Показать.
Для их использования необходимо создать один новый объект — ОписаниеОповещения. С помощью этого объекта мы будем показывать системе, какую процедуру нужно выполнить после завершения асинхронного метода.
Рассмотрим наиболее часто встречающиеся задачи, выполняемые с помощью асинхронных методов.
Вызов диалогового окна асинхронно
- Создаем переменную с типом Оповещение. Первым параметром является имя экспортной процедуры, расположенной в модуле этой же формы, которую нужно выполнить после завершения работы диалогового окна. Вторым параметром передается управляемая форма, из которой был вызван диалог.
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект); - С помощью функции ПоказатьВопрос вызываем диалоговое окно. Первым параметром передаем созданное оповещение. Остальные параметры определяют поведение диалогового окна.
ПоказатьВопрос(Оповещение,
"Будет выполнена передача каталога товаров на web-сайт. Продолжить?",
РежимДиалогаВопрос.ДаНет,
0, // таймаут в секундах
КодВозвратаДиалога.Нет, // кнопка по умолчанию
"Подтверждение действия"); // заголовок диалогового окна - Создаем экспортную процедуру, которая будет выполняться после закрытия диалогового окна. В параметр Результат будет передан результат работы диалога.
&НаКлиенте
Процедура ПослеЗакрытияВопроса(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ВыполнитьОбменНаСервере();
КонецЕсли;
КонецПроцедуры
Таким образом, полный код будет выглядеть так:
Процедура ВыполнитьОбмен(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект);
ПоказатьВопрос(Оповещение,
"Будет выполнена передача каталога товаров на web-сайт. Продолжить?",
РежимДиалогаВопрос.ДаНет,
0, // таймаут в секундах
КодВозвратаДиалога.Нет, // кнопка по умолчанию
"Подтверждение действия"); // заголовок диалогового окна
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияВопроса(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ВыполнитьОбменНаСервере();
КонецЕсли;
КонецПроцедуры
Вызов диалога открытия файла асинхронно
Диалог выбора/открытия файлов создается аналогично:
- Создаем описание оповещения
- Вызываем диалоговое окно
- Создаем экспортную процедуру, которая будет выполняться после закрытия диалога.
Продемонстрируем это на примере открытия диалога выбора каталога.
Процедура КаталогНаДискеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Диалог = новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
ОписаниеОп=новый ОписаниеОповещения("КаталогВыбран", ЭтотОбъект);
Диалог.Показать(ОписаниеОп);
КонецПроцедуры
&НаКлиенте
Процедура КаталогВыбран(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено и ВыбранныеФайлы.Количество() > 0 Тогда
КаталогНаДиске=ВыбранныеФайлы[0];
КонецЕсли;
КонецПроцедуры
Более подробное описание диалогов выбора файлов смотрите в этой статье.
Интересно, спасибо большое, но..Прежде чем опубликовать проверили б ошибки в листинге.
Спасибо, Екатерина.
Вы бы написали, где у нас там ошибки :-)
Одну ошибку нашли и исправили. Если есть еще где-то, укажите, пожалуйста.