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

10.07.16

Разработка - Универсальные функции

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

Когда-то пользовался скриптом для 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С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2686    1    John_d    8    

55

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4620    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3965    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8852    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2078    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16159    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7245    quazare    8    

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