Четверг, 28.03.2024, 18:54
Главная Регистрация RSS
Приветствую Вас, Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Основной » Прочее » Пожелание: Добавить генерацию кода заполнения объекта
Пожелание: Добавить генерацию кода заполнения объекта
pinДата: Вторник, 16.08.2022, 17:46 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: Оффлайн
Очень хочется в консоле кода и обработке строки результата консоли запросов иметь возможность генерации кода заполнения выбранного типа объекта, на основе его метаданных.

т.е. выбрали в всплывающем окне вид объекта (например справочник валюты)и в текстовом поле сформировался например такой код


Код
НОбъект=Справочники.ВалютыСоздатьЭлемент();
НОбъект.Код= ;   //(Строка(3)) Цифровой код
НОбъект.Наименование= ;   //(Строка(10)) Символьный код

НОбъект.ЗагружаетсяИзИнтернета= ;   //(Булево) Загружается из Интернета
НОбъект.НаименованиеПолное= ;   //(Строка(50)) Наименование валюты
НОбъект.Наценка= ;   //(Число(10.2)) Наценка
НОбъект.ОсновнаяВалюта= ;   //(Справочники.Валюты) Основная валюта
НОбъект.ПараметрыПрописи= ;   //(Строка(200)) Параметры прописи
НОбъект.ФормулаРасчетаКурса= ;   //(Строка(100)) Формула расчета курса
НОбъект.СпособУстановкиКурса= ;   //(Перечисления.СпособыУстановкиКурсаВалюты) Способ установки курса

НстрПредставления = НОбъект.Представления.Добавить();   //Представления
НстрПредставления.КодЯзыка= ;   //(Строка(10)) Код языка
НстрПредставления.ПараметрыПрописи= ;   //(Строка(200)) Параметры прописи
НОбъект.Записать();


Во вложении файл с готовым кодом генерации подобной истории.

Добавлено (16.08.2022, 17:54)
---------------------------------------------
В предыдущем сообщении не приложился файл с кодом. Попытка №2

Добавлено (16.08.2022, 17:56)
---------------------------------------------
В общем файл не прикладывается ( Выкладываю код в сообщении


Код
Функция ПолучитьПриведенноеПолноеИмяМетаданных(ПолноеИмяМетаданных)
   ПозицияТочки=Найти(ПолноеИмяМетаданных,".");
   Если ПозицияТочки=0 Тогда
      _Возврат=ПолноеИмяМетаданных;
   Иначе
      ТипОбъекта=Лев(ПолноеИмяМетаданных,ПозицияТочки-1);
      Если ТипОбъекта="Справочник" Тогда
         _Возврат="Справочники";
      ИначеЕсли ТипОбъекта="Документ" Тогда
         _Возврат="Документы";
      ИначеЕсли ТипОбъекта="Перечисление" Тогда
         _Возврат="Перечисления";
      ИначеЕсли ТипОбъекта="ПланВидовХарактеристик" Тогда
         _Возврат="ПланыВидовХарактеристик";
      ИначеЕсли ТипОбъекта="ПланСчетов" Тогда
         _Возврат="ПланыСчетов";
      ИначеЕсли ТипОбъекта="ПланВидовРасчета" Тогда
         _Возврат="ПланыВидовРасчета";
      ИначеЕсли ТипОбъекта="Задача" Тогда
         _Возврат="Задачи";
      ИначеЕсли ТипОбъекта="ПланОбмена" Тогда
         _Возврат="ПланыОбмена";
      Иначе
         _Возврат=ТипОбъекта;
      КонецЕсли;
      _Возврат=_Возврат+Прав(ПолноеИмяМетаданных,СтрДлина(ПолноеИмяМетаданных)-ПозицияТочки+1);
   КонецЕсли;
   Возврат _Возврат;
КонецФункции

Функция ПолучитьТекстОписаниеТипа(ОписаниеТипа)
   _Возврат="";
   Типы=ОписаниеТипа.Типы();
   КоличествоТипов=Типы.Количество();
   Если КоличествоТипов<6 Тогда
      Для Каждого Тип Из Типы Цикл
         Если Тип=Тип("Строка") Тогда
            _Возврат=_Возврат+"Строка("+ОписаниеТипа.КвалификаторыСтроки.Длина+"),";
         ИначеЕсли Тип=Тип("Число") Тогда
            _Возврат=_Возврат+"Число("+ОписаниеТипа.КвалификаторыЧисла.Разрядность+"."+ОписаниеТипа.КвалификаторыЧисла.РазрядностьДробнойЧасти+"),";
         Иначе
            МетаданныеТипа=Метаданные.НайтиПоТипу(Тип);
            Если МетаданныеТипа<>Неопределено Тогда
               _Возврат=_Возврат+ПолучитьПриведенноеПолноеИмяМетаданных(Метаданные.НайтиПоТипу(Тип).ПолноеИмя())+",";
            Иначе
               _Возврат=_Возврат+Тип+",";
            КонецЕсли;
         КонецЕсли;
      КонецЦикла;
      _Возврат=Лев(_Возврат,СтрДлина(_Возврат)-1);
   Иначе
      _Возврат=""+КоличествоТипов+" разных типов";
   КонецЕсли;
   Возврат _Возврат;
КонецФункции

Процедура ДобавитьСтрокуРеквизита(ТекстКода,ИмяПеременнойВладельца,МетаданныеРеквизита)
   ТекстКода=ТекстКода+"
      |"+ИмяПеременнойВладельца+"."+МетаданныеРеквизита.Имя+"="+
      //"."+МетаданныеРеквизита.Имя+
      " ;   //("+ПолучитьТекстОписаниеТипа(МетаданныеРеквизита.Тип)+") "+МетаданныеРеквизита.Синоним;
КонецПроцедуры

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

ТекстКода=ПолучитьТекстЗаполненияОбъекта(Метаданные.Документы.АвансовыйОтчет);





Сообщение отредактировал pin - Вторник, 16.08.2022, 17:53
 
tormozitДата: Вторник, 16.08.2022, 21:41 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 6108
Репутация: 153
Статус: Оффлайн
Если речь идет про разовый код, т.е. который не будет встраиваться в конфигурацию для использования пользователем, то кажется подобные задачи эффективнее решать не кодом, а инструментом "Загрузка табличных данных". В него таблицу значений можно передать как из консоли кода, так и из консоли запросов. Причем он позволяет сохранять/восстанавливать все настройки и очень удобно перенастраивать и отлаживать загрузку данных. Если ты пробовал его, то почему он тебе показался менее подходящим для решения задачи?
 
pinДата: Среда, 17.08.2022, 15:59 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: Оффлайн
Я не понимаю как там, красиво и просто связывать "шапки" документов с табличными частями.
По этому как только что-то такое пишу запросы с обработкой.
 
tormozitДата: Четверг, 18.08.2022, 01:06 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 6108
Репутация: 153
Статус: Оффлайн
В инструменте "Загрузка табличных данных" загрузка выполняется только в одну таблицу БД непосредственно. Поэтому чтобы загрузить объекты с табличными частями, нужно сначала загрузить объекты, а потом для всех объектов сразу каждую табличную часть. Таким образом будет 1+Х отдельных загрузок, где Х - число табличных частей. Например в твоем примере это будет
- загрузка в таблицу БД Справочники.Валюты
- загрузка в таблицу БД Справочники.Валюты.Представления
Если ты опишешь более конкретную (реальную) задачу или хотя бы покажешь программный код ее решения, то мне проще будет понять сложности.
 
tormozitДата: Четверг, 18.08.2022, 09:56 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 6108
Репутация: 153
Статус: Оффлайн
Зачем нужен комментарий с именем типа реквизита? Ведь можно открыть контекстную подсказку и там увидеть все типы.

Прикрепления: 0421604.png (23.8 Kb)
 
tormozitДата: Четверг, 18.08.2022, 10:12 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 6108
Репутация: 153
Статус: Оффлайн
Создал задачу https://www.hostedredmine.com/issues/948616
 
pinДата: Четверг, 18.08.2022, 12:05 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: Оффлайн
Цитата tormozit ()
Зачем нужен комментарий с именем типа реквизита? Ведь можно открыть контекстную подсказку и там увидеть все типы.

В контексте ИР, да ненужно. Хотя чертовски приятно скопировать тип перечисления из комментария и через точку дополнить.
Именно по этому у меня в коде привожу "Перечисление" в "Перечисления". Просто меньше нудной работы.
 
tormozitДата: Воскресенье, 21.08.2022, 20:11 | Сообщение # 8
Генералиссимус
Группа: Администраторы
Сообщений: 6108
Репутация: 153
Статус: Оффлайн
реализовано в 6.41
 
Форум » Основной » Прочее » Пожелание: Добавить генерацию кода заполнения объекта
  • Страница 1 из 1
  • 1
Поиск: