gifts2017

Облегченная функция "СвойстваОбъекта" для управляемых форм

Опубликовал nick-max nick-max (nick-max) в раздел Программирование - Практика программирования

Надоело засорять модули форм мелкими функциями типа ПолучитьВидСкладаНаСервере(Склад)? Пора положить этому конец!

Данная функция предназначена для получения значений свойств объектов любого типа. Поместите ее в общий серверный модуль и вам больше не придется плодить конструкции вроде этой:

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

В функцию передается сам объект и список свойств, значения которых требуется получить. Если список не заполнен, то возвращаются все свойства. Возвращаемое значение является структурой, в которой наименования ключей совпадают с именами реквизитов объекта. Вот текст самой функции:

 

Функция   СвойстваОбъекта(Объект, Знач Свойства = "") Экспорт 	
	Попытка 		
		
		Если Свойства = "" Тогда 
			
			КоллекцияРеквизитов = Объект.Метаданные().Реквизиты;
			КоллекцияСтандартныхРеквизитов = Объект.Метаданные().СтандартныеРеквизиты;

			Для каждого Реквизит из КоллекцияРеквизитов Цикл
Свойства = ?(Свойства = "", Реквизит.Имя, Свойства + ", " + Реквизит.Имя); КонецЦикла; Для каждого СтандартныйРеквизит из КоллекцияСтандартныхРеквизитов Цикл
Свойства = ?(Свойства = "", СтандартныйРеквизит.Имя, Свойства + ", " + СтандартныйРеквизит.Имя); КонецЦикла; КонецЕсли; Структура = Новый Структура(Свойства); ЗаполнитьЗначенияСвойств(Структура, Объект); Возврат Структура; Исключение
Возврат Ложь
КонецПопытки КонецФункции


К свойствам возвращаемого значения можно обращаться через точку, как к ссылке. Например:

Контрагент = СвойстваОбъекта(КонтрагентСсылка);
Сообщить(Контрагент.ОсновнойДоговор);
Сообщить(Контрагент.Родитель);

Номенклатура = СвойстваОбъекта(НоменклатураСсылка, "ТипЦен, НоменклатурнаяГруппа");
Сообщить(Номенклатура.НоменклатурнаяГруппа);
 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. metal doctor (metmetmet) 18.09.13 06:55
А зачем изобретать велосипед, когда в типовых конфигурациях (например БП3.0) в общем модуле ОбщегоНазначения есть функция ЗначенияРеквизитовОбъекта?
2. Эмиль Карапетян (amon_ra) 18.09.13 08:39
(1) metmetmet, не соглашусь. Есть еще нетиповые и кроме того не во всех типовых имеется.
4. Алексей (alsoftik) 18.09.13 08:59
У меня примерно такая же была написана, но еще добавлен поиск по дополнительным свойствам.
5. metal doctor (metmetmet) 18.09.13 08:59
(2) amon_ra, Можно же из типовой скопировать и не придумывать ничего дополнительно.
Конечно использовать типовую функцию или писать самому, выбор исключительно каждого, я лишь хотел отметить что аналогичная функция уже присутствует в типовых конфигурация.
6. Эмиль Карапетян (amon_ra) 18.09.13 09:49
(5) metmetmet, ну, если велосипед хорош, то можно и изобрести главное, что бы велосипед не превращался в в бульдозер с педалями)
7. Алексей Опарихин (Al-X) 18.09.13 09:52
(1) metmetmet, НУ во первых - про них (полезные процедуры и функции) надо знать. Во вторых, у меня несколько самописных конф, в них функции типовых конфигураций не предусмотрены. Да и описанная тут функция немного универсальна, т.к. не надо заполнять обязательный второй параметр (самое того для немного ленивых программистов ;) ).
Но все же думаю лучше бы использовать стандартную функцию. В ней используется запрос "ВЫБРАТЬ РАЗРЕШЕННЫЕ", а это будет правильнее, когда имеются всякие ограничения доступа по полям объектов.
8. nick-max nick-max (nick-max) 18.09.13 10:34
(1)(6)(7)
не знал про ЗначенияРеквизитовОбъекта, сейчас посмотрел ее в типовой бухгалтерии 2.0
Там нет конструкции ВЫБРАТЬ РАЗРЕШЕННЫЕ и второй параметр обязателен к заполнению. Так что можно считать, что я изобрел облегченный велосипед)
9. Алексей Опарихин (Al-X) 18.09.13 11:03
(8) nick-max, это показывает, что так называемые стандартные функции и процедуры в каждой типовой конфигурации как бы НЕМНОГО свои для своей конфы !! (прикольно сказал !!! )
Вроде в БП не используются ограничения доступа на уровне записей, а в УПП во всю... Я смотрел в УПП 1.3.
Но все же стоит использовать "РАЗРЕШЕННЫЕ", хуже не будет.
10. Алексей 1 (AlX0id) 18.09.13 14:32
КоллекцияРеквизитов = Объект.Метаданные().Реквизиты;
КоллекцияСтандартныхРеквизитов = Объект.Метаданные().СтандартныеРеквизиты;

Зачем это вне "Если"?
nick-max; +1 Ответить
11. Сергей Борисов (juntatalor) 20.09.13 10:03
Не все так просто, как кажется.

Во-первых, при многократных вызовах, лучше не обращаться к Метаданные(). В этом плане как раз лучше использовать запрос, как в типовых (кстати, это также гарантирует, что если кто-то изменил объект, пока вы с ним работаете, то вы получите актуальные данные).

Во-вторых, в вашем варианте нельзя (не задав второй параметр) получить РеквизитыАдресации для задач, а также ПризнакиУчета для плана счетов.

В-третьих, для использования Метаданные() у пользователя должны быть определенные права, которые ДАЛЕКО не всегда желательно давать.
12. Арам Айрапетян (banco) 20.09.13 23:26
1. Зачем в "Если Свойства = "" Тогда" опять, в цикле, проверять "Свойства = ?(Свойства = "", Реквизит.Имя, Свойства + ", " + Реквизит.Имя);"
2. также для получения одного реквизита, ты получаешь весь объект из базы целиком, вместе с его табличными частями.
3. открой для себя "Библиотеку стандартных подсистем", сэкономишь много времени
13. Аркадий Кучер (Abadonna) 21.09.13 11:28
(5)
Можно же из типовой скопировать и не придумывать ничего дополнительно.

А ты все типовые сидишь и внимательно изучаешь, чего они там понапихали?
14. metal doctor (metmetmet) 21.09.13 11:44
(13) Abadonna, я лишь подсказал где это уже реализовано, может еще что-то полезное почерпнут из типовых общих модулей. И отвечать мне в хамской манере совершенно не обязательно.
15. Аркадий Кучер (Abadonna) 21.09.13 11:46
(14) metmetmet, кхм... а что тут хамского? на "ты"? так в форумах так обычно принято.
16. Константин Воробьёв (kostik_love) 23.09.13 07:50
(13) Abadonna, все типовые и не нужно- есть конфигурация- "Библиотека стандартных подсистем"- ее как раз таки необходимо и достаточно.
17. Аркадий Кучер (Abadonna) 23.09.13 08:04
(16) kostik_love, дело привычки, но лично мне даже и туда влом лезть... Попадется на глаза - хорошо, не попадется - быстрее самому сварганить. Но, повторюсь - это кому как...
Лично меня еще с 7.7 просто бесит, например, разбор почтового адреса через поиск позиции запятой.
Сразу стал делать Адрес=СтрЗаменить(Адрес,",",Символы.ПС) /8.х/
18. kiruha Дронов (kiruha) 23.09.13 11:04
Удобно конечно - но пропадает смысл ручного разделения на клиентский и серверный код
Если бы в 1С хотели - могли бы все функции реализовать путем вызова серверного кода

Т.е. при большом количестве таких функций вполне потом может быть такой код
//... на клиенте
Контрагент = СвойстваОбъекта(КонтрагентСсылка);
Склад=СвойстваОбъекта(СкладСсылка);
Фирма=СвойстваОбъекта(ОрганизацияСсылка);
Договор=СвойстваОбъекта(ДоговорСсылка);
//....
...Показать Скрыть
19. Dpotapov (Danil.Potapov) 23.09.13 11:36
страшная вещь, так как в случае обращения к любому свойству ссылочного объекта из базы потащится весь объект, в том числе и с табличными частями. Поэтому лучше делать как это реализовано в БСП - через запрос.
20. Антон Степанов (Stepa86) 01.10.13 14:24
1) Если чо, вся функция УстановитьВидимость() должна быть на сервере, а то в одной простой клиентской функции 3 вызова сервера: для получения данных, для получения предопределенного значения и для изменения видимости

2) Давно имею набор модулей, которые реализуют мне методы глРеквизит(), глРеквизиты(), глРеквизитыКэш(), глРеквизитыКэшНаСеанс() - аналог типовой ЗначениеРеквизитаОбъекта(), только с обработкой исключений, возможностью получать через точки, возможностью получать от объекта и еще там чо то...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа