gifts2017

Конструктор дерева/таблицы значений в режиме предприятия

Опубликовал Роман Уничкин (unichkin) в раздел Программирование - Практика программирования

Генерация строки кода создания таблицы/дерева значений, удобно использовать с конструктором коллекции ИР

Когда-то пользовался скриптом для openconf - конструктор таблицы значений: в формочке указывается структура ТЗ, на выходе код. Работая с ИР, вдруг подумал, что было бы удобно сделать нечто похожее: в консоли кода ИР описываем структуру ТЗ, и генерим код для ее создания с помощью языка 1С. Что получилось - выкладываю сюда, наглядно на видео:

Сам код:

	тз = ИсходнаяТЗ.СкопироватьКолонки();
	
	#Область Описание_соответствий_имен_типов
	
	СтруктураСоответствиеИменТипов = Новый Структура;
	
	//Простые
	СтруктураСоответствиеИменТипов.Вставить("boolean", "Булево");
	СтруктураСоответствиеИменТипов.Вставить("decimal", "Число");
	СтруктураСоответствиеИменТипов.Вставить("string", "Строка");
	СтруктураСоответствиеИменТипов.Вставить("dateTime", "Дата");
	
	// Ссылочные
	СтруктураСоответствиеИменТипов.Вставить("CatalogRef", "СправочникСсылка");
	СтруктураСоответствиеИменТипов.Вставить("DocumentRef", "ДокументСсылка");	
	СтруктураСоответствиеИменТипов.Вставить("BusinessProcessRoutePointRef", "ТочкаМаршрутаБизнесПроцессаСсылка");
	СтруктураСоответствиеИменТипов.Вставить("ChartOfCalculationTypesRef", "ПланВидовРасчетаСсылка");
	СтруктураСоответствиеИменТипов.Вставить("BusinessProcessRef", "БизнесПроцессСсылка");
	СтруктураСоответствиеИменТипов.Вставить("ChartOfAccountsRef", "ПланСчетовСсылка");
	СтруктураСоответствиеИменТипов.Вставить("EnumRef", "ПеречислениеСсылка");
	СтруктураСоответствиеИменТипов.Вставить("ChartOfCharacteristicTypesRef", "ПланВидовХарактеристикСсылка");
	СтруктураСоответствиеИменТипов.Вставить("TaskRef", "ЗадачаСсылка");	
	СтруктураСоответствиеИменТипов.Вставить("ExchangePlanRef", "ПланОбменаСсылка");	
	
	// Коллекции
	СтруктураСоответствиеИменТипов.Вставить("ValueTree", "ДеревоЗначений");
	СтруктураСоответствиеИменТипов.Вставить("ValueTable", "ТаблицаЗначений");
	СтруктураСоответствиеИменТипов.Вставить("ValueListType", "СписокЗначений");
	СтруктураСоответствиеИменТипов.Вставить("Array", "Массив");  
	
	// Прочие
	СтруктураСоответствиеИменТипов.Вставить("StandardBeginningDate", "СтандартнаяДатаНачала");
	СтруктураСоответствиеИменТипов.Вставить("UUID", "УникальныйИдентификатор");
	СтруктураСоответствиеИменТипов.Вставить("StandardPeriod", "СтандартныйПериод");
	СтруктураСоответствиеИменТипов.Вставить("PointOfTime", "МоментВремени");
	СтруктураСоответствиеИменТипов.Вставить("Null", "Null");	
	СтруктураСоответствиеИменТипов.Вставить("Type", "Тип");
	СтруктураСоответствиеИменТипов.Вставить("Bound", "Граница");
	СтруктураСоответствиеИменТипов.Вставить("Field", "ПолеКомпоновкиДанных");	
	СтруктураСоответствиеИменТипов.Вставить("TypeDescription", "ОписаниеТипов");
	
	// Системные перечисления	
	СтруктураСоответствиеИменТипов.Вставить("AccumulationRecordType", "ВидДвиженияНакопления");
	СтруктураСоответствиеИменТипов.Вставить("AccountingRecordType", "ВидДвиженияБухгалтерии");
	СтруктураСоответствиеИменТипов.Вставить("AccountType", "ВидСчета");
	
	#КонецОбласти 	
	
	СтрокаКода = ИмяПеременной + " = Новый ТаблицаЗначений;";
	Для Каждого Колонка Из тз.Колонки Цикл
		
		//скк - строка кода конструктора
		скк_ОписанияТипов = "";
	    скк_МассивТипов = "";
		
#Область Генерация_строки_описания_типов
		
		МассивТипов = Колонка.ТипЗначения.Типы();
		
		// Если колонка несоставного типа, то воспользуюсь быстрым конструктором 
		// описания типов, иначе - через массив		
		Счетчик = 0; ВсегоТипов = МассивТипов.Количество();
		ЕстьОписание = ВсегоТипов > 0;
		
		Если ЕстьОписание Тогда
			ЭтоПростоеОписаниеТипов = ВсегоТипов = 1;
			
			скк_МассивТипов = "";
			
	#Область Генерация_строки_массива_типов
			Для каждого Тип Из МассивТипов Цикл	
				
				Счетчик = Счетчик + 1;
				
				ТипXML = СериализаторXDTO.XMLТип(Тип);	
				
				поз = Найти(ТипXML.ИмяТипа, ".");
				Если поз > 0 Тогда
					ТипМетаданногоАнгл = Лев(ТипXML.ИмяТипа, поз - 1);	
					ИмяМетаданного = Сред(ТипXML.ИмяТипа, поз + 1);
					ТипМетаданногоРус = СтруктураСоответствиеИменТипов[ТипМетаданногоАнгл];
					скк_ТекущийТип = ТипМетаданногоРус + "." + ИмяМетаданного;
				Иначе
					скк_ТекущийТип = СтруктураСоответствиеИменТипов[ТипXML.ИмяТипа];
				КонецЕсли; 				
				
				Если ЭтоПростоеОписаниеТипов Тогда
					скк_ПараметрОписания = """" + скк_ТекущийТип + """";	
				Иначе	
					скк_ПараметрОписания = "МассивТипов";
					Если Счетчик = 1 Тогда
						скк_МассивТипов = "МассивТипов = Новый Массив();"					
					КонецЕсли; 
					скк_МассивТипов = скк_МассивТипов + Символы.ПС + "МассивТипов.Добавить(Тип(""" + скк_ТекущийТип+ """));";
				КонецЕсли; 
				
			КонецЦикла;
	#КонецОбласти 		
			
		
	#Область Генерация_строки_квалификаторов
			скк_Квалификаторы = ",КвЧисла,КвСтроки,КвДаты";
			скк_квДаты = ""; скк_квЧисла = ""; скк_квСтроки = "";
			Если Колонка.ТипЗначения.СодержитТип(Тип("Дата")) Тогда
				
				Если Колонка.ТипЗначения.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Время Тогда
					скк_ЧастиДаты = "Время";
					
				ИначеЕсли Колонка.ТипЗначения.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Дата Тогда
					скк_ЧастиДаты = "Дата";
					
				ИначеЕсли Колонка.ТипЗначения.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.ДатаВремя Тогда
					скк_ЧастиДаты = "ДатаВремя";				
					
				КонецЕсли; 
				
				скк_квДаты = " Новый КвалификаторыДаты(ЧастиДаты."+ скк_ЧастиДаты +")"; 	
			КонецЕсли; 
			
			Если Колонка.ТипЗначения.СодержитТип(Тип("Строка")) Тогда
				скк_ДлинаСтроки = Колонка.ТипЗначения.КвалификаторыСтроки.Длина;
				скк_ДопустимаяДлина = "" + Колонка.ТипЗначения.КвалификаторыСтроки.ДопустимаяДлина;
				
				скк_квСтроки = " Новый КвалификаторыСтроки("+ скк_ДлинаСтроки +", " +
				"ДопустимаяДлина." + скк_ДопустимаяДлина +")";
			КонецЕсли; 
			
			Если Колонка.ТипЗначения.СодержитТип(Тип("Число")) Тогда
				скк_ЧислоРазрядов = "" + Колонка.ТипЗначения.КвалификаторыЧисла.Разрядность;
				скк_ЧислоРазрядовДробнойЧасти = "" + Колонка.ТипЗначения.КвалификаторыЧисла.РазрядностьДробнойЧасти; 
				скк_ДопустимыйЗнак = "" + Колонка.ТипЗначения.КвалификаторыЧисла.ДопустимыйЗнак;
				
				скк_квЧисла = " Новый КвалификаторыЧисла("+ скк_ЧислоРазрядов + ", " +
				скк_ЧислоРазрядовДробнойЧасти + 
				", ДопустимыйЗнак." + скк_ДопустимыйЗнак +")";
			КонецЕсли; 
			
			скк_Квалификаторы = СтрЗаменить(скк_Квалификаторы, "КвДаты", скк_квДаты);	
			скк_Квалификаторы = СтрЗаменить(скк_Квалификаторы, "КвСтроки", скк_квСтроки);
			скк_Квалификаторы = СтрЗаменить(скк_Квалификаторы, "КвЧисла", скк_квЧисла);
			
			//Удалю запятые с конца
			Пока Прав(скк_Квалификаторы, 1) = "," Цикл
				скк_Квалификаторы = Лев(скк_Квалификаторы, СтрДлина(скк_Квалификаторы) - 1);				
			КонецЦикла; 
	#КонецОбласти 

			скк_ОписанияТипов = "Новый ОписаниеТипов("+ скк_ПараметрОписания + скк_Квалификаторы +")";
		Иначе
			скк_ОписанияТипов = "";			
		КонецЕсли; 
		
#КонецОбласти 		
		
		скк_ПараметрыКолонки = 
		"""" + Колонка.Имя + """," +  // ИмяКолонки
		?(ПустаяСтрока(скк_ОписанияТипов), "", " " + скк_ОписанияТипов) + "," + // Описание типов
		?(ПустаяСтрока(Колонка.Заголовок), "", " """ + Колонка.Заголовок + """") + "," + // Заголовок
		?(Колонка.Ширина = 0, "", " "+ Колонка.Ширина); // Ширина
		
		//Удалю запятые с конца
		Пока Прав(скк_ПараметрыКолонки, 1) = "," Цикл
			скк_ПараметрыКолонки = Лев(скк_ПараметрыКолонки, СтрДлина(скк_ПараметрыКолонки) - 1);				
		КонецЦикла; 
				
		//Генерация кода создания колонки:
		СтрокаКода = СтрокаКода + Символы.ПС +
		скк_МассивТипов + ?(ПустаяСтрока(скк_МассивТипов), "", Символы.ПС) +
		ИмяПеременной + ".Колонки.Добавить("+ скк_ПараметрыКолонки +");" 
		+ ?(ПустаяСтрока(скк_МассивТипов), "", Символы.ПС);
		
	КонецЦикла;
	
	Сообщить(СтрокаКода);

 

 

См. также

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

Комментарии

1. Сергей Старых (tormozit) 10.07.16 13:17
На будущее. При записи ролика лучше запускать приложение без проверки модальности. Будет красивее.
2. Роман Уничкин (unichkin) 10.07.16 15:58
(1) tormozit, это да. Для тестов взял что под рукой было - БП 3.0, показалось что долго коряжить - а на деле еще с видео провозился полчаса почти))
3. Яков Коган (Yashazz) 11.07.16 12:21
Товарисч, ну ты что. Работаешь с XDTO, а для соответствия русских и английских имён такой ужас нагородил. Это ж проще можно, вроде СокрЛП(СериализаторXDTO.XMLСтрока(рЗначение)) где Значение, например, системного типа, на выходе будет англоязычным. Или фабрики самой 1С почитай.
4. Роман Уничкин (unichkin) 11.07.16 12:56
(3) Yashazz, копался час с этим не нашел другого способа. В т. ч. и СериализаторXDTO.XMLСтрока("CatalogRef.Контрагенты") пробовал - возвращает "CatalogRef.Контрагенты". Может чего-то недопонимаю.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа