Имя: Пароль:
1C
 
Функция генерирующая программный код создания переданной ей структуры
0 SeiOkami
 
29.08.14
12:46
Такая вещь. Имеется обработка, которая в зависимости от установленных параметров, формирует структуру. В общем, кто-нить где-нить встречал функцию, которая бы сформировала текст программного кода, создающего переданную этой функции структуру.

То есть передаёшь в функцию структуру:
Структура
- свойство1 - "значение первого свойства"
- свойство2 - 52342
- свойство3 - Истина

а функция возвращает текст кода:

СтруктураРезультат = Новый Структура;
СтруктураРезультат.Вставить("свойство1", "значение первого свойства");
СтруктураРезультат.Вставить("свойство2", 52342);
СтруктураРезультат.Вставить("свойство3", Истина);

P.S. Пожалуйста, не надо закидывать вопросами типа "науа?". Просто надо =)
1 SeiOkami
 
29.08.14
12:47
Забыл поставить знак вопроса:
"В общем, кто-нить где-нить встречал функцию, которая бы сформировала текст программного кода, создающего переданную этой функции структуру? "
2 ДенисЧ
 
29.08.14
12:48
Интересно, зачем кому-то понадобилось бы писать такую функцию, да ещё и выкладывать....
Там писанины на полчаса...
3 DirecTwiX
 
29.08.14
12:48
А в чём проблема написать то? Дело пяти минут
4 tdm
 
29.08.14
12:49
СтруктураРезультат = Новый Структура("свойство1,свойство2,свойство1",значени1,значение2) - не ?
5 SeiOkami
 
29.08.14
12:49
(2), (3),
на пол часа?
а что если структура будет содержать типы посложнее?
6 SeiOkami
 
29.08.14
12:50
(2), (3),
это я привел простой пример лишь для того, чтобы объяснить принцип
7 hhhh
 
29.08.14
12:52
(6) надо вам не заниматься фигней, а вплотную изучать пакеты XDTO, WS-ссылки и т.п.
8 fmrlex
 
29.08.14
12:52
(5) Перебери в цикле свойства структуры и сгенерируй код.
9 DirecTwiX
 
29.08.14
12:53
(5) Рекурсию сделаешь :D
>а что если структура будет содержать типы посложнее?
Тогда возникает вопрос "науа". Либо, на крайняк, "что за типы тебе нужны".
10 SeiOkami
 
29.08.14
12:54
(9), сейчас в голову приходит описание типов. С остальными вроде и так всё ясно
11 SeiOkami
 
29.08.14
12:56
(9), точнее разбить описание на типы и сформировать код, который их собирает вроде не сложно... Вот только не знаю как с квалификаторами быть.
12 tdm
 
29.08.14
12:56
(8) >>Перебери в цикле свойства структуры
передаем структуру чтобы на выходе получить структуру)) ТС чего то не договариает)
13 fmrlex
 
29.08.14
12:57
(12) Код получить надо. Не структуру.
14 Зойч
 
29.08.14
12:57
написать - 2 мин.
Единственно со ссылками придется повозиться
15 SeiOkami
 
29.08.14
12:59
Просто надеялся, что где-то такая фигня уже есть)
16 mistеr
 
29.08.14
13:19
(0) А ссылки как кодировать? GUID-ами? К моменту исполнения того кода ссылки могут стать битыми.
17 SeiOkami
 
