Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Как создать собственную асинхронную процедуру в 1С?

#1с #асинхронность


В 1С есть возможность использования встроенных асинхронных вызовов с помощью описания
оповещения. Мне необходимо "обернуть" несколько асинхронных вызовов в один свой, так
чтобы со стороны основного кода выполнялся всего один такой вызов.

Можно ли создать свои асинхронные методы и как? 
    


Ответы

Ответ 1



Доброго времени суток, платформа «1С:Предприятие 8» не дает возможности реализовывать свои асинхронные процедуры и функции. Реализовать асинхронную обработку ("обернуть"), все-таки, возможность есть, с помощью процедуры: ВыполнитьОбработкуОповещения(<ВыполняемоеОповещение>, <Результат>) Этот метод используется для того, чтобы выполнить процедуру обработчика оповещения. Чтобы указать на этот обработчик, в метод передаётся описание оповещения. Этот метод требуется в сложных «многоуровневых» алгоритмах асинхронных вызовов, так как описание оповещения может быть сконструировано в начале алгоритма, а реальное использование этого обработчика может понадобиться через несколько вложенных процедур. Пример: Вопрос во вложенной процедуре, после которой есть код Рассмотрим более сложный случай, когда после вызова вложенной функции выполнятся некоторый код. Например, так: Казалось бы, следуя рекомендациям, надо просто заменить вложенную процедуру двумя процедурами: Однако в этом случае алгоритм, следующий за вызовом вложенной процедуры, будет выполнен ещё до того, как пользователь ответит на вопрос. Ведь, как мы знаем, исполнение кода не останавливается после выполнения блокирующего метода (Сравнение модального и немодального режимов работы): Поэтому в такой ситуации нужно не только использовать блокирующий метод с вызовом оповещения, но ещё и выполнять асинхронный вызов самой вложенной процедуры, также используя оповещение: Здесь во вложенную процедуру мы сразу передаём описание оповещения, в котором содержится тот код, который должен быть выполнен после вложенной процедуры (последняя процедура). Вызывая блокирующий метод, мы передаём ему «его» описание оповещения (ВложеннаяПроцедураЗавершение), а также, через дополнительные параметры, то описание оповещения, которое нужно будет выполнить после того, как будут обработаны интерактивные действия пользователя (ОбработкаКомандыЗавершение). (Источник) P.S. Необходимо помнить, что при работе с синхронными вызовами значения передаются по Ссылке (в синхронные процедуры и функции), а при асинхронных вызовах по Значению. Пример: Вопрос в обработчике формы ПередЗакрытием Особенность диалога с пользователем в этом (и многих других) обработчиках заключается в том, что в зависимости от реакции пользователя принимается решение: продолжать дальнейшие действия, или отказаться от них. Для этого используется параметр процедуры Отказ. При одном ответе пользователя мы отказываемся от продолжения (Отказ = Истина). При другом ответе пользователя - продолжаем дальнейшие действия. В данном случае сложность заключается в том, что ответ пользователя мы узнаем уже после того, как выйдем из контекста этого обработчика. В процедуре, обрабатывающей оповещение. А параметр Отказ нужно установить именно в этом обработчике. Поэтому мы действуем в два приёма: В первый раз безусловно отменяем дальнейшие действия (Отказ = Истина) и выводим вопрос пользователю; В обработчике оповещения, в зависимости от реакции пользователя, либо снова программно закрываем форму, либо ничего не делаем. Проблема заключается в том, что обработчик ПередЗакрытием будет выполнен два раза. И чтобы отличить первое его выполнение от второго (когда ответ пользователя уже известен) мы используем клиентскую переменную ВыполняетсяЗакрытие в качестве флага. В первый проход её значение равно Ложь, и это значит, что нужно отказаться от закрытия и задать вопрос. Во второй проход её значение равно Истина, и это значит, что вопрос задавать не надо: (Источник)

Ответ 2



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

Комментариев нет:

Отправить комментарий