Делаю ДЗ по Гилеву в Базе УТ11.4 (демо).
Есть внешняя обработка подключаемая через БСП. Назначаемая заказу клиента. Тип команды - ВызовКлиентскогоМетода.
Модуль формы обработки:
&НаКлиенте
Перем ЗаказСсылка;
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
Для каждого ЗаказСсылка Из ОбъектыНазначения Цикл
Отбор = Новый Структура("Контрагент",ПолучитьКонтрагентаНаСервере(ЗаказСсылка));
ФормаСпискаРегСведенийПараметры = Новый Структура("Отбор,РежимВыбора,ТолькоПросмотр,МножественныйВыбор",Отбор,Истина,Истина,Ложь);
ОткрытьФорму("РегистрСведений.ШаблоныЗаказовКлиентов.ФормаСписка",ФормаСпискаРегСведенийПараметры,ЭтаФорма);
КонецЦикла;
КонецПроцедуры // ВыполнитьКоманду()
&НаСервереБезКонтекста
Функция ПолучитьКонтрагентаНаСервере(ЗаказСсылка)
Возврат ЗаказСсылка.Контрагент;
КонецФункции // ПолучитьКонтрагентаНаСервере(ЗаказСсылка)
&НаКлиенте
Процедура ВыбратьЭлементРегистра(Команда)
ОбъектыНазначения = Новый Массив;
ОбъектыНазначения.Добавить(СсылкаНаЗаказ);
ВыполнитьКоманду(1,ОбъектыНазначения);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
ШаблонЗаказаСсылка = ПолучитьСсылкуНаЗаказКлиента(ВыбранноеЗначение);
ЗаполнитьЗаказНаСервере(ЗаказСсылка, ШаблонЗаказаСсылка);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьСсылкуНаЗаказКлиента(ВыбранноеЗначение)
Возврат ВыбранноеЗначение.ЗаказКлиента;
КонецФункции // ПолучитьСсылкуНаЗаказКлиента(ВыбранноеЗначение)
&НаСервере
Процедура ЗаполнитьЗаказНаСервере(ЗаказСсылка, ШаблонЗаказаСсылка)
ЗаказОбъект = ЗаказСсылка.ПолучитьОбъект();
//ЗаказОбъект = Документы.ЗаказКлиента.СоздатьДокумент();
ЗаполнитьЗначенияСвойств(ЗаказОбъект,ШаблонЗаказаСсылка,,"Дата,Номер");
//ШаблонЗаказаСсылка = Документы.ЗаказКлиента.ПустаяСсылка();
ЗаказОбъект.Товары.Загрузить(ШаблонЗаказаСсылка.Товары.Выгрузить());
ЗаказОбъект.Записать();
КонецПроцедуры // ЗаполнитьЗаказНаСервере(ЗаказСсылка, ШаблонЗаказаСсылка)
На форме для быстрой отладки разметил реквизит для выбора заказа и кнопку, которая, как видно из кода передает управление в процедуру ВыполнитьКоманду(..)
Отладил обработку при открытии через "файл-->открыть", Все работает, но при открытии как БСПшной внешней обработки из формы документы происходит только открытие формы списка регистра сведений, но в процедуру ОбработкаВыбора, в отличие от открытия обработки через "файл-->открыть", управление не передается. Не могу понять почему.
При открытии как БСПшной внешней обработки из формы документы
добавьте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
Сообщить( ОбъектыНазначения.Количество); Для каждого ЗаказСсылка Из ОбъектыНазначения Цикл
Сообщить(Строка(ЗаказСсылка); Отбор = Новый Структура("Контрагент",ПолучитьКонтрагентаНаСервере(ЗаказСсылка));
Это поможет разобраться а вообще есть ли у вас ОбъектыНазначения, и что там внутри...
Я на самом деле вроде понял, почему не работает.
Если отладчиком бегать, то видно, что ОткрытьФорму работает асинхронно, и после вызова процедуры, сразу отрабатывает следующий за ней код. И тут и случается различие в поведении. Когда обработка отрывается через Файл, то после выполнения кода идущего после ОткрытьФорму, форма остается сущшествовать и поэтому после выбора пользователя элемента в запущенной форме выполнение попадает в процедуру обработчик "ОбработкаВыбора". Но в случае, когда обработка вызывается из формы заказа, то фактически из общего модуля вызывается только одна процедура модуля формы обработки - ВыполнитьКоманду. И соответственно, когда пользователь заканчивает выбор нужного элемента из списка регистра сведений, формы как таковой уже нет и попасть в её процедуру ОбработкаВыбора нельзя.
А вот как сделать так, чтобы все взлетело пока понять не могу. Вернее мысли есть, но все как-то коряво выглядит.
(6) вообще я не думаю. что формы обработки не существует при возврате, но...
Тогда можно изменить обработку с ВызовКлиентскогоМетода на ОткрытиеФормы, и в конце ОбработкаВыбора() прописать Закрыть(). Для пользователя скорее всего не будет даже заметно открытие промежуточной формы.
(9) Да я тоже так попробовал. Но уперся в то, что объекты назначения передаются через параметры открытия, а они существуют только на сервере. То есть фактически единственным местом, где их можно перехватить - это ПриСозданииНаСервере(). И соответственно их надо куда-то сохранить, в реквизит формы скажем. Но это показалось мне слишком накрученным способом, пример то учебный. И кажется не так делаю. Но что-то тоже других мыслей в голову не приходит. Надо попробовать.
(9) Попробовал. Кинул массив из ПриСозданииНаСервере во временное хранилище, получил ПриОткрытии и оттуда вызвал ВыполнитьКоманду. Все работает, но 2 очень больших" НО":
1. После
открывается основное окно и уж потом окно нужного мне регистра. И фокус у основного окна. Наверное этот способ не подходит.
2. После заполнения заказа и закрытия формы в документе не отображаются изменения, приходится делать пересчет руками. Как вернуть из формы обработки указание необходимости обновления формы заказа?
(8) Ошибаетесь насчет расположения процедуры. Я указал выше, что использую "ВызовКлиентскогоМетода". Соответственно, клиентский общий модуль ДополнительныеОтчетыИОбработкиКлиент, получает форму обработки и после этого выполняет её команду. Можно конечно указать у этой процедуры директиву на сервере, но это ничего существенного не меняет. Ну и вроде везде канонично при Вызове клиентского метода делать эту процедуру на клиенте. Как например здесь.
https://infostart.ru/public/558559/