Генерация кода управляемой формы (декомпиляция элементов)

0. 5370 28.09.14 23:59 Сейчас в теме
Изменение форм типовых конфигураций лучше выполнять программно.
Эта обработка упрощает добавление элементов на форму, генерируя код создания элементов, реквизитов и команд формы.

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
99. movis08 23.06.16 12:39 Сейчас в теме
100. as7815 09.08.16 11:15 Сейчас в теме
1С:Предприятие 8.3 (8.3.7.2027) Управление торговлей, редакция 11.1 (11.1.4.14) не видит командную панель табличной части любого документа.
102. buzzzard 51 17.10.16 22:49 Сейчас в теме
(100) as7815, подтверждаю. Тоже сейчас уперся в это.
101. olbir 09.09.16 15:29 Сейчас в теме
Добрый день!
Как доступные типы элемента прописать?
103. Anchoret 46 26.12.16 17:09 Сейчас в теме
Никак не соображу, можно ли добавить кнопку в командную панель табличной части формы документа
105. ekaruk 5370 26.12.16 19:13 Сейчас в теме
(103) Насколько я понимаю, можно добавить команду.
106. Anchoret 46 27.12.16 08:55 Сейчас в теме
(105)
Команду можно добавить, но как ее добавить в командную панель табличной части?
104. artem_from_minsk 26.12.16 18:51 Сейчас в теме
Интересно поюзать конечно
107. Spacer 307 24.01.17 10:02 Сейчас в теме
Обработка очень хорошая и нужная, но есть одна недоработочка.
Когда генерируется код добавления двух и более элементов формы, то указывается элемент формы перед которым вставлять.
Т.е. добавляется первый элемент, и в коде прописано что его нужно вставлять перед вторым.
А второго то еще нет! И возникает ошибка.
108. ekaruk 5370 24.01.17 12:42 Сейчас в теме
(107) Добавление элементов выполняются, начиная с последнего.
Поэтому при добавлении первого второй уже есть.
Если, конечно, в сформированном обработкой коде самостоятельно строки местами не меняете.
109. Spacer 307 24.01.17 15:25 Сейчас в теме
(108)С последнего? Это как-то все равно что писать справа налево.
Смысл то какой в этом? Просто потом приходится ручками лишние куски кода убирать.
110. buzzzard 51 24.01.17 16:45 Сейчас в теме
(109) Возможно потому, что добавление любого элемента выполняется вставкой, которая предполагает указание элемента перед которым нужно вставить, а не добавлением. Это предположение, могу ошибаться.
111. Spacer 307 24.01.17 19:59 Сейчас в теме
(110)Добавлять элементы можно как добавлением, так и вставкой. При этом указание элемента перед которым нужно вставить не является обязательным.
112. ekaruk 5370 24.01.17 20:30 Сейчас в теме
(109) Смысл в том, чтобы вставить элемент на нужное место.
Добавлять можно. Но добавление всегда добавляет элемент последним. Это удобно, если рисуем форму программно полностью с нуля. Но чаще мы не рисуем форму с нуля, а добавляем программно несколько элементов между имеющимися типовыми. В данном случае применима только вставка. А вставка требует указания места вставки.
113. Spacer 307 30.01.17 08:58 Сейчас в теме
Маленькое пожелание. Хорошо было бы еще общие формы добавить.
114. karewka 12.02.17 16:25 Сейчас в теме
115. bsbbur 02.03.17 14:59 Сейчас в теме
Замечательная вещь, очень удобно, большое спасибо!
Надо было в Заказ добавить с десяток вкладок с каким-то немыслимым количеством элементов на них. В итоге, модификация формы - одна строчка, ну и дополнительный общий модуль (в т.ч. и для прочих нужд)! Знай себе копипасти - красота!
(на платформе 8.3.9.2170, в УНФ 1.6.7.43, при анализе ЗаказаПокупателя, в конце СформироватьДеревоСЭлементамиФормы(), споткнулось об ПутьБезТочек, когда она приняла значение "ОбъектПлатежныйКалендарь[0]" - поправил для себя, исключив недопустимые символы)
117. Sanario 22 22.05.17 12:33 Сейчас в теме
Добрый день. Решил попробовать обработку. Для 3.0 поправил процедуру ПриСозданииНаСервере() в глобальном модуле, как было сказано в тексте описания, но обработка ругается:

{Документ.РаспределительнаяСетка.Форма.ФормаДокумента.Форма(445)}: Значение не является значением объектного типа (Параметры)
Если Форма.Параметры.Свойство("ДекомпиляцияЭлементов") Тогда


