gifts2017

Передача параметров в управляемые и обычные формы

Опубликовал Дмитрий Семионенко (tur0k) в раздел Программирование - Практика программирования

Данная статья описывает, как штатными средствами передать в качестве параметра значение при открытии управляемой формы 8.2 в сравнении с тем, как аналогичную операцию получалось реализовать в обычных формах.

 Как передаются параметры в обычных формах

В обычных формах для передачи параметра было 2 возможности:

  1. менее распространенный способ:  в форме объекта на вкладке «Реквизиты» добавлялся реквизит, при необходимости определялся доступ визуальными средствами
  2. более распространенный способ: в модуле формы объявлялась экспортная переменная и в обработчике «ПередОткрытием» значение обрабатывалось

в обоих случаях вызов формы выглядел примерно так:

Форма = Объект.ПолучитьФорму("ФормаВыбора",ВладелецФормы, КлючУникальности);
Форма.Параметр = ЗначениеПараметра;
Форма.Открыть();

 

Как передаются параметры в управляемых формах

В управляемых формах теперь есть возможность сразу передавать параметры при получении формы. Параметры передаются в виде структуры:

 

Параметры = Новый Структура("ТекущееЗначение",ПоследнийЭлемент);
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);
НайденыйЭлемент = ФормаВыбора.ОткрытьМодально();

Также у управляемой формы появились «расширения формы» (объект, справочник, документ, отчет). В зависимости от типа объекта определяется состав доступных параметров.  Например, если в форме выбора справочника нужно позиционироваться на определенном элементе, то используется параметр «ТекущееЗначение». Большим плюсом является, что в самой форме не требуется писать обработчиков для предопределенных параметров, сокращает количество кода.

Также у разработчика появилась возможность определять свои параметры (в конструкторе управляемой формы вкладка «Параметры»). Время жизни параметров ограничено обработчиком ПриСозданииНаСервере, что логично т.к. параметры требуются только при создании формы, но если данный параметр определяет уникальность формы (установлен флаг «ключевой параметр» в свойствах параметра) он будет доступен и в других обработчиках.

Для передачи специфического параметра манипуляций требуется сделать немного больше:

  1. Определить в управляемой форме параметр.

В обработчике ПриСозданииНаСервере определить обработку данного параметра (обращение к переданным параметрам через свойство «Параметры», имеющее тип ДанныеФормыСтруктура)

  1. Описать получение формы и передать значение нового параметра в параметрах функции ПолучитьФорму.

Таким образом код будет иметь вид:

  • В месте получения формы 

 

Параметры = Новый Структура("НовыйПараметр",ПоследнийЭлемент);
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);

  • В модуле управляемой формы  

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

Заключение

Возможно данная статья кому-то пригодится, с экономит время и убережет от лишнего кода. Для более детальной информации о полном списке параметров управляемой формы рекомендуется посмотреть  справку «Интерфейс управляемый \ Управляемая форма».

 

 

Скачать файлы

Наименование Файл Версия Размер
Передача параметров в управляемые и обычные формы 490
.pdf 322,86Kb
01.07.11
490
.pdf 322,86Kb Бесплатно

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Василий Демидов (Душелов) 01.07.11 06:17
Все прекрасно в ЖКК 8.2 описано. Зачем эта "статья"?
2. Сергей Ожерельев (Поручик) 01.07.11 08:12
Для владельцев ПО, скачанного с новы или руборда. Откуда у них желто-красная кожура.
3. Александр Медведев (anig99) 01.07.11 09:06
(2) с новы или руборда. ЖКК есть и там.
4. Dmitiry (ndacoder) 01.07.11 09:41
5. Александр Медведев (anig99) 01.07.11 09:48
(4) желто-красная книжка
6. Dmitiry (ndacoder) 01.07.11 10:10
и что все пользователи лицензии это читают ?
а кто покупал ещё платформу 8.0 у них там про 8.2 много есть :D
fzt; r2d255; +2 1 Ответить 2
7. Александр Медведев (anig99) 01.07.11 10:33
(6) читают. там много интересного. А кто покупал 8.0 - юзают ИТС и описание платформы. Ну или качают эти же книжки в pdf.
8. Дмитрий Елисеев (w-divin) 01.07.11 11:04
Может и фигня, но мне с пол года назад такая статья пригодилась бы )))
посему плюсанул
9. DERL (DERL) 01.07.11 11:04
чоза желто-красная книжка? 1С: Предприятие 8.2 Рук-во разработчика в 2 частях??
10. Александр Медведев (anig99) 01.07.11 11:16
(9) Вся техническая документация от самой 1с издается в едином оформлении желто-красных книжек.
11. Алексей Константинов (alexk-is) 01.07.11 12:45
ЖКК (желто-красные книжки) это пережиток прошлого, когда документация фирмы 1С по 1С:Предприятию 7.7 была выполнена в едином цветовом решении и обложки действительно были желто-красные. С выходом 1С:Предприятия 8.х цветовая схема оформления обложек изменилась в сторону желтого. Конечно при желании можно найти красный цвет на обложке документации для 1С:Предприятия 8.х, но цветовая гамма сместилась к желто-коричневому, что на аббревиатуре ЖКК не скажется. :) Собственно под ЖКК следует понимать весь пакет документации, входящий в пакет разработчика, который можно приобрести по одному на каждого аттестованного специалиста.
MasterTonLab; 4rtehouse; DERL; +3 Ответить
12. DERL (DERL) 01.07.11 12:49
alexk-is пишет:

ЖКК (желто-красные книжки) это пережиток прошлого, когда документация фирмы 1С по 1С:Предприятию 7.7 была выполнена в едином цветовом решении и обложки действительно были желто-красные. С выходом 1С:Предприятия 8.х цветовая схема оформления обложек изменилась в сторону желтого. Конечно при желании можно найти красный цвет на обложке документации для 1С:Предприятия 8.х, но цветовая гамма сместилась к желто-коричневому, что на аббревиатуре ЖКК не скажется. Собственно под ЖКК следует понимать весь пакет документации, входящий в пакет разработчика, который можно приобрести по одному на каждого аттестованного специалиста.

а можно узнать какие именно книжки входят в пакет документации разработчика?
13. Александр Медведев (anig99) 01.07.11 13:56
(12) Например.
Описание встроенного языка
Конфигурирование и администрирование
Руководство администратора
...описание самой конфы...
Руководство пользователя
14. Алексей Роза (DoctorRoza) 03.07.11 13:31
Статья. конечно, не претендует на "Золотой Грамофон" .. :) .. но за труды и, так сказать, дадим в долг лишний плюс! ;)
15. mc2 06.07.11 12:12
Нет параметра формы "ТекущееЗначение" в форме справочника. Есть параметр "ТекущаяСтрока". Релиз 13.
Может это в 14-ом появилось?
16. bulpi bulpi (bulpi) 06.07.11 16:46
Уж если писать СТАТЬЮ, то нужно описывать проблемы полнее. Например, о том, как передать в управляемую форму таблицу значений.
MasterTonLab; creatermc; rpgshnik; manu; ekaterinaeon; sergio199; Allechka; fzt; brunen9; Downkey; +10 1 Ответить
17. Аркадий Кучер (Abadonna) 09.07.11 08:04
(6)
и что все пользователи лицензии это читают ?

Гениальный вопрос!!! Поглядел, у автора вопроса рейтинг 65, ему уже не надо, чтобы качать спокойно.
Так что совет новичкам: берете абзац с ЖКК (лучше с электронной версии - скопипастить можно) и публикуете ТУТ статью.
Две-три таких, и заветные 30 баллов в кармане.
fzt; artbear; +2 Ответить
18. Алексей Захаров (almas) 06.08.11 16:59
:D Привет. Спасибо за статью. Будет очень полезно если вы сможете дополнить данную статью ситуацией, когда необходимо программно создать
новый элемент справочника, но при этом окрыть на редактирование пользователю не основную форму элемента, а форму№2 несколько отличную от основной формы.

Для чего такая заморочка, для примера справочник контрагенты и в зависимости от типа контрагента необходимо совершенно по разному обрабатывать различные события на форме.
19. Alex Steiner (OrsoBear) 10.02.12 16:23
Благодарю. Не мог понять, почему не работает, оказалось, еще параметр в форме задавать нужно.. Попробовал, получилось! А на счет ЖКК, мне проще в поиске найти, чем по ЖКК шариться, тем более, они в другом корпусе лежат, и часто заняты.
20. apalon_pss (pavel_pss) 15.02.12 12:29
21. Егор Курицын (pokpokpok100) 24.02.12 10:15
Реально такая статья очень нужна была в свое время, чем их больше тем лучше
22. a_l_e_xj Волков (a_l_e_xj) 13.06.12 14:48
Ниочёмная статья. Если у вас не заладилось с передачей параметров, эта статья ничего не даст. Наверное она написана чтоб хоть что то опубликовать.
23. Леван Иремадзе (IRLes) 08.10.12 17:15
Вопрос к профессионалам или просто знающим людям.
Цель - открыть форму с заполненными реквизитами (какими, я определяю сам)
Ограничения - ничего не изменять в модулях форм, объектов
Последовательность действий:
1. Открываем форму списка с отбором по переданным реквизитам
2. При нажатии на кнопку Добавить открывается объект с заполненными реквизитами

Что-то никак в голову не придет как это можно организовать :(
25. Lena Denysuyk (Pechenuych_ka) 27.02.13 14:22
А я от мучилась с обычными формами,никак не могла понять что не так делаю..спасибо
26. Валерий (vs33) 06.05.13 17:18
А помогла статейка-то. Все таки передача параметров в обычные формы сделана неочевидно (точнее вообще не сделана на уровне объектов). Вот в управляемых уже допилили.
ПС: ЖКК читают только австралопитеки. там таким страшным языком написано...
27. sumixam (sumixam) 14.11.13 23:50
Может кто что нет так делаю надо получит документ из формы выбора в документ основание
выдает ошибку
ТипДок = ЭлементыФормы.ЖурналДокументовСписок.ТекущаяСтрока.ТипДокумента;
Попытка
ОбъектЭДО = ЭлементыФормы.ЖурналДокументовСписок.ТекущаяСтрока.Ссылка.Получитьобъект();
Исключение
Сообщить("Не удалось получить объект - строку журнала");
КонецПопытки;
ОбъектЭДО.ДокументОснование = Неопределено;
ФормаСписка = Документы[ТипДок].ПолучитьФормуВыбора("ФормаВыбора",ЭтаФорма);
ФормаСписка.Открыть();
ОбъектЭДО.ДокументОснование = ФормаСписка.Ссылка;
ОбъектЭДО.Записать(РежимЗаписиДокумента.Запись);
28. Дмитрий Семионенко (tur0k) 15.11.13 09:20
(27) sumixam,
т.к. в управляемых формах передача контекста с клиента на сервер и обратно, то общий алгоритм будет примерно такой:
в основной форме обработки
&НаКлиенте
Процедура ВыбратьВоВнешнейФорме(Команда)
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("АдресХранилища",АдресХранилища);
    	
	Результат = ОткрытьФормуМодально(Объект.ПутьКФормам+".ФормаВыбора",ПараметрыФормы,ЭтаФорма);
	Если Результат<>Неопределено Тогда
		ОбработатьНаСервере();
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ОбработатьНаСервере()

	СтруктураЗначений = ПолучитьИзВременногоХранилища(АдресХранилища);
	//Проверки на корректность формата переданных параметров
	Если ТипЗнч(СтруктураЗначений)<>Тип("Структура") Тогда
		Отказ = Истина;
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ЭтаФорма.ИмяФормы+"[ЗагрузитьЗначенияЗамены] ожидается структура значений";
		Сообщение.Сообщить();
		Возврат;
	КонецЕсли;
	Значение = Неопределено;
	Если Не СтруктураЗначений.Свойство("ЗначенияВыбора",Значение) Тогда
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ЭтаФорма.ИмяФормы+"[ЗагрузитьОбработатьНаСервере] в структуре значений ожидается значение с ключем ""ЗначенияВыбора""";
		Сообщение.Сообщить();
        Иначе
                //Обработка полученного значения
	КонецЕсли;
КонецПроцедуры // ОбработатьНаСервере()
...Показать Скрыть


В форме выбора код будет выглядеть примерно так:
&НаКлиенте
Процедура ПеренестиРезультат(Команда)
        ТекущиеДанные = ЭлементыФормы.СписокВыбора.ТекущиеДанные;
        
        // возможно передать произвольные серриализуемые данные, но обернуть в вызов НаСервере
	СтруктураЗначений = Новый Структура;
	СтруктураЗначений.Вставить("ЗначенияВыбора",ТекущиеДанные.Ссылка);		
        ПоместитьВоВременноеХранилище(СтруктураЗначений,Параметры.АдресХранилища);
        
        Закрыть("ОК"); //в простейшем случае можно передать значение здесь
КонецПроцедуры
...Показать Скрыть

P.S.Опять же никто не запрещает пользоваться тем что форма выбора возвращает значение :)
29. Дмитрий Семионенко (tur0k) 15.11.13 09:22
(27) sumixam,
т.к. в управляемых формах передача контекста с клиента на сервер и обратно, то общий алгоритм будет примерно такой:
в основной форме обработки
&НаКлиенте
Процедура ВыбратьВоВнешнейФорме(Команда)
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("АдресХранилища",АдресХранилища);
    	
	Результат = ОткрытьФормуМодально(Объект.ПутьКФормам+".ФормаВыбора",ПараметрыФормы,ЭтаФорма);
	Если Результат<>Неопределено Тогда
		ОбработатьНаСервере();
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ОбработатьНаСервере()

	СтруктураЗначений = ПолучитьИзВременногоХранилища(АдресХранилища);
	//Проверки на корректность формата переданных параметров
	Если ТипЗнч(СтруктураЗначений)<>Тип("Структура") Тогда
		Отказ = Истина;
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ЭтаФорма.ИмяФормы+"[ЗагрузитьЗначенияЗамены] ожидается структура значений";
		Сообщение.Сообщить();
		Возврат;
	КонецЕсли;
	Значение = Неопределено;
	Если Не СтруктураЗначений.Свойство("ЗначенияВыбора",Значение) Тогда
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ЭтаФорма.ИмяФормы+"[ЗагрузитьОбработатьНаСервере] в структуре значений ожидается значение с ключем ""ЗначенияВыбора""";
		Сообщение.Сообщить();
        Иначе
                //Обработка полученного значения
	КонецЕсли;
КонецПроцедуры // ОбработатьНаСервере()
...Показать Скрыть

В форме выбора код будет выглядеть примерно так:
&НаКлиенте
Процедура ПеренестиРезультат(Команда)
        ТекущиеДанные = ЭлементыФормы.СписокВыбора.ТекущиеДанные;
        
        // возможно передать произвольные серриализуемые данные, но обернуть в вызов НаСервере
	СтруктураЗначений = Новый Структура;
	СтруктураЗначений.Вставить("ЗначенияВыбора",ТекущиеДанные.Ссылка);		
        ПоместитьВоВременноеХранилище(СтруктураЗначений,Параметры.АдресХранилища);
        
        Закрыть("ОК"); //в простейшем случае можно передать значение здесь
КонецПроцедуры
...Показать Скрыть

P.S.Опять же никто не запрещает пользоваться тем что форма выбора возвращает значение :)
Прикрепленные файлы:
30. Дмитрий Семионенко (tur0k) 15.11.13 09:23
31. Константин Куликов (Светлый ум) 19.11.13 12:59
Ужасно код оформил, абсолютно не читабельно.
32. Константин Мальков (Kasatin79) 20.02.14 16:46
Нормальная статья, спасибо.
А по поводу передачи таблицы значений... в структуру или соответствие значение колонок по каждой строке передавайте, а строки в список складывайте. А на форме обратно обычным перебором списка. Тут вроде ни чего сложного.
33. Николай Ярыгин (Nixkonor) 23.04.14 12:39
(23) IRLes,

Типа так

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



Но вот есть таблица Товары на форме - с ней затык. Точнее есть выход конечно через преобразование в объект, но тогда вышеуказанная схема видится мне неполноценной.
34. Виталий Онянов (Tavalik) 14.08.14 08:20
35. Alex Steiner (OrsoBear) 24.11.14 09:24
И снова поиском занесло на эту статью.Увидел, что ранее уже оставлял комментарий.
Уж простите писатели документации.
Но книги Радченко и ЖКК покрылись пылью.
Куда проще и оперативнее найти ответ через сеть.
Да и многочисленные баллы и благодарности говорят о том, что такие статьи пользуются спросом.
Автора еще раз благодарю.
36. Николай Степанов (Tapochki-tmn) 18.06.15 11:00
Помогло, когда заплутал в различных реализациях передачи параметров для управляемых форм и обычных.
Любители посылать в книжки - идите туда сами. Не встречал книжек по 1С, где одновременно приводился бы синтаксис для обычных и управляемых форм.
Мало читал ?
37. Осипов Сергей (fixin) 22.10.15 01:00
лично мне пригодилось,че
38. Андрей Кокконен (skyadmin) 16.11.16 13:14
А как передать параметры в уже открытую управляемую форму, когда не ПриСозданииНаСервере, а ПриПовторномОткрытии отрабатывается?