29.08.14
14:52
Эта функция "на пять минут" переросла в какой-то клубок кода, который никак не могу распутать =(
18 HeroShima
 
29.08.14
14:55
(17) Мои соболезнования.
19 Зойч
 
29.08.14
14:57
Стр = "Структура = Новый Структура;";
Для каждого КлючИЗначение из Структура Цикл
  Стр = Стр = "Структура.Вставить(""" + КлючИЗначение.Ключ + """",  Формат(КлючИЗначение.Значение)) + ";" + Символы.ПС;
КонецЦикла;
20 Трик
 
29.08.14
15:00
Структура (Structure)
По ключам и значениям
Синтаксис:

Новый Структура(<Ключ>, <Значения>)
Параметры:

<Ключ> (обязательный)

Тип: Строка.
Список свойств, указанных через запятую.
<Значения> (необязательный)

Тип: Произвольный.
Значения элементов структуры.
Описание:

Создает структуру с ключами, значения которых передаются в параметре конструктора. Если в первом параметре заданы ключи элементов структуры, то в следующих параметрах могут быть указаны значения этих элементов в том порядке, в котором они расположены в строке в первом параметре.

Пример
СтруктураТипа = Новый Структура("Синоним, МассивСсылок", СинонимДокумента, Новый Массив);
21 Трик
 
29.08.14
15:03
(20)Так что предаешь в свою процедуру строку с именами поелй если надо. Этой первый параметр, а дальше значения.

Выясняешь сколько полей (или сразу число у тебя переданное)

И в два цикла строишь строку
22 Трик
 
29.08.14
15:04
или в один цикл если имена полей в строку уже переданны
23 SeiOkami
 
29.08.14
15:29
(19), уже говорил выше, что не проканает, если значением будет что-то сложнее строки\числа\даты\булева

(20),(21),(22), это я вообще не понял к чему приведено
24 РенеДекарт
 
29.08.14
15:52
(0)>которая бы сформировала текст программного кода
- ты как будешь этот код выполнять?
25 SeiOkami
 
29.08.14
15:56
(24), этот код далее будет вставляться в обработку.
26 SeiOkami
 
29.08.14
16:00
(24), в общем, есть навороченая функция с кучей доп. параметров, которые передаются структурой.
Все эти доп. параметры я сейчас могу в пользовательском режиме в спец. обработке устанавливать, после чего обработка вызвает мою функцию и передаёт ей структуру с указанными мною настройками. Подобрав подходящие в текущий момент параметры я хочу, чтобы обработка так же сформировала примерный код, который бы можно было потом просто вставить в место, где нужно вызывать мою функцию именно так, как я настроил в обработке
27 Зойч
 
29.08.14
16:08
Для ссылки

МетаданныеСсылки = Ссылка.Метаданные();
Если Метаданные.Справочники.Содержит(МетаданныеСсылки) Тогда
  Стр = "Справочники." + Метаданныессылки.Имя + ".ПолучитьСсылку(Новый УникальныйИдентификатор(""" + Строка(Ссылка.УникальныйИдентификатор()) + """));"
КонецЕсли;
28 Зойч
 
29.08.14
16:10
Также можно с предопределенными поиграться
29 SeiOkami
 
29.08.14
16:50
Много нюансов. Например, массив, список значений, описание типов...
+ учитывать, что в массиве может быть опять структура или опять массив и т.д. и т.п.
30 mistеr
 
30.08.14
00:34
(26) Так зачем тебе обобщать сверх необходимого? Генерируй код для параметров именно твоей функции, а не любой структуры.
31 Рэйв
 
30.08.14
00:41
(0)К полю структуры можно обратиться строково пои имени типа: Струк["Имя"]

Я вообще не вижу в чем проблема ...
32 Рэйв
 
30.08.14
00:41
можно в имя и переменую загнать.
33 Злопчинский
 
30.08.14
15:47
особенно если струтктура может содержать где-unybnm взначении - структуру...
34 alle68
 
30.08.14
17:16
(26) Неясно, зачем генерировать код, который получит структуру, на основании которой этот код и генерировался?
Структура есть, ну и подставляем её в навороченную функцию.
35 SeiOkami
 
01.09.14
08:12
(34), это обработка-помощник разработчику. Чтобы тот смог в режиме предприятия наглядно и удобно настроить под себя вызов функции, а затем получить сгенерированный код её формирования.
36 alle68
 
01.09.14
09:00
(35) Через "ЗначениеВФайл/ЗначениеИзФайла" не проще?
37 DrZombi
 
гуру
01.09.14
09:26
(35) Забей, не надо это :)
38 Трик
 
01.09.14
09:54
(23)Неправильно тебя понял.
39 SeiOkami
 
01.09.14
10:21
(36), весь смысл теряется
40 SeiOkami
 
01.09.14
10:21
(37), как говорится, "дурная голова рукам покоя не даёт" =)
41 HeroShima
 
01.09.14
10:24
(35) А функция, генерящая структуру по описанию, разработчика не устроит?
42 HeroShima
 
01.09.14
10:25
(40) Программист должен быть ленивым.
43 SeiOkami
 
01.09.14
10:27
(42), ой, не надо тут этих фраз. Давайте убёрем всю автоматизацию работы разработчика в 1С и все вернёмся к ручным рисованиям таблиц и связей, как в старом Фокс про. А можно дальше пойти и вообще на асемблере кодить.
44 Зойч
 
01.09.14
10:33
Это что за функция такая, что ее нужно НАГЛЯДНО настраивать?
45 HeroShima
 
01.09.14
10:36
(43) "Автоматизируя бардак получите автоматизированный бардак"
46 hhhh
 
01.09.14
10:37
(43) еще раз. Всё это уже реализовано через XDTO-пакеты. Вы изобретаете велосипед с квадратными колесами.
47 Зойч
 
01.09.14
10:41
(46) передавать вместо структур - хдто пакеты. Это каким же нужно быть изваращенцем?
48 SeiOkami
 
01.09.14
10:44
(46), где? я такое впервые слышу, чтобы XDTO генерировала 1Совский код
49 hhhh
 
01.09.14
10:44
ну там 5-10 сек написание программы. Например если свой пакет из 4-х строчек. А автор нам уже неделю чего-то втирает
50 SeiOkami
 
01.09.14
10:53
(49), чую, что ты какую-то фигню несёшь.
А втирал я только один день 29го. Больше времени просто не было сесть за это. И даже без учета этого выходит лишь пол недели, так что у тебя ещё и с математикой фиговато =)
51 HeroShima
 
01.09.14
10:55
Задача примитивная, вне зависимости от сложности структуры.
52 SeiOkami
 
01.09.14
10:57
(51), прошу тогда описать, если будет время. Просто я пока не могу сообразить как её сделать без ужасного гвно-кода =(
53 Зойч
 
01.09.14
11:17
(52) тебе больше делать нечего чтоли?
54 HeroShima
 
01.09.14
11:18
(52) >Просто я пока не могу сообразить как её сделать без ужасного гвно-кода
В 1С гвнокод допустимый.

Для начала напиши вывод диаграммы связей структуры.
55 Garykom
 
гуру
01.09.14
11:27
(0) Мда сразу вспомнился 9-й класс лицея, класс из Ямаха MSX2 и графический редактор на обычном бейсике который преобразовывал картинку в последовательность графических команд того же бейсика - всякие там line, circle и т.д.


ЗЫ А нужно было это для конструктора вопросов к системе тестирования на тех же ямахах, причем они ж в сетку соединены были так что на учительском компе можно было задания раздавать и наблюдать ход опроса )) и подсказать кому надо - так сказать  незадокументированные функции были у проги...
56 Garykom
 
гуру
01.09.14
11:41
(0) кстати не вижу проблем написать такую функцию, главное про рекурсию не забывать (если параметр структуры может также быть структурой)

просто когда то на 7.7 еще был написан универсальный обмен данными между идентичными конфами,
так там все реквизиты всех документов и справочников по метаданным разбирались и записывались в xml одной универсальной функцией, как и в обратную сторону из xml универсальная функция создавала новые элементы и документы по xml
57 Asmody
 
01.09.14
11:49
Функция Структура2XML(_структура)
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, _структура);
    Возврат ЗаписьXML.Закрыть();
КонецФункции

Функция Код1СДляСозданияСтруктуры(_структура, _имяФункции)
    xmlСтруктуры = Структура2XML(_структура);
    Возврат "
    |Функция "+_имяФункции+"()
    |    xmlСтруктуры = """+xmlСтруктуры+""";
    |    ЧтениеXML = Новый ЧтениеXML;
    |    ЧтениеXML.УстановитьСтроку(xmlСтруктуры);
    |    Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип(""Структура""));
    |КонецФункции  
    ";
КонецФункции
58 Garykom
 
гуру
01.09.14
11:56
(57) ай молодца, но вот тема с...

т.е. тема "Функция Структура2XML(_структура)" не раскрыта, ему ж не xml нужен а код на 1С, иначе придется придумывать как в код 1С вставлять куски xml'я )) да можно через строку но это изврат ко объемам текста
59 SeiOkami
 
19.09.14
13:00
Вот, накинул набросок. Пока описанные типы устраивают. Может и кому-нить такая хрень пригодится )




// Функция формирует код на встроенном языке 1С, описывающий переданное значение.
// То бишь, можно передать произваольную структуру в функцию и на выходе получить текст кода 1С, который будет содержать создание переданного значения
// На данный момент, поддерживаются типы:
//    Строка, Число, Дата, Неопределено, Булево, ДопустимаяДлина, ДопустимыйЗнак, ЧастиДаты, КвалификаторыСтроки, КвалификаторыЧисла, КвалификаторыДаты, КвалификаторыДвоичныхДанных
//  Структура, Соответствие, Массив, СписокЗначений, Тип, ОписаниеТипов
//
// Параметры:
//  Значение              - Строка, Число, Дата, Неопределено, Булево, ДопустимаяДлина, ДопустимыйЗнак, ЧастиДаты, КвалификаторыСтроки, КвалификаторыЧисла, КвалификаторыДаты, КвалификаторыДвоичныхДанных, Структура, Соответствие, Массив, СписокЗначений, Тип, ОписаниеТипов -
//                            Значение, код описания котрого необходимо сгенерировать
//  ИмяПеременной          - строка    - имя переменной. Для подстановки "<ИмяПеременной> = Новый <ТипЗначения>"
//    ВидОписанияЗначения - число        - вид описания значения. 1 - без использования переменной. 2 - с использованием своей переменной. Если переданный режим невозможен для текущего значения, тогда вид описания изменяется на возможный
//
// Возвращаемое значение:
//   Структура
//        - ТекстКодаОписания - строка
//        - ВидОписанияЗначения - число
//
Функция ТекстКодаОписанияЗначения(Значение, ИмяПеременной = "", Знач ВидОписанияЗначения = 0)  Экспорт
    
    ТекстКодаОписания    = "";
    
    ТипЗначения            = ТипЗнч(Значение);
    Кавычка                = """";    
    
    /////////////
    ///ПРОСТЫЕ///
    /////////////
    
    Если ТипЗначения = Тип("Строка") Тогда
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания = ТекстКодаОписания + ИмяПеременной + "    = " + Кавычка + Значение + Кавычка;
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания = ТекстКодаОписания + Кавычка + Значение + Кавычка;            
        КонецЕсли;
        
    ИначеЕсли ТипЗначения = Тип("Дата") Тогда
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания = ТекстКодаОписания + ИмяПеременной + "    = "
            + "Дата(" + Формат(Год(Значение), "ЧГ=0") + "," + Месяц(Значение) + "," + День(Значение) + ","
            + Час(Значение) + "," + Минута(Значение) + "," + Секунда(Значение) + ")";
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания = ТекстКодаОписания
            + "Дата(" + Формат(Год(Значение), "ЧГ=0") + "," + Месяц(Значение) + "," + День(Значение) + ","
            + Час(Значение) + "," + Минута(Значение) + "," + Секунда(Значение) + ")";            
        КонецЕсли;
        
    ИначеЕсли ТипЗначения = Тип("Число") Тогда
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания = ТекстКодаОписания + ИмяПеременной + "    = " + Формат(Значение, "ЧГ=0");
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания = ТекстКодаОписания + Формат(Значение, "ЧГ=0");            
        КонецЕсли;
        
        
    ИначеЕсли ТипЗначения = Тип("Неопределено") Тогда
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания = ТекстКодаОписания + ИмяПеременной + "    = Неопределено";
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания = ТекстКодаОписания +"Неопределено";            
        КонецЕсли;
        
        
        
    ИначеЕсли ТипЗначения = Тип("Булево") Тогда
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания = ТекстКодаОписания + ИмяПеременной + "    = " + Формат(Значение, "БЛ=Ложь; БИ=Истина");
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания = ТекстКодаОписания + Формат(Значение, "БЛ=Ложь; БИ=Истина");            
        КонецЕсли;
        
    ИначеЕсли ТипЗначения = Тип("ДопустимаяДлина") Тогда
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания = ТекстКодаОписания + ИмяПеременной + "    = ДопустимаяДлина." + Строка(Значение);
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания = ТекстКодаОписания + "ДопустимаяДлина." + Строка(Значение);
        КонецЕсли;
        
        
    ИначеЕсли ТипЗначения = Тип("ДопустимыйЗнак") Тогда
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания = ТекстКодаОписания + ИмяПеременной + "    = ДопустимыйЗнак." + Строка(Значение);
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания = ТекстКодаОписания + "ДопустимыйЗнак." + Строка(Значение);
        КонецЕсли;
        
        
    ИначеЕсли ТипЗначения = Тип("ЧастиДаты") Тогда
        
        ЗначениеСтрокой    = ?(Значение = ЧастиДаты.ДатаВремя, "ДатаВремя", Строка(Значение));
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания = ТекстКодаОписания + ИмяПеременной + "    = ЧастиДаты." + ЗначениеСтрокой;
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания = ТекстКодаОписания + "ЧастиДаты." + ЗначениеСтрокой;
        КонецЕсли;
        
        
    ИначеЕсли ТипЗначения = Тип("КвалификаторыСтроки") Тогда
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания    = ТекстКодаОписания + ИмяПеременной + "    = Новый КвалификаторыСтроки("
            + ТекстКодаОписанияЗначения(Значение.Длина, , 1).ТекстКодаОписания + ", "
            + ТекстКодаОписанияЗначения(Значение.ДопустимаяДлина, , 1).ТекстКодаОписания
            + ")";
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания    = ТекстКодаОписания + "Новый КвалификаторыСтроки("
            + ТекстКодаОписанияЗначения(Значение.Длина, , 1).ТекстКодаОписания + ", "
            + ТекстКодаОписанияЗначения(Значение.ДопустимаяДлина, , 1).ТекстКодаОписания
            + ")";            
        КонецЕсли;
        
        
        
    ИначеЕсли ТипЗначения = Тип("КвалификаторыЧисла") Тогда
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания    = ТекстКодаОписания + ИмяПеременной + "    = Новый КвалификаторыЧисла("
            + ТекстКодаОписанияЗначения(Значение.Разрядность, , 1).ТекстКодаОписания + ", "
            + ТекстКодаОписанияЗначения(Значение.РазрядностьДробнойЧасти, , 1).ТекстКодаОписания + ", "
            + ТекстКодаОписанияЗначения(Значение.ДопустимыйЗнак, , 1).ТекстКодаОписания
            + ")";
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания    = ТекстКодаОписания + "Новый КвалификаторыЧисла("
            + ТекстКодаОписанияЗначения(Значение.Разрядность, , 1).ТекстКодаОписания + ", "
            + ТекстКодаОписанияЗначения(Значение.РазрядностьДробнойЧасти, , 1).ТекстКодаОписания + ", "
            + ТекстКодаОписанияЗначения(Значение.ДопустимыйЗнак, , 1).ТекстКодаОписания
            + ")";            
        КонецЕсли;
        
        
    ИначеЕсли ТипЗначения = Тип("КвалификаторыДаты") Тогда
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания    = ТекстКодаОписания + ИмяПеременной + "    = Новый КвалификаторыДаты("
            + ТекстКодаОписанияЗначения(Значение.ЧастиДаты, , 1).ТекстКодаОписания + ")";
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания    = ТекстКодаОписания + "Новый КвалификаторыДаты("
            + ТекстКодаОписанияЗначения(Значение.ЧастиДаты, , 1).ТекстКодаОписания + ")";            
        КонецЕсли;    
        
        
    ИначеЕсли ТипЗначения = Тип("КвалификаторыДвоичныхДанных") Тогда
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания    = ТекстКодаОписания + ИмяПеременной + "    = Новый КвалификаторыДвоичныхДанных("
            + ТекстКодаОписанияЗначения(Значение.Длина, , 1).ТекстКодаОписания + ", "
            + ТекстКодаОписанияЗначения(Значение.ДопустимаяДлина, , 1).ТекстКодаОписания
            + ")";
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания    = ТекстКодаОписания + "Новый КвалификаторыДвоичныхДанных("
            + ТекстКодаОписанияЗначения(Значение.Длина, , 1).ТекстКодаОписания + ", "
            + ТекстКодаОписанияЗначения(Значение.ДопустимаяДлина, , 1).ТекстКодаОписания
            + ")";            
        КонецЕсли;    
        
        
        
        /////////////
        ///СЛОЖНЫЕ///
        /////////////
        
    ИначеЕсли ТипЗначения = Тип("Структура") Тогда        
        
        Если Значение.Количество() = 0 И ВидОписанияЗначения <> 2 Тогда
            
            ВидОписанияЗначения = 1;
            
            ТекстКодаОписания = ТекстКодаОписания + "Новый " + ТипЗначения;            
            
        Иначе
            
            СоответствиеОписаний    = Новый Соответствие;
            
            ВсеЗначенияПростогоОписания    = Истина;
            Для Каждого КлючИЗначение Из Значение Цикл            
                ОписаниеЗначения    = ТекстКодаОписанияЗначения(КлючИЗначение.Значение, КлючИЗначение.Ключ);
                СоответствиеОписаний.Вставить(КлючИЗначение.Ключ, ОписаниеЗначения);
                ВсеЗначенияПростогоОписания = ?(ВсеЗначенияПростогоОписания, ОписаниеЗначения.ВидОписанияЗначения = 1, Ложь);
            КонецЦикла;
            
            Если ВсеЗначенияПростогоОписания И ВидОписанияЗначения <> 2 Тогда
                
                ВидОписанияЗначения = 1;
                
                ТекстКодаОписания_Ключи        = "";
                ТекстКодаОписания_Значения    = "";
                
                ЭтоПервый    = Истина;
                Для Каждого КлючИЗначение Из СоответствиеОписаний Цикл                    
                    ТекстКодаОписания_Ключи        = ТекстКодаОписания_Ключи     + ?(ЭтоПервый, "", ", ") + КлючИЗначение.Ключ;
                    ТекстКодаОписания_Значения    = ТекстКодаОписания_Значения + ?(ЭтоПервый, "", ", ") + КлючИЗначение.Значение.ТекстКодаОписания;
                    ЭтоПервый    = Ложь;                    
                КонецЦикла;                
                ТекстКодаОписания = ТекстКодаОписания + "Новый " + ТипЗначения + "("
                + Кавычка + ТекстКодаОписания_Ключи + Кавычка + ", " + ТекстКодаОписания_Значения + ")";
                
            Иначе
                
                ВидОписанияЗначения    = 2;
                
                ТекстКодаОписания    = ТекстКодаОписания + ИмяПеременной + "    = Новый " + ТипЗначения;            
                
                Для Каждого КлючИЗначение Из Значение Цикл            
                    ОписаниеЗначения    = СоответствиеОписаний.Получить(КлючИЗначение.Ключ);
                    Если ОписаниеЗначения.ВидОписанияЗначения = 1 Тогда
                        ТекстКодаОписания    = ТекстКодаОписания + ";
                        |" + ИмяПеременной + ".Вставить(" + Кавычка + КлючИЗначение.Ключ + Кавычка + ", " + ОписаниеЗначения.ТекстКодаОписания + ")";
                    ИначеЕсли ОписаниеЗначения.ВидОписанияЗначения = 2 Тогда                
                        ТекстКодаОписания    = ТекстКодаОписания + ";
                        |
                        |" + ОписаниеЗначения.ТекстКодаОписания + ";
                        |" + ИмяПеременной + ".Вставить(" + Кавычка + КлючИЗначение.Ключ + Кавычка + ", " + КлючИЗначение.Ключ + ")";
                    Иначе
                    КонецЕсли;            
                КонецЦикла;
            КонецЕсли;        
            
            
        КонецЕсли;
        
    ИначеЕсли ТипЗначения = Тип("Соответствие") Тогда        
        
        Если Значение.Количество() = 0 И ВидОписанияЗначения <> 2 Тогда
            
            ВидОписанияЗначения = 1;
            
            ТекстКодаОписания = ТекстКодаОписания + "Новый " + ТипЗначения;            
            
        Иначе
            
            ВидОписанияЗначения    = 2;
            
            ТекстКодаОписания    = ТекстКодаОписания + ИмяПеременной + "    = Новый " + ТипЗначения;
            Сч                    = 0;
            Для Каждого КлючИЗначение Из Значение Цикл
                
                Сч    = Сч + 1;
                
                ИмяПеременной_Ключ        = ИмяПеременной + "_Ключ_" + Формат(Сч, "ЧГ=0");
                ИмяПеременной_Значение    = ИмяПеременной + "_Значение_" + Формат(Сч, "ЧГ=0");
                
                ОписаниеКлюча        = ТекстКодаОписанияЗначения(КлючИЗначение.Ключ, ИмяПеременной_Ключ);
                ОписаниеЗначения    = ТекстКодаОписанияЗначения(КлючИЗначение.Значение, ИмяПеременной_Значение);
                
                Если ОписаниеКлюча.ВидОписанияЗначения = 1 И ОписаниеЗначения.ВидОписанияЗначения = 1 Тогда
                    ТекстКодаОписания    = ТекстКодаОписания + ";
                    |" + ИмяПеременной + ".Вставить(" + ОписаниеКлюча.ТекстКодаОписания + ", " + ОписаниеЗначения.ТекстКодаОписания + ")";
                ИначеЕсли ОписаниеКлюча.ВидОписанияЗначения = 1 И ОписаниеЗначения.ВидОписанияЗначения = 2 Тогда                
                    ТекстКодаОписания    = ТекстКодаОписания + ";
                    |
                    |" + ОписаниеЗначения.ТекстКодаОписания + ";
                    |
                    |" + ИмяПеременной + ".Вставить(" + ОписаниеКлюча.ТекстКодаОписания + ", " + ИмяПеременной_Значение + ")";
                ИначеЕсли ОписаниеКлюча.ВидОписанияЗначения = 2 И ОписаниеЗначения.ВидОписанияЗначения = 1 Тогда                
                    ТекстКодаОписания    = ТекстКодаОписания + ";
                    |
                    |" + ОписаниеКлюча.ТекстКодаОписания + ";
                    |
                    |" + ИмяПеременной + ".Вставить(" + ИмяПеременной_Ключ + ", " + ОписаниеЗначения.ТекстКодаОписания + ")";
                ИначеЕсли ОписаниеКлюча.ВидОписанияЗначения = 2 И ОписаниеЗначения.ВидОписанияЗначения = 2 Тогда                
                    ТекстКодаОписания    = ТекстКодаОписания + ";
                    |
                    |" + ОписаниеКлюча.ТекстКодаОписания + ";
                    |" + ОписаниеЗначения.ТекстКодаОписания + ";
                    |
                    |" + ИмяПеременной + ".Вставить(" + ИмяПеременной_Ключ + ", " + ИмяПеременной_Значение + ")";
                КонецЕсли;
                
                
            КонецЦикла;        
            
        КонецЕсли;         
        
    ИначеЕсли ТипЗначения = Тип("Массив") Тогда
        
        Если Значение.Количество() = 0 И ВидОписанияЗначения <> 2 Тогда
            
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания = ТекстКодаОписания + "Новый Массив";
            
        Иначе
            
            ВидОписанияЗначения    = 2;
            
            ТекстКодаОписания    = ТекстКодаОписания + ИмяПеременной + "    = Новый Массив";
            Сч = 0;
            Для Каждого Элемент Из Значение Цикл
                Сч = Сч + 1;
                ИмяДляЭлемента    = ИмяПеременной + "_Элемент_" + Формат(Сч, "ЧГ=0");
                ОписаниеЗначения    = ТекстКодаОписанияЗначения(Элемент, ИмяДляЭлемента);
                Если ОписаниеЗначения.ВидОписанияЗначения = 1 Тогда
                    ТекстКодаОписания    = ТекстКодаОписания + ";
                    |" + ИмяПеременной + ".Добавить(" + ОписаниеЗначения.ТекстКодаОписания + ")";
                ИначеЕсли ОписаниеЗначения.ВидОписанияЗначения = 2 Тогда                
                    ТекстКодаОписания    = ТекстКодаОписания + ";
                    |
                    |" + ОписаниеЗначения.ТекстКодаОписания + ";
                    |" + ИмяПеременной + ".Добавить(" + ИмяДляЭлемента + ")";
                КонецЕсли;            
            КонецЦикла;        
            
        КонецЕсли;
        
        
        
        
    ИначеЕсли ТипЗначения = Тип("СписокЗначений") Тогда
        
        Если Значение.Количество() = 0 И ВидОписанияЗначения <> 2 Тогда
            
            ВидОписанияЗначения = 1;
            ТекстКодаОписания = ТекстКодаОписания + "Новый СписокЗначений";            
            
        Иначе
            
            ВидОписанияЗначения    = 2;
            
            ТекстКодаОписания    = ТекстКодаОписания + ИмяПеременной + "    = Новый СписокЗначений";
            Сч = 0;
            Для Каждого ЭлементСписка Из Значение Цикл            
                Сч = Сч + 1;
                ИмяДляЭлемента            = ИмяПеременной + "_Элемент_" + Формат(Сч, "ЧГ=0");
                ОписаниеЗначения        = ТекстКодаОписанияЗначения(ЭлементСписка.Значение, ИмяДляЭлемента);
                ОписаниеПредставления    = ТекстКодаОписанияЗначения(ЭлементСписка.Представление);
                ОписаниеПометки            = ТекстКодаОписанияЗначения(ЭлементСписка.Пометка);
                Если ОписаниеЗначения.ВидОписанияЗначения = 1 Тогда
                    ТекстКодаОписания    = ТекстКодаОписания + ";
                    |" + ИмяПеременной + ".Добавить(" + ОписаниеЗначения.ТекстКодаОписания + ", " + ОписаниеПредставления.ТекстКодаОписания + ", " + ОписаниеПометки.ТекстКодаОписания + ")";
                ИначеЕсли ОписаниеЗначения.ВидОписанияЗначения = 2 Тогда                
                    ТекстКодаОписания    = ТекстКодаОписания + ";
                    |
                    |" + ОписаниеЗначения.ТекстКодаОписания + ";
                    |" + ИмяПеременной + ".Добавить(" + ИмяДляЭлемента + ", " + ОписаниеПредставления.ТекстКодаОписания + ", " + ОписаниеПометки.ТекстКодаОписания + ")";
                КонецЕсли;            
            КонецЦикла;        
            
        КонецЕсли;
        
    ИначеЕсли ТипЗначения = Тип("Тип") Тогда
        
        МетаданныеТипа = Метаданные.НайтиПоТипу(Значение);
        Если МетаданныеТипа <> Неопределено Тогда
            ТипСтрокой = МетаданныеТипа.Имя;
        Иначе
            ТипСтрокой = СтрЗаменить(Строка(Значение), " ", "");
        КонецЕсли;    
        
        Если ВидОписанияЗначения = 2 Тогда
            ТекстКодаОписания = ТекстКодаОписания + ИмяПеременной + "    = Тип(" + Кавычка + ТипСтрокой + Кавычка + ")";
        Иначе
            ВидОписанияЗначения    = 1;
            ТекстКодаОписания = ТекстКодаОписания + "Тип(" + Кавычка + ТипСтрокой + Кавычка + ")";            
        КонецЕсли;
        
        
    ИначеЕсли ТипЗначения = Тип("ОписаниеТипов") Тогда
        
        Типы            = Значение.Типы();
        КоличествоТипов    = Типы.Количество();
        
        Если КоличествоТипов = 0 И ВидОписанияЗначения <> 2 Тогда
            
            ТекстКодаОписания = ТекстКодаОписания + "Новый ОписаниеТипов";
            ВидОписанияЗначения = 1;
            
        Иначе
            
            Если КоличествоТипов = 0 Тогда
                ТекстКодаОписания = ТекстКодаОписания + ИмяПеременной + "    = Новый ОписаниеТипов";
            Иначе
                Если КоличествоТипов = 1 И ВидОписанияЗначения <> 2 Тогда
                    ВидОписанияЗначения = 1;
                    ТекстОписанияЕдинственногоТипа    = ТекстКодаОписанияЗначения(Типы[0], 1).ТекстКодаОписания;
                    ТекстОписанияЕдинственногоТипа    = Сред(ТекстОписанияЕдинственногоТипа
                    , СтрДлина("Тип(") + 1
                    , СтрДлина(ТекстОписанияЕдинственногоТипа) - СтрДлина("Тип(") - СтрДлина(")"));
                Иначе
                    ВидОписанияЗначения = 2;
                    ИмяМассиваСТипами   = ИмяПеременной + "_МассивТипов";
                    ТекстКодаОписания    = ТекстКодаОписания + ИмяМассиваСТипами + "    = Новый Массив";
                    Сч = 0;
                    Для Каждого Тип Из Типы Цикл
                        Сч = Сч + 1;
                        ИмяТипаИзМассива    = ИмяМассиваСТипами + "_" + Сч;
                        ОписаниеТипа    = ТекстКодаОписанияЗначения(Тип, ИмяТипаИзМассива);
                        Если ОписаниеТипа.ВидОписанияЗначения = 2 Тогда
                            ТекстКодаОписания    = ТекстКодаОписания + ";
                            |
                            |" + ОписаниеТипа.ТекстКодаОписания + ";
                            |" + ИмяМассиваСТипами + ".Добавить(" + ИмяТипаИзМассива + ")";
                        Иначе
                            ТекстКодаОписания = ТекстКодаОписания + ";
                            |" + ИмяМассиваСТипами + ".Добавить(" + ОписаниеТипа.ТекстКодаОписания + ")";
                        КонецЕсли;
                    КонецЦикла;
                    ТекстКодаОписания = ТекстКодаОписания + ";
                    |"
 &nb
60 mistеr
 
21.09.14
18:24
(59) Как насчет г-кода? Мистовский парсер на твоем коде сломался. Это верный признак. :)