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