v8: Получение списка свойств и событий объекта
К сожалению, в 1С невозможно получить список свойств и событий объекта. Данная статья призвана восполнить этот печальный пробел. Стыдитесь, товарищ Нуралиев. Не все типы объектов я расписал, буду благодарен, если вы допишете и восполните пробелы. | Автор статьи: Гений 1С | Редакторы: TormozIT, Camino Последняя редакция №19 от 01.09.06 URL: |
Ключевые слова: элемент управления, событие, свойство
Список функций:
• п_СписокСвойствЭлементаУправления - получаем список свойств элемента управления в структуру.
• п_СвойстваЭлементаУправления - получаем список свойств и их значений элемента управления в структуру.
• п_СписокСобытийЭлементаУправления - получаем список событий элемента управления в структуру.
• п_СобытияЭлементаУправления- получаем список событий и их значений элемента управления в структуру.
Функция п_СписокСвойствЭлементаУправления(Элемент) Экспорт Перем Рез; Если ТипЗнч(Элемент)=Тип("Кнопка") Тогда Рез=Новый Структура("ВертикальноеПоложение,ГоризонтальноеПоложение,Доступность,Заголовок,Картинка,Кнопки,МногострочныйРежим,Подсказка,ПоложениеКартинки,РазмерКартинки,РежимМеню,СочетаниеКлавиш,ЦветРамки,ЦветТекстаКнопки,ЦветФонаКнопки,Шрифт"); ИначеЕсли ТипЗнч(Элемент)=Тип("КоманднаяПанель") Тогда Рез=Новый Структура("АвтоЗаполнение,Вспомогательная,ВыравниваниеКнопок,Доступность,Кнопки,Ориентация,Подсказка,ПрозрачныйФон,Рамка,ЦветРамки,ЦветТекстаКнопки,ЦветФона,ЦветФонаКнопки,Шрифт"); ИначеЕсли ТипЗнч(Элемент)=Тип("Надпись") Тогда Рез=Новый Структура("БегущаяСтрока,ВертикальноеПоложение,ВыделятьОтрицательные,ГиперСсылка,ГоризонтальноеПоложение,Доступность,Заголовок,Картинка,Подсказка,ПоложениеКартинкиНадписи,ПрозрачныйФон,РазмерКартинки,Рамка,СочетаниеКлавиш,Формат,ЦветРамки,ЦветТекста,ЦветФона,Шрифт"); ИначеЕсли ТипЗнч(Элемент)=Тип("Панель") Тогда Рез=Новый Структура("АвтоПорядокОбхода,Доступность,Картинка,ОтображениеЗакладок,Подсказка,ПорядокОбхода,ПрозрачныйФон,РазмерКартинки,Рамка,РаспределятьПоСтраницам,РежимПрокручиваемыхСтраниц,Страницы,ТекущаяСтраница,ЦветРамки,ЦветТекста,ЦветФона,Шрифт"); ИначеЕсли ТипЗнч(Элемент)=Тип("Переключатель") Тогда Рез=Новый Структура("ВертикальноеПоложение,ВыбираемоеЗначение,ГоризонтальноеПоложение,Доступность,Заголовок,Подсказка,ПоложениеЗаголовка,ПрозрачныйФон,Рамка,ЦветРамки,ЦветТекста,ЦветТекстаПоля,ЦветФона,ЦветФонаПоля,Шрифт"); ИначеЕсли ТипЗнч(Элемент)=Тип("ПолеВвода") Тогда Рез=Новый Структура("АвтоВыборНезаполненного,АвтоОтметкаНезаполненного,АвтоПереносСтрок,ВертикальноеПоложение,ВыбиратьТип,ВыборНезаполненного,ВыделенныйТекст,ВыделятьОтрицательные,ВысотаСпискаВыбора,ГоризонтальноеПоложение,Доступность,Картинка,КартинкаКнопкиВыбора,КнопкаВыбора,КнопкаОткрытия,КнопкаОчистки,КнопкаРегулирования,КнопкаСпискаВыбора,МаксимальноеЗначение,Маска,МинимальноеЗначение,МногострочныйРежим,ОграничениеТипа,ОтметкаНезаполненного,Подсказка,ПрозрачныйФон,Рамка,РасширенноеРедактирование,РедактированиеТекста,РежимВыбораИзСписка,РежимВыбораНезаполненного,РежимПароля,СочетаниеКлавиш,СписокВыбора,ТолькоПросмотр,Формат,ЦветРамки,ЦветТекстаКнопки,ЦветТекстаПоля,ЦветФонаКнопки,ЦветФонаПоля,ШиринаСпискаВыбора,Шрифт,ЭлементСвязиПоТипу"); ИначеЕсли ТипЗнч(Элемент)=Тип("ПолеСписка") Тогда Рез=Новый Структура("Доступность,ОтображатьКартинку,ОтображатьПометку,Подсказка,Рамка,ТекущаяСтрока,ТолькоПросмотр,ЦветРамки,ЦветТекстаПоля,ЦветФонаПоля"); ИначеЕсли ТипЗнч(Элемент)=Тип("ПолеТабличногоДокумента") Тогда Рез=Новый Структура("ВертикальнаяПолосаПрокрутки,ГоризонтальнаяПолосаПрокрутки,Доступность,ОтображатьВыделение,РазрешитьНачалоПеретаскивания,РазрешитьПеретаскивание,Рамка,ЦветРамки"); ИначеЕсли ТипЗнч(Элемент)=Тип("РамкаГруппы") Тогда Рез=Новый Структура("Доступность,Заголовок,Подсказка,ПрозрачныйФон,Рамка,ЦветРамки,ЦветТекста,ЦветФона,Шрифт"); Иначе Рез=Новый Структура(); КонецЕсли; Рез.Вставить("Видимость"); Рез.Вставить("ИзменяетДанные"); Рез.Вставить("ПервыйВГруппе"); Рез.Вставить("ПропускатьПриВводе"); Рез.Вставить("ТипЗначения"); //Опасные значения Рез.Вставить("Данные"); Рез.Вставить("Значение"); Рез.Вставить("Имя"); Рез.Вставить("КнопкаПоУмолчанию"); Рез.Вставить("ИсточникДействий"); Рез.Вставить("КонтекстноеМеню"); Рез.Вставить("Лево"); Рез.Вставить("Высота"); Рез.Вставить("Верх"); Рез.Вставить("ТипЗначения"); Рез.Вставить("Подсказка"); Рез.Вставить("ПорядокОбхода"); Рез.Вставить("ПорядокОтображения"); Рез.Вставить("ПрозрачныйФон"); Рез.Вставить("Рамка"); Рез.Вставить("Свертка"); Рез.Вставить("Ширина"); Возврат Рез; КонецФункции Функция п_СвойстваЭлементаУправления(Элемент) Экспорт Рез=п_СписокСвойствЭлементаУправления(Элемент); ЗаполнитьЗначенияСвойств(Рез, Элемент); Возврат Рез; КонецФункции Функция п_СписокСобытийЭлементаУправления(Элемент) Экспорт Перем Рез; Если ТипЗнч(Элемент)=Тип("Кнопка") Тогда Рез=Новый Структура("Нажатие"); ИначеЕсли ТипЗнч(Элемент)=Тип("КоманднаяПанель") Тогда Рез=Новый Структура(""); ИначеЕсли ТипЗнч(Элемент)=Тип("Надпись") Тогда Рез=Новый Структура("Нажатие"); ИначеЕсли ТипЗнч(Элемент)=Тип("Панель") Тогда Рез=Новый Структура("ПриСменеСтраницы"); ИначеЕсли ТипЗнч(Элемент)=Тип("Переключатель") Тогда Рез=Новый Структура("ПриИзменении"); ИначеЕсли ТипЗнч(Элемент)=Тип("ПолеВвода") Тогда Рез=Новый Структура("АвтоПодборТекста,НачалоВыбора,НачалоВыбораИзСписка,ОбработкаВыбора,ОкончаниеВводаТекста,Открытие,Очистка,ПриИзменении,Регулирование"); ИначеЕсли ТипЗнч(Элемент)=Тип("ПолеСписка") Тогда Рез=Новый Структура("Выбор,ПриАктивизацииСтроки,ПриИзмененииФлажка"); ИначеЕсли ТипЗнч(Элемент)=Тип("ПолеТабличногоДокумента") Тогда Рез=Новый Структура("Выбор,НачалоПеретаскивания,ОбработкаРасшифровки,ОкончаниеПеретаскивания,Перетаскивание,ПриАктивизацииОбласти,ПриИзмененииСодержимогоОбласти,ПроверкаПеретаскивания"); ИначеЕсли ТипЗнч(Элемент)=Тип("РамкаГруппы") Тогда Рез=Новый Структура(""); Иначе Рез=Новый Структура(); КонецЕсли; Возврат Рез; КонецФункции Функция п_СобытияЭлементаУправления(Элемент) Экспорт Рез=п_СписокСобытийЭлементаУправления(Элемент); ЗаполнитьЗначенияСвойств(Рез, Элемент); Возврат Рез; КонецФункции
TormozIT
Однажды мне пришлось сохранять отбор. Оказалось, это не так то и просто. Пришлось создавать структуру структур для того, чтобы сымитировать структуру отбора. Вот тут то мне и понадобилась функция, которая бы возвращала контейнер, в котором я бы мог сохранить элемент структуры отбора.
// Получает структуру свойств объекта по имени типа или объекту. // // Параметры: // пОбъект - Произвольный - имя типа или сам объект. // // Возвращаемое значение: // – Структура – свойств. // Функция ЛксПолучитьСтруктуруСвойствОбъекта(пОбъект) Экспорт СтруктураСвойств = Новый Структура; Если Ложь ИЛИ ТипЗнч(пОбъект) = Тип("ЭлементОтбора") ИЛИ пОбъект = "ЭлементОтбора" Тогда СтруктураСвойств.Вставить("ВидСравнения"); СтруктураСвойств.Вставить("Значение"); СтруктураСвойств.Вставить("ЗначениеПо"); СтруктураСвойств.Вставить("ЗначениеС"); СтруктураСвойств.Вставить("Имя"); СтруктураСвойств.Вставить("Использование"); СтруктураСвойств.Вставить("Представление"); СтруктураСвойств.Вставить("ПутьКДанным"); СтруктураСвойств.Вставить("ТипЗначения"); КонецЕсли; Возврат СтруктураСвойств; КонецФункции // ЛксПолучитьСтруктуруСвойствОбъекта() // Получает копию универсального объекта Отбор. // // Параметры: // пОтбор – Отбор – копируемый отбор. // // Возвращаемое значение: // – Структура – копия отбора. // Функция ЛксПолучитьКопиюОтбора(пОтбор) КопияОтбора = Новый Структура; Для Каждого ЭлементОтбора Из пОтбор Цикл ЭлементКопииОтбора = ЛксПолучитьСтруктуруСвойствОбъекта(ЭлементОтбора); ЗаполнитьЗначенияСвойств(ЭлементКопииОтбора, ЭлементОтбора); КопияОтбора.Вставить(ЭлементОтбора.Имя, ЭлементКопииОтбора); КонецЦикла; Возврат КопияОтбора; КонецФункции // ЛксПолучитьКопиюОтбора()