Шаблоны анкет / Форма списка / Модуль формы

файл
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийЭлементовШапкиФормы

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Функция ВыполнитьКопированиеЭлемента(ЭлементКопирования)
	
	НачатьТранзакцию();
	Попытка
	
		ШаблонАнкетыОбъект = Справочники.ШаблоныАнкет.СоздатьЭлемент();
		
		ЗаполнитьЗначенияСвойств(ШаблонАнкетыОбъект,ЭлементКопирования,"ПометкаУдаления,Наименование,Заголовок,Вступление,Заключение");
		ШаблонАнкетыОбъект.УстановитьСсылкуНового(Справочники.ШаблоныАнкет.ПолучитьСсылку());
		ШаблонАнкетыОбъект.РедактированиеШаблонаЗавершено = Ложь;
		ШаблонАнкетыОбъект.Записать();
		
		Запрос = Новый Запрос;
		Запрос.Текст = "
		|ВЫБРАТЬ
		|	ВопросыШаблонаАнкеты.Ссылка КАК Ссылка,
		|	ВопросыШаблонаАнкеты.ПометкаУдаления,
		|	ВопросыШаблонаАнкеты.Предопределенный,
		|	ВопросыШаблонаАнкеты.Владелец,
		|	ВопросыШаблонаАнкеты.Родитель,
		|	ВопросыШаблонаАнкеты.ЭтоГруппа,
		|	ВопросыШаблонаАнкеты.Код КАК Код,
		|	ВопросыШаблонаАнкеты.Наименование,
		|	ВопросыШаблонаАнкеты.Обязательный,
		|	ВопросыШаблонаАнкеты.ТипВопроса,
		|	ВопросыШаблонаАнкеты.ТипТабличногоВопроса,
		|	ВопросыШаблонаАнкеты.ЭлементарныйВопрос,
		|	ВопросыШаблонаАнкеты.РодительВопрос,
		|	ВопросыШаблонаАнкеты.Подсказка КАК Подсказка,
		|	ВопросыШаблонаАнкеты.СпособОтображенияПодсказки КАК СпособОтображенияПодсказки,
		|	ВопросыШаблонаАнкеты.СоставТабличногоВопроса.(
		|		ЭлементарныйВопрос КАК ЭлементарныйВопрос,
		|		НомерСтроки
		|	),
		|	ВопросыШаблонаАнкеты.ПредопределенныеОтветы.(
		|		ЭлементарныйВопрос КАК ЭлементарныйВопрос,
		|		Ответ,
		|		НомерСтроки
		|	),
		|	ВопросыШаблонаАнкеты.СоставКомплексногоВопроса.(
		|		ЭлементарныйВопрос КАК ЭлементарныйВопрос,
		|		НомерСтроки
		|	),
		|	ВопросыШаблонаАнкеты.Формулировка
		|ИЗ
		|	Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
		|ГДЕ
		|	ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
		|
		|УПОРЯДОЧИТЬ ПО
		|	Ссылка ИЕРАРХИЯ,
		|	Код";
		
		Запрос.УстановитьПараметр("ШаблонАнкеты", ЭлементКопирования);
		
		Результат = Запрос.Выполнить();
		
		Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
		ДобавитьЭлементыСправочникаВопросыШаблонаАнкеты(ШаблонАнкетыОбъект.Ссылка, Выборка);
		ЗафиксироватьТранзакцию();
		
	Исключение
		
		ОтменитьТранзакцию();
		Возврат Неопределено;
		
	КонецПопытки;
	
	Возврат ШаблонАнкетыОбъект.Ссылка;
	
КонецФункции

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

#КонецОбласти

Связанные материалы