Решение 1 я подробно описал в прошлой записи. Однако, мне не давали покоя некоторые проблемы данного решения.
В частности, способ обновления данных формы объекта после выполнения обработки данных был не универсален или не элегантный. Поэтому штудирование интернета, ИТС документации БСП, в купе с отладчиком — принесло данное решение — делюсь с интернетом!
Решение. Способ 2
Собственно разбираемый далее вариант является более правильным, с точки зрения разработчиков БСП.
1. Начинаем, как положено, с модуля обработки — добавляем экспортную процедуру СведенияОВнешнейОбработке
Тут 2 ключевых момента:
- ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
- …
- НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
Также как и Варианте 1 — появится кнопка
2. Далее, в соответствии с моделью реализации БСП при данном варианте регистрации обработки, будет реализован вызов клиентской процедуры (т.е. процедуры модуля формы &НаКлиенте) «ВыполнитьКоманду«, которая передаст нужный нам контекст (ИдентификаторКоманды, ОбъектыНазначения).
Далее, нужно понять самый важный момент. При вызове формы будет выполнена всего лишь одна процедура ВыполнитьКоманду и после этого обработка будет закрыта.
Но по условиям нашей задачи — этого не достаточно?! Мы планировали поработать с формой, после чего пользователь нажмет кнопку «Обработать».
— Что нам нужно с этим сделать?
— Открыть нашу обработку второй раз, принудительно, уже из процедуры «ВыполнитьКоманду» и передать в нее нужный нам контекст!
Мало того — и это самый главный бонус данного способа решения задачи — после закрытия мы можем отработать событие закрытия и обновить данные самого объекта(!). В нашем примере — это документ «Поступление безналичных денежных средств».
Подводя итог написанному выше:
- При выполнении клиентской процедуры «ВыполнитьКоманду» сохраняем ссылку на открытый ранее объект, которая приходит в виде первого элемента массива: ОбъектыНазначения[0]
- Открываем повторно нашу форму ОткрытьФорму(«ВнешняяОбработка.ЗагрузкаПлатежей2.Форма.пп_ФормаЗагрузки», ….
- ПриСозданииНаСервере — отрабатываем переданный нами контекст. Главное не забыть записать где-то ссылку на обрабатываемый объект
- Для отработки события закрытия нашей формы — добавляем процедуру «ВыполнитьПослеЗакрытия», которая обновит данные формы объекта («Поступление безналичных денежных средств») командой ВладелецФормы.Прочитать()
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
ЗапросПараметров = ОткрытьФорму("ВнешняяОбработка.ЗагрузкаПлатежей2.Форма.пп_ФормаЗагрузки",
Новый Структура("ОбъектыНазначения", ОбъектыНазначения), ОбъектыНазначения[0],,,,Новый ОписаниеОповещения("ВыполнитьПослеЗакрытия", ЭтаФорма));
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ОбъектыНазначения") и Параметры.ОбъектыНазначения <> Неопределено Тогда
ПоступлениеБезналичныхДенежныхСредств = Параметры.ОбъектыНазначения[0];
КонецЕсли;
УстановитьЗначенияНастроекОбработкиФорматаФайлаПоУмолчанию();
Шаг = 0;
УправлениеВидимостьюЭлементов();
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПослеЗакрытия(Результат, Параметры) Экспорт
Если НЕ ВладелецФормы = Неопределено Тогда
ВладелецФормы.Прочитать();
КонецЕсли;
КонецПроцедуры
Команда ВладелецФормы.Прочитать() — которую мы можем выполнить с клиента — самый главный бонус данного способа регистрации.
Собственно сама форма и логика работы с ней — ничем не отличается от Варианта 1. В форме разрабатываем интерфейс работы с файлом и обработчик загрузки. Например, вот такой интерфейс: выбираем файл Excel, читаем его файл в Табличный документ (с COM-объектом при этом не работаем!), далее обрабатываем открытое содержимое и подготавливаем данные для переноса в соответствии с бизнес-требованиями.
После нажатия кнопки выполнить, добавляем команду
Закрыть();
После чего форма будет закрыта, а данные документа — обновлены. Все готово!
Вот собственно и все Решение 2.
Скачать разбираемую обработку можно здесь Скачать