Подскажите, что я забыл сделать. Тапками не кидайтесь - не шибко еще опытный
118. Sanario 22 22.05.17 12:51 Сейчас в теме
Решил) Если в документе, то надо ставить "ЭтаФорма", если в глобальнике - то оставляем "Форма"
itoptimum; +1 Ответить
120. AllexSoft 06.02.19 00:13 Сейчас в теме
Интересная обработка, в копилку.. Похоже она умеет отличать измененные свойства элементов формы еще.. интересно как это сделано
121. unichkin 1348 12.03.19 09:59 Сейчас в теме
Добрый день! Только что опробовал на 8.3.13.1644. Очень помогло, большое спасибо)
Что заметил (создаю таблицу формы из дерева):
- НовыйЭлемент.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; -автоматически не добавилось
- НовыйЭлемент.СохраняемыеДанные = Ложь; - зачем-то добавляется, этот флаг и так по-умолчанию Ложь
122. unichkin 1348 12.03.19 19:03 Сейчас в теме
Еще заметил что не выгружается условное оформление формы. Не хватает возможности подцеплять внешнюю обработку.
123. user701287_darkowntheworld 07.04.19 21:46 Сейчас в теме
В "Декомпиляция управляемых форм 3.0.1 (с 8.3.5) (3.0 + разбор командной панели + клиент-сервер)" ошибка... Модуль формы
&НаКлиенте
Процедура ДеревоФормВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Если ВыбраннаяСтрока = Неопределено Тогда
	
		Возврат;
	
	КонецЕсли; 
	
	ТекСтрока = Объект.ДеревоФорм.НайтиПоИдентификатору(ВыбраннаяСтрока);
	Если НЕ ПустаяСтрока(ТекСтрока.ПолныйПутьКФорме) Тогда
		//Имя справочника, имя документа, ....
		РодительФормы = ТекСтрока.ПолучитьРодителя();
		//Справочник, документ,....
		ТипОбъекта = РодительФормы.ПолучитьРодителя();
		
		СтруктИнфыОМетаданном = Новый Структура;
		СтруктИнфыОМетаданном.Вставить("ТипОбъекта",ТипОбъекта.Имя);
		СтруктИнфыОМетаданном.Вставить("ИмяОбъекта",РодительФормы.Имя);
		СтруктИнфыОМетаданном.Вставить("ИмяФормы",ТекСтрока.Имя);
		
		//Объект.ПолноеИмяФормы = ТекСтрока.ПолныйПутьКФорме;
		
		ДекомпиляцияЭлементов = Новый Структура("АдресВоВременномХранилище,ИмяПодключеннойОбработки,ИмяВременногоФайла",Объект.АдресВоВременномХранилище,Объект.ИмяПодключеннойОбработки,Объект.ИмяВременногоФайла);
		ПараметрыФормы = Новый Структура("ДекомпиляцияЭлементов",ДекомпиляцияЭлементов);
		
		Объект.ПолныйПутьКФорме = ТекСтрока.ПолныйПутьКФорме;
		ПолучитьФорму(ТекСтрока.ПолныйПутьКФорме,ПараметрыФормы);
		
		ЗаполнитьДанныеПоХранилищуНаСервере();
		
		//Развернуть дерево
		Для Каждого Строка Из Объект.ДеревоФорм.ПолучитьЭлементы() Цикл    
			Если Строка.Имя = СтруктИнфыОМетаданном.ТипОбъекта Тогда
				//Ищем объект
				Для Каждого СтрокаОбъект Из Строка.ПолучитьЭлементы() Цикл    
					Если СтрокаОбъект.Имя = СтруктИнфыОМетаданном.ИмяОбъекта Тогда
						//Ищем форму
						Для Каждого СтрокаФормы Из СтрокаОбъект.ПолучитьЭлементы() Цикл    
							Если СтрокаФормы.Имя = СтруктИнфыОМетаданном.ИмяФормы Тогда
								ИдентификаторСтроки = СтрокаФормы.ПолучитьИдентификатор();
// Было
//Элементы.ДревоФорм.ТекущаяСтрока = ИдентификаторСтроки;								
// Надо
Элементы.ДревоФорм.ТекущаяСтрока = Объект.ДеревоФорм.НайтиПоИдентификатору(ИдентификаторСтроки);	
							КонецЕсли; 
						КонецЦикла;
					КонецЕсли; 
				КонецЦикла;
			КонецЕсли; 
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры
Показать
124. NoRazum 28 19.06.19 16:19 Сейчас в теме
Если в реквизите есть такое "Изображения[0].Адрес"
та падает с ошибкой.

Стандартная УНФ ((
Кто мог подумать что так сделают ?!?!
125. sh_progr 28.01.20 22:39 Сейчас в теме
Можно ли при программном добавлении команды в Действие = "..." указать процедуру из общего модуля? Чтобы в форме вообще не было никаких изменений
126. ekaruk 5370 28.01.20 22:43 Сейчас в теме
(125) Процедуру из общего модуля нельзя.
Однако во многих типовых есть как раз на такой случай отдельная процедура в форме "Подключаемый.....", которая из себя вызывает процедуру общего модуля. Можно попробовать подключить её и внести изменения в общий модуль.
127. sh_progr 29.01.20 21:01 Сейчас в теме
128. Hatson 425 20.05.20 11:38 Сейчас в теме
Необходимо исправить ошибку. Слетает параметр ИмяПодключеннойОбработки
Нужно закомментировать строчку:


Процедура ПоместитьПустыеДанныеВХранилище() Экспорт

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

Показать
129. itoptimum 26.08.20 11:51 Сейчас в теме
Не взяла кнопки командной панели,заключенной в группу, табличной части Товары документа РеализацияТоваровУслуг.ФормаДокументаТовары БП3, при добавлении строк
		НоваяСтрока = ПараметрыДекомпиляции.ДеревоЭлементов.Строки.Добавить();
			НоваяСтрока.Тип = Тип(Форма.Элементы.Товары.КоманднаяПанель.ПодчиненныеЭлементы.ТоварыДействия);
			НоваяСтрока.Имя = "ТоварыКоманднаяПанель";
СформироватьДеревоСЭлементамиФормы(НоваяСтрока,Форма.Элементы.Товары.КоманднаяПанель.ПодчиненныеЭлементы.ТоварыДействия.ПодчиненныеЭлементы);
начинает их видеть и корректно обрабатывать.

В БП3 для вызова без изменения модуля форм необходимых документов можно добавить блок в ОбщиеМодули.УправлениеСвойствами:
Процедура ПриСозданииНаСервере(Форма, ДополнительныеПараметры = Неопределено) Экспорт
	
	Если Форма.Параметры.Свойство("ДекомпиляцияЭлементов") Тогда
	    ВнешниеОбработки.Создать(Форма.Параметры.ДекомпиляцияЭлементов.ИмяПодключеннойОбработки,Ложь).ОпределитьВнутренниеСвойстваЭлементов(Форма);
	КонецЕсли; 


просуммировал тут все комментарии что были ранее, внес небольшие изменения, отправлю файл так же комментарием дальше
130. itoptimum 26.08.20 11:52 Сейчас в теме
131. cprit 522 14.09.20 10:42 Сейчас в теме
(0)Добрый день!
Прошу разрешения на включение вашего инструмента в свободно распространяемый набор "Универсальные инструменты 1С" https://github.com/cpr1c/tools_ui_1c.

Обработка сейчас бесплатна для скачивания. По идее лицензия должна быть подходящей, но хотелось бы уточнить.
Поддержку и дальнейшее развитие готовы взять на себя.

Буду благодарен за любой ответ
AnddnA; GarickRus; itoptimum; +3 1 Ответить
132. K_A_O 530 15.09.20 09:10 Сейчас в теме
Судя по тому, что обработка бесплатна для скачивания - файл можно здесь прикрепить.
Добавлен анализ некоторых новых свойств реквизитов для последних платформ.
И платформенные картинки разбираются.
Прикрепленные файлы:
ДекомпиляцияУправляемыхФорм_kao.epf
itoptimum; +1 Ответить
135. Drivingblind 155 28.01.21 19:38 Сейчас в теме
(132) скачал вашу версию. Невозможно открыть, невозможно подключить.
Выдаёт ошибку: "Архив не является набором вариантов картинки, либо содержит некорректные варианты.".
Платформа 8.3.17.1549
133. user592773_demon1995.27 29.09.20 16:36 Сейчас в теме
(132) Немного доработал и добавил добавление кнопок на командную панель табличной части (106)
Прикрепленные файлы:
ДекомпиляцияУправляемыхФорм_kao.epf
ubnkfl; Anchoret; K_A_O; +3 Ответить
134. triviumfan 24 26.10.20 15:26 Сейчас в теме
(133) Чего ты там нагородил, что полеввода вставляется в командную панель?!
Оставьте свое сообщение
Вопросы с вознаграждением