Имя: Пароль:
1C
 
Программное копирование реквизита управляемой формы
0 BFG9000
 
11.12.17
10:46
Добрый день!
Есть таблица на УФ и связанный с ней реквизит Таблица значений. Элемент Таблица формы имеет определенные настройки - ширину колонок, объединенные колонки и т.п. Необходимо сделать копию ТЗ и отобразить ее на той же форме. Это у меня получилось - выгрузил первоначальную ТЗ в другую, программно создал реквизит формы, элемент ТаблицаФормы и колонки. Но в этом случае элементы Поле формы создаются "по умолчанию", а нужно, чтобы новая таблица формы имела вид, как и первоначальная. Есть ли какой-либо способ скопировать эти свойства?
1 vicof
 
11.12.17
10:50
ЗаполнитьЗначенияСвойств(Элементы.Таблица2, Элементы.Таблица1) не?
2 Mort
 
11.12.17
11:13
Вот программа из работающей обработки (Data Commander), который состоит из программного создания элементов практически полностью.


Вызывать, например, так:

СоздатьКопиюЭлемента(Элементы.Таблица1, "Префикс");

Копия будет называться "ПрефиксТаблица1", реквизиты, соответственно должны называться тоже как и "родные" только с префиксом.


Вот код:



// Главные

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

&НаСервере
Процедура СкопироватьПодчиненныеЭлементы(Приемник, Источник, ПрефиксКопии) Экспорт
    
    Для Каждого ЭлементИсточника Из Источник.ПодчиненныеЭлементы Цикл
        СоздатьКопиюЭлемента(ЭлементИсточника, ПрефиксКопии, Приемник);
    КонецЦикла;
    
КонецПроцедуры

// Служебные

&НаСервереБезКонтекста
Процедура ЗаполнитьКоллекциюСвойств(КоллекцияПриемник, КоллекцияИсточник)
    
    Для Каждого Элемент Из КоллекцияИсточник Цикл
        ЗаполнитьЗначенияСвойств(КоллекцияПриемник.Добавить(), Элемент);
    КонецЦикла;
    
КонецПроцедуры

&НаСервере
Процедура СкопироватьКнопкиКоманднойПанелиТаблицы(ГруппаКнопокПриемник, ГруппаКнопокИсточник,ПрефиксКопии) Экспорт
    
    Для Каждого ЭлементИсточника из ГруппаКнопокИсточник.ПодчиненныеЭлементы Цикл
        // Созданные элементы командных панелей таблиц должны содержать слово "кнопка" или "кнопки".
        // Это необходимо, чтобы отличить их от стандартных элементов, которые генерируются в источнике сами
        Если Найти(НРег(ЭлементИсточника.Имя), "кнопк") > 0 Тогда
            
            Тип = ТипЗнч(ЭлементИсточника);
            ЭлементПриемника = Элементы.Добавить(ПрефиксКопии + ЭлементИсточника.Имя, Тип, ГруппаКнопокПриемник);
            
            Если Тип = Тип("ГруппаФормы") Тогда
                
                ЭлементПриемника.Вид = ЭлементИсточника.Вид;
                
                ЗаполнитьЗначенияСвойств(ЭлементПриемника, ЭлементИсточника);
                
                СкопироватьКнопкиКоманднойПанелиТаблицы(ЭлементПриемника, ЭлементИсточника, ПрефиксКопии);
                
            ИначеЕсли Тип = Тип("КнопкаФормы") Тогда
                
                ЗаполнитьЗначенияСвойств(ЭлементПриемника, ЭлементИсточника);
                
                СкопироватьКоманду(ЭлементПриемника, ЭлементИсточника, ПрефиксКопии);
                
            КонецЕсли;    
            
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

&НаСервере
Процедура СкопироватьКоманду(ЭлементПриемник, ЭлементИсточник, ПрефиксКопии) Экспорт
    
    КомандаИсточник = Команды.Найти(ЭлементИсточник.ИмяКоманды);
    
    КомандаПриемник = Команды.Найти(ПрефиксКопии + КомандаИсточник.Имя); //Две кнопки могут ссылаться на одну команду
    
    Если КомандаПриемник = Неопределено Тогда
        КомандаПриемник = Команды.Добавить(ПрефиксКопии + КомандаИсточник.Имя);
    КонецЕсли;     
    
    ЗаполнитьЗначенияСвойств(КомандаПриемник, КомандаИсточник, , "Имя");
    
    ЭлементПриемник.ИмяКоманды = КомандаПриемник.Имя;
    
КонецПроцедуры

&НаСервере
Процедура СкопироватьСобытия(ЭлементПриемник, ЭлементИсточник) Экспорт
    
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "ПриИзменении");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "НачалоВыбора");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "НачалоВыбораИзСписка");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "Очистка");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "Выбор");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "Регулирование");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "Открытие");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "ОбработкаВыбора");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "АвтоПодбор");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "ОкончаниеВводаТекста");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "ПриОбновленииСоставаПользовательскихНастроекНаСервере");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "ПриНачалеРедактирования");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "ПередНачаломДобавления");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "ПередНачаломИзменения");
    СкопироватьСобытие(ЭлементПриемник, ЭлементИсточник, "ПриАктивизацииСтроки");
    
КонецПроцедуры

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