Разное поведение обработки: с отладкой из формы и подключенной как внешняя (БСП)

1. AndrewKop 27.03.19 13:18 Сейчас в теме
Делаю ДЗ по Гилеву в Базе УТ11.4 (демо).
Есть внешняя обработка подключаемая через БСП. Назначаемая заказу клиента. Тип команды - ВызовКлиентскогоМетода.
Модуль формы обработки:
&НаКлиенте
Перем ЗаказСсылка;
	
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
	
	Для каждого ЗаказСсылка Из ОбъектыНазначения Цикл
		Отбор = Новый Структура("Контрагент",ПолучитьКонтрагентаНаСервере(ЗаказСсылка));
		ФормаСпискаРегСведенийПараметры = Новый Структура("Отбор,РежимВыбора,ТолькоПросмотр,МножественныйВыбор",Отбор,Истина,Истина,Ложь);
		ОткрытьФорму("РегистрСведений.ШаблоныЗаказовКлиентов.ФормаСписка",ФормаСпискаРегСведенийПараметры,ЭтаФорма);
	КонецЦикла;
	
КонецПроцедуры // ВыполнитьКоманду()

&НаСервереБезКонтекста
Функция ПолучитьКонтрагентаНаСервере(ЗаказСсылка)
	Возврат ЗаказСсылка.Контрагент;
КонецФункции // ПолучитьКонтрагентаНаСервере(ЗаказСсылка)


&НаКлиенте
Процедура ВыбратьЭлементРегистра(Команда)
	ОбъектыНазначения = Новый Массив;
	ОбъектыНазначения.Добавить(СсылкаНаЗаказ);
	ВыполнитьКоманду(1,ОбъектыНазначения);
КонецПроцедуры


&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	ШаблонЗаказаСсылка = ПолучитьСсылкуНаЗаказКлиента(ВыбранноеЗначение);
	ЗаполнитьЗаказНаСервере(ЗаказСсылка, ШаблонЗаказаСсылка);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьСсылкуНаЗаказКлиента(ВыбранноеЗначение)
	Возврат ВыбранноеЗначение.ЗаказКлиента;
КонецФункции // ПолучитьСсылкуНаЗаказКлиента(ВыбранноеЗначение)

&НаСервере
Процедура ЗаполнитьЗаказНаСервере(ЗаказСсылка, ШаблонЗаказаСсылка)
	ЗаказОбъект = ЗаказСсылка.ПолучитьОбъект();
	//ЗаказОбъект = Документы.ЗаказКлиента.СоздатьДокумент();
	ЗаполнитьЗначенияСвойств(ЗаказОбъект,ШаблонЗаказаСсылка,,"Дата,Номер");
	//ШаблонЗаказаСсылка = Документы.ЗаказКлиента.ПустаяСсылка();
	ЗаказОбъект.Товары.Загрузить(ШаблонЗаказаСсылка.Товары.Выгрузить());
	ЗаказОбъект.Записать();
	
	
КонецПроцедуры // ЗаполнитьЗаказНаСервере(ЗаказСсылка, ШаблонЗаказаСсылка)
Показать


Модуль формы списка регистра:

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ОповеститьОВыборе(ВыбраннаяСтрока);
	СтандартнаяОбработка = Ложь;
КонецПроцедуры


На форме для быстрой отладки разметил реквизит для выбора заказа и кнопку, которая, как видно из кода передает управление в процедуру ВыполнитьКоманду(..)
Отладил обработку при открытии через "файл-->открыть", Все работает, но при открытии как БСПшной внешней обработки из формы документы происходит только открытие формы списка регистра сведений, но в процедуру ОбработкаВыбора, в отличие от открытия обработки через "файл-->открыть", управление не передается. Не могу понять почему.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. AndrewKop 27.03.19 13:23 Сейчас в теме
Для лучшего понимания
Прикрепленные файлы:
3. Дмитрий74Чел 234 27.03.19 14:07 Сейчас в теме
Точно в справочнике внешних обработок залита рабочая версия обработки? Может осталась старая не рабочая?
4. AndrewKop 27.03.19 14:32 Сейчас в теме
(3) Еще раз перепроверил. Закрыл все и заново открыл. Не работает.
5. YannikAlx 43 27.03.19 14:35 Сейчас в теме
При открытии как БСПшной внешней обработки из формы документы
добавьте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
Сообщить( ОбъектыНазначения.Количество);
Для каждого ЗаказСсылка Из ОбъектыНазначения Цикл
Сообщить(Строка(ЗаказСсылка);
Отбор = Новый Структура("Контрагент",ПолучитьКонтрагентаНаСервере(ЗаказСсылка));


Это поможет разобраться а вообще есть ли у вас ОбъектыНазначения, и что там внутри...
7. AndrewKop 27.03.19 14:48 Сейчас в теме
(5) я пользуюсь следующим способом отладки таких внешних БСПшных обработок.
https://forum.infostart.ru/forum29/topic211118/ - ответ в моей теме.
Магия прям, но реально работает.
Bene_Valete; +1 Ответить
6. AndrewKop 27.03.19 14:39 Сейчас в теме
Я на самом деле вроде понял, почему не работает.
Если отладчиком бегать, то видно, что ОткрытьФорму работает асинхронно, и после вызова процедуры, сразу отрабатывает следующий за ней код. И тут и случается различие в поведении. Когда обработка отрывается через Файл, то после выполнения кода идущего после ОткрытьФорму, форма остается сущшествовать и поэтому после выбора пользователя элемента в запущенной форме выполнение попадает в процедуру обработчик "ОбработкаВыбора". Но в случае, когда обработка вызывается из формы заказа, то фактически из общего модуля вызывается только одна процедура модуля формы обработки - ВыполнитьКоманду. И соответственно, когда пользователь заканчивает выбор нужного элемента из списка регистра сведений, формы как таковой уже нет и попасть в её процедуру ОбработкаВыбора нельзя.
А вот как сделать так, чтобы все взлетело пока понять не могу. Вернее мысли есть, но все как-то коряво выглядит.
9. Дмитрий74Чел 234 27.03.19 15:15 Сейчас в теме
(6) вообще я не думаю. что формы обработки не существует при возврате, но...
Тогда можно изменить обработку с ВызовКлиентскогоМетода на ОткрытиеФормы, и в конце ОбработкаВыбора() прописать Закрыть(). Для пользователя скорее всего не будет даже заметно открытие промежуточной формы.
13. AndrewKop 27.03.19 15:22 Сейчас в теме
(9) Да я тоже так попробовал. Но уперся в то, что объекты назначения передаются через параметры открытия, а они существуют только на сервере. То есть фактически единственным местом, где их можно перехватить - это ПриСозданииНаСервере(). И соответственно их надо куда-то сохранить, в реквизит формы скажем. Но это показалось мне слишком накрученным способом, пример то учебный. И кажется не так делаю. Но что-то тоже других мыслей в голову не приходит. Надо попробовать.
14. AndrewKop 27.03.19 16:47 Сейчас в теме
(9) Попробовал. Кинул массив из ПриСозданииНаСервере во временное хранилище, получил ПриОткрытии и оттуда вызвал ВыполнитьКоманду. Все работает, но 2 очень больших" НО":
1. После
ОткрытьФорму("РегистрСведений.ШаблоныЗаказовКлиентов.ФормаСписка",ФормаСпискаРегСведенийПараметры,ЭтаФорма);
открывается основное окно и уж потом окно нужного мне регистра. И фокус у основного окна. Наверное этот способ не подходит.
2. После заполнения заказа и закрытия формы в документе не отображаются изменения, приходится делать пересчет руками. Как вернуть из формы обработки указание необходимости обновления формы заказа?
8. YannikAlx 43 27.03.19 14:48 Сейчас в теме
Форма ваша , которая для отладки вообще не участвует в нормальном режиме - ее как бы нет вообще и выполняется

&НаСервере
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт

Но у вас почему-то эта процедура на клиенте... да еще наверное в вашей форме, а должна быть в модуле объекта
Ясно поэтому и не работает
10. AndrewKop 27.03.19 15:17 Сейчас в теме
(8) Ошибаетесь насчет расположения процедуры. Я указал выше, что использую "ВызовКлиентскогоМетода". Соответственно, клиентский общий модуль ДополнительныеОтчетыИОбработкиКлиент, получает форму обработки и после этого выполняет её команду. Можно конечно указать у этой процедуры директиву на сервере, но это ничего существенного не меняет. Ну и вроде везде канонично при Вызове клиентского метода делать эту процедуру на клиенте. Как например здесь.
https://infostart.ru/public/558559/
Прикрепленные файлы:
12. YannikAlx 43 27.03.19 15:21 Сейчас в теме
(10) Да я погорячился. Не увидел "ВызовКлиентскогоМетода"...
11. Дмитрий74Чел 234 27.03.19 15:17 Сейчас в теме
(8) в случае "Тип команды - ВызовКлиентскогоМетода" - ВыполнитьКоманду() как раз НаКлиенте должна быть.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот