Когда-то пользовался скриптом для 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);
КонецЦикла;
//Генерация кода создания колонки:
СтрокаКода = СтрокаКода + Символы.ПС +
скк_МассивТипов + ?(ПустаяСтрока(скк_МассивТипов), "", Символы.ПС) +
ИмяПеременной + ".Колонки.Добавить("+ скк_ПараметрыКолонки +");"
+ ?(ПустаяСтрока(скк_МассивТипов), "", Символы.ПС);
КонецЦикла;
Сообщить(СтрокаКода);