Доброго времени.
Разрабатываю интеграцию с гос.системой. Для отправки запросов каждый из них нужно подписать ЭЦП. С этим проблем нет, когда запрос один. Трабл возникает, когда пытаешься отправить поочередно несколько запросов. Вот созданная простая конструкция из трех процедур:
---------------------------
Процедура Старт(Кнопка)
Для каждого ТекСтр Из Партии Цикл
ПодписатьДокумент(ТекСтр);
КонецЦикла;
КонецПроцедуры
Процедура ПодписатьДокумент(ТекСтр)
...............
ОбработчикПродолжения = Новый ОписаниеОповещения("ВыполнитьЗапрос", ЭтаФорма, ПараметрыВыполнения);
ЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных, ЭтаФорма, ОбработчикПродолжения);
КонецПроцедуры
Процедура ВыполнитьЗапрос()
.....................
КонецПроцедуры
Показать
---------------------------
В процессе выяснилось, что процедура подписания ЭлектроннаяПодписьКлиент.Подписать() (типовая из БСП) начинает выполняться только после полного завершения процедуры "Старт". То есть цикл из первой процедуры "Старт" полностью выполняется еще до того, как самый первый запрос будет подписан и выполнен. Странное поведение.
Подозреваю, что проблема кроется в стандартном ЭлектроннаяПодписьКлиент.Подписать(), это где-то там система откладывает исполнение "на потом". Но пошаговый просмотр выполнения этой процедуры не помог мне найти то самое место.
Как заставить систему полностью отрабатывать процедуры "ПодписатьДокумент" и "ВыполнитьЗапрос" прежде, чем переходить к следующему шагу цикла Старт?
Или как еще можно заставить систему выполнить поочередно несколько запросов?
Кто-нибудь сталкивался?
Обычное асинхронное выполнение, встречается везде и постоянно в конфигурациях на управляемых формах, на что намекает как минимум наличие описания оповещения.
Странно, что не сталкивались с таким, но вот, почитайте https://infostart.ru/1c/articles/1949527/ Гарантированно завершена подпись одного документа при попадании в ВыполнитьЗапрос() - это процедура, которая будет вызвана при завершении подписи.
Соответственно нужно переписать ваши вызовы таким образом, чтобы вызов подписи следующего документа происходил в ВыполнитьЗапрос().
Прокинуть массив можно через ДополнительныеПараметры обработчика оповещения, почитайте про это
Обычное асинхронное выполнение, встречается везде и постоянно в конфигурациях на управляемых формах, на что намекает как минимум наличие описания оповещения.
Странно, что не сталкивались с таким, но вот, почитайте https://infostart.ru/1c/articles/1949527/ Гарантированно завершена подпись одного документа при попадании в ВыполнитьЗапрос() - это процедура, которая будет вызвана при завершении подписи.
Соответственно нужно переписать ваши вызовы таким образом, чтобы вызов подписи следующего документа происходил в ВыполнитьЗапрос().
Прокинуть массив можно через ДополнительныеПараметры обработчика оповещения, почитайте про это
(2) Да, решил по предложенному вами пути.
Немного сломал голову в логике учета обработанных строк. Но, вроде, корректно работает.
Спасибо за направление!
(2) К сожалению (или счастью :)) до этого времени сталкивался с УФ опосредованно. Это первая "серьезная" встреча с ними.
Асинхронное поведение предполагал, но явно об этом не знал. Спасибо за наводку.
Попробовал через Ждать, но тоже не получилось.
Придется, видимо, двигаться по вашему маршруту - в процедуре "ВыполнитьЗапрос()" через доп.параметры как-то определять что именно делать: выполнять запрос или переходить к следующему подписанию.
Спасибо за подробный коммент.