Top.Mail.Ru
Заказать консультацию
специалиста 1С
Отправить заявку

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

Синхронные и асинхронные вызовы в 1С: особенности, сравнения

Ретунский Александр Посмотреть все статьи >> Технический архитектор франчайзинговой сети «ИнфоСофт»
11.01.2023
5744
Время прочтения - 5 мин.
Заказать консультацию

Начиная с платформы 8.3.18.1128 переработана технология работы с асинхронными вызовами. В данной статье хочу описать новые асинхронные вызовы и сравнить их с предыдущими на примере функции - Вопрос на клиенте.

Синхронные вызовы - с самых первых версий платформы “1С:Предприятие” в каждом отдельном сеансе программный код, написанный на встроенном языке, исполняется строго последовательно. Это и называется синхронным исполнением программного кода, а соответствующие методы встроенного языка – синхронными.

Интерпретатор встроенного языка получает очередную команду для исполнения, приступает к ее выполнению. Этот процесс занимает какое-то время, после чего возвращается результат. Затем интерпретатор может переходить к следующей команде. И так до тех пор, пока все команды не будут выполнены.

Ранее синхронный вызов выглядел так:

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

 

Данный вызов имеет ограничение на модальность - какой режим стоит в конфигурации по использованию модальности.

Выполнение данного кода выглядит так:

1.png

Функция - Вопрос будет ждать ответа от пользователя, а только после ответа будет выполняться весь последующей код.


Новый асинхронный(синхронный) вызов:

Добавим в пункт 3 команду - Ждать.

Код будет выглядеть следующем образом:

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

 

При такой конструкции код отработает следующем образом:

2.png

Получаем синхронный вызов, который ждет ответа пользователя и дальше выполняет весь код.


Сравнение синхронных вызовов:

Варианты 1 и 2 взаимозаменяемые. На данный момент можно использовать оба варианта. Но предпочтительно использовать второй вариант, т.к. он является современным функционалом в части асинхронного вызова, и можно сразу переходить на написание единого кода для асинхронных и синхронных вызовов.

При новом варианте для пользователя внешне все выглядит так же, как и с использованием модальных окон. Но разработчикам на платформе “1С:Предприятие” пришлось переработать программный код с использованием новых неблокирующих методов, чтобы конфигурация корректно работала в веб-клиенте. А фирме “1С” необходимо было реализовать соответствующие методы в платформе, учитывая требования, диктуемые разработчиками браузеров.

Подпишитесь на дайджест!
Подпишитесь на дайджест, и получайте ежемесячно подборку полезных статей.

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

Асинхронные методы – это такие методы, выполнение которых не происходит синхронно с кодом, из которого они вызваны. В этом случае нет синхронизации по времени между вызывающим и вызываемым кодом. Вызывающий метод не дожидается завершения вызванного метода, а продолжает свое выполнение после вызова асинхронного метода. За счет этого не блокируется основной поток выполнения кода.

Ранее Асинхсинхронный вызов выглядел так:

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

 

Выполнение данного кода выглядит так:

3.png

Весь код процедуры выполнится сразу, а код оповещения выполнится только после ответа пользователя.


Новый Асинхронный вызов:

Функция - ВопросАсинх возвращает ответ нового типа - Обещание:

4.png

 

Код:

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


Сама процедура имеет признак - Асинх.

Выполнение данного кода выглядит так:

5.png

При таком варианте мы получаем асинхронный вариант с возвратом к ожидаем в точке - Ждать.

ВопросАсинх возвращает тип - Обещание.


Сравнение асинхронных вызовов:

Новый (4-й вариант) предпочтителен к использованию по ряду причин:

- Использование таких методов делает код более понятным и простым для анализа и модификации – похожим на код с использованием аналогичных синхронных методов.

- Современные конфигурации по средствам БСП постепенно переходят на второй вариант асинхронного вызова, нужно уже сейчас начинать писать свой код с использованием новых возможностей конфигураций.


Заказать консультацию специалиста 1С
Оставьте заявку и наши эксперты проконсультируют вас по данной статье.
Отправить заявку

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

Рассказать друзьям
Для разработчиков 1С
Вам может быть интересно: