gifts2017

Декомпиляция элементов формы для 8.2 для обычных форм (не управляемых).

Опубликовал Станислав Турчинский (Istur) в раздел Программирование - Практика программирования

Декомпиляция отдельных элементов формы и самой формы в общем, для формирования кода для динамического вывода реквизитов.

Обработка предназначена для динамического формирования реквизитов при следующем алгоритме:

  1. Сначала выполняются работа по техническому заданию, реквизиты добавляются на форму.
  2. После принятия работ, с помощью данной обработки в режиме предприятия считывается код добавленных реквизитов, он добавляется в общий модуль или модуль формы.
  3. Добавленные реквизиты удаляются с формы, теперь они формируются из кода.

Обработка сделана на основе данной: http://infostart.ru/public/22147/, но имеет следующие отличия:

  1. Та обработка универсальна, данная же направлена на реализацию четко одной задачи, то есть подогнана по нее.
  2. Моя разработка работает гораздо быстрее.
  3. Декомпиляция производится только нужных элементов, а не всех, и потому не нужно выискивать нужные в итогом текстовом файле.
  4. Моя разработка выполнена на 8.2, предыдущая же на 8.1, что сейчас приводит к немного неверному формированию ее. Например в коде реализовано отсекание вывода свойств реквизитов, значение которых идентично стандартному. То есть у поля ввода есть свойство "АвтоКонтекстноеМеню", значение по умолчанию которого равно Истина, и если оно так и осталось равно Истина, то выводить его смысла нет. Но в 8.1 при проверке булевского реквизита возращалось строка "Истина", в 8.2 же возвращается "Да",поэтому в той обработке выводятся абсолютно все реквизиты.
  5. Перестроена логика, улучшена юзабилити.

Описание разработки: В левом дерево у метаданного выбирается нужная для декомпиляции форма, при этом в правом дереве формируется дерево элементов формы. При нажатии на галочки в правом дереве в табличном форме формируется код для для вывода элемента программно. Если нужно декомпилировать все элементы, то нажимается кнопка в нижней панели "Декомпилировать всю форму". Левое и правое дерево можно сдвигать, чтобы пространство для кода увеличивалось.

Вместо кода с присвоением длины, ширины, лево, вверх, выводится процедура " УстановитьПоложениеЭлемента(Надпись,25,19,322,103);", ее необходимо вставить в модуль с кодом вывода элементов формы, ну или поместить в общий модуль.


Процедура УстановитьПоложениеЭлемента(Элемент,Верх,Высота,Лево,Ширина)

   
Элемент.Верх = Верх;

   
Элемент.Высота = Высота;

   
Элемент.Лево = Лево;

   
Элемент.Ширина = Ширина;

КонецПроцедуры

Сделано, чтобы выводить меньшее количесто строк.

 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ДекомпиляцияЭлементовФормы.epf
.epf 28,16Kb
27.11.11
408
.epf 28,16Kb 408 Скачать

См. также

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

Комментарии

0. Станислав Турчинский (Istur) 28.11.11 10:18
Декомпиляция отдельных элементов формы и самой формы в общем, для формирования кода для динамического вывода реквизитов.

Перейти к публикации

1. Герман (German) 28.11.11 10:18
Что с определением цветов и шрифтов из стиля? :)
Знаю только одну обработку в которой это реализовано.
2. Станислав Турчинский (Istur) 28.11.11 10:44
(1) Нет, не реализовано. Мне пока это не нужно.
3. Сергей Ожерельев (Поручик) 28.11.11 11:00
(2) Добавь в описание, только для обычных форм.
4. Станислав Турчинский (Istur) 28.11.11 11:04
5. ValeriTim (ValeriTim) 28.11.11 11:24
(1) какая обработка это делает ?
6. Герман (German) 28.11.11 11:33
(5) Ei полное (ВЫПОЛНЯЕМОЕ) перобразование, позволяющее скопировать форму
7. Василий Зайцев (vasiliy_b) 29.11.11 09:51
Да, такую бы обработку для управляемых форм!
8. Алексей . (mamanelli) 29.11.11 09:59
Всё здорово, помогает экономить время на динамическом добавлении элементов в форму.
Плюс однозначно ;)
9. Сергей Ожерельев (Поручик) 29.11.11 10:09
(8) Нет, всё это знать не обязательно. Для этих целей есть СП, мануалы, шаблоны кода. Главное знать что искать и как искать.
AlexO; Andry.Boris; +2 Ответить 1
10. Алексей . (mamanelli) 29.11.11 10:39
(9) Ладно, не нападай :) От шаблонов кода очень часто остаются куски причудливой формы :D Или я после НЕ тех программистов работал ;)
11. Антон (woozee) 29.11.11 11:52
Понять не могу для чего она =) И чем полезна она будет))
12. Станислав Турчинский (Istur) 29.11.11 12:09
(11)Мне кажется в описании все написано. Ну а если другими словами, то обработка, чтобы добавленные программистом реквизиты, колонки, кнопки в типовых конфигурациях выводить программно, дабы при обновлении все это не затерлось, да и просто чтобы процесс обновления был быстрее и менее сложен.
13. Антон (woozee) 29.11.11 14:43
Да? Есть одна формочка стандартная суперпеределанная.... Надо проверить... Но суть не в этом) Идея (в моем случае) понравилась.
А привязки по форме в обычной форме тоже программно описывает?:)
14. Станислав Турчинский (Istur) 29.11.11 14:44
(13) Да, привязки описывает. Это одно из самых важных, как же без них)
15. Анатолий (Yasen) 29.11.11 15:12
Спасибо, плюс.
Ждем когда управляемые формы достигнут подобного уровня программизма )
16. Антон (woozee) 29.11.11 16:11
Не работает) Минус) В единственной сложной форме и то не пригодился))
1Ска виснет, нагрузка на комп возрастает до максимума, через продолжительное время вылетает.
Проблема в 573 строчке (Цикл) - то есть "зацикливание".

Ждем фикс) Или уже не ждем))
17. Станислав Турчинский (Istur) 29.11.11 16:15
(16) У меня не возникало подобное.. А какие значения в "СтрИсточник" в зацикливаемой строке? И что за форма?
18. Антон (woozee) 29.11.11 16:46
Бухгалтерия 2.0.29 СписниеСРасчетногоСчета.ФормаДокумента В СтрИсточник строка дерева =) Они там меняются эти деревья) Значения вроде адекватные, а что так долго - я не знаю. но в замере производительности оно зацикливается.
Форма Переделана в плане того что добавлена панелька с добавочной страницей, на эту панельку перенесена основная панелька, та самая с кучей страниц. Ну и пара полей добавлено )) Ну как то так)))
19. Алекс Ю (AlexO) 30.11.11 01:34
все делается намного проще.
копируется форма и меняется все что нужно, подключается паровозом к оснвоной.
а программно создавать - в любом случае никакие обработки не помогут.
Вообще, создание программно чего-либо и 1с - вещи несовместимые и чреваты ошибками и лажей.
Ну не предполагало 1с так делать, не предполагало....
Craig; 1cbit_tomsk; Redhatych; +3 1 Ответить 1
21. Антон (woozee) 30.11.11 09:19
(19) AlexO,
Идея программно добавлять нестандартные элементы намного проще чем постоянно отслеживать изменения в элементах формы. Что я и взял на вооружение. Правда перерисовывать то что у нас с этой формой - не представляю даже себе КАК))) Вернее... лениво даже представлять)
На счет паровозом к основной - Если документ не ахти какой, очень редко обновляется - то да, в какой то степени возможно. Дело в том что в этом случае сложно отслеживать изменения и гораздо чаще будут вылетать ошибки после обновления.
Самым правильным будет просто переносить свои кнопочки, поля и т.д. Ну и что, что это может занять продолжительное время - зато практически не возникают ошибок)
suggestive; CratosX; Istur; +3 Ответить 1
22. Станислав Турчинский (Istur) 30.11.11 12:41
(21) +1

(20)
Вообще, создание программно чего-либо и 1с - вещи несовместимые и чреваты ошибками и лажей.
Ну не предполагало 1с так делать, не предполагало....


Да ты что) А у меня проект, где все добавленные реквизиты выводятся программно, благополучно уже сдан и работает.

а программно создавать - в любом случае никакие обработки не помогут.

Ну во-первых цель обработки не сделать вместо программиста, а облегчить, точнее ускорить добавление. Нужно понимание как программно выводить, тогда поможет.

все делается намного проще.
копируется форма и меняется все что нужно, подключается паровозом к оснвоной.


Проще? Неожиданно) Это по сути значит, что форма будет отключена от обновлений, то есть само действие не имеет никакого смысла. Это тоже самое, что при обновлении у формы снимать флажок обновления. И рано или поздно возникнут проблемы, потому что что-либо добавлять нужно обычно в часто используемых объектах метаданных, обновления для которых приходят если не каждый релиз, то через релиз.
23. Антон (woozee) 30.11.11 14:49
(22) Istur, Мне можно надеятся на испралвение ошибки "зацикливания", или забить?:)
24. Станислав Турчинский (Istur) 30.11.11 14:59
(23) Да, исправлю. Единственное сейчас запар некоторый на работе, но до конца недели точно время найду.
25. o.nikolaev.infostart (o.nikolaev) 30.11.11 22:03
Вот все-таки, для чего это может пригодиться? Неужели нельзя обойтись без генерации кучи кода? Что касается форм объектов - ну это понятно - создаются создаются доп. формы журналов (списков) в них отлавливается "ПриВыборе" и открывается "своя" форма объекта. Какая ситуация может потребовать использования такого подхода при доработке типовой конфигурации с возможностью сохранения обновлений?
26. Алекс Ю (AlexO) 30.11.11 23:43
(22) собственно, в (25) вам ответили. Там как один из вариантов подключения допформы.
Основная форма остается для обновлений, где-то (можно перед открытием основной формы - при обновлении обновлять спокойно с закрытыми глазами, только потом вставить строчку обратно переключения-ответвления на допформу) вставляется переключатель, допформа один-в-один с основной+изменения, какие надо было внести.
Пользователь открывает как обычно, получает "родную" по внешнему виду форму с доработкой, старая остается нетронутой и лежит, ждет последующих обновлений.
Допформу, кстати, не обязательно пихать в документ, а оставить отдельной обработкой в конфе (и затираться она не будет), а подключать её именно как форму, с сохранением всех остальных событий и процедур родного документа.
(25) такое может потребоваться как раз там, где нужно и обновления ставить "неглядя", и все-таки внести изменения в "типовую" форму. Т.е. совместить несовместимое.
Что и удается.
(22) а все программно выводимые реквизиты... механизм отслеживания изменений - отсутствует (кроме визуального восприятия), механизм проверки и контроля создаваемых программно элементов - отсутствует, набор инструментов для создания таких якобы "программных" элементов (на самом деле - это создание куцых "вроде поля"-элементов, как и все полууправляемые или совсем неуправляемые ЭУ в 1С) - отсутствует.
В конце концов, будет куча кода, который рухнет под собственной тяжестью.
"сдал проект".. Сдать - полдела, еще и сопровождать это надо. А от этого, я так понимаю, вы самоустранились.
Прекрасно понимая, что снова разгребать кучу кода от "программно создаваемых элементов" - занятие не для слабонервных.
27. o.nikolaev.infostart (o.nikolaev) 01.12.11 07:14
(26)
Ну видимо как-то так, да - "совместить несовместимое". И склоняюсь к тому что эту стратегию можно рекомендовать для применения как раз в таком случае - "впихнуть невпихуемое", а в случае когда есть возможность создать доп. формы (обработки с дин. списками и etc.) все же следует создавать объекты, используя префиксы, общие модули и т.п.
---
Мнение мое и не обязательно правильное.
28. vkr (vkr) 01.12.11 07:39
По-моему, предложенный автором метод - прекрасный вариант компромисса для вечно загруженного 1С-программера ! :)
Лично я обязательно начну постепенно использовать - задолбало каждый раз свои "кнопки" перегонять в новый билд...
29. Антон (woozee) 01.12.11 09:45
Спорить можно бесконечно))
Всем известно что для решения задачи присутствует разновсяческое множество вариантов. От кривых до идеально правильных, оптимизированных и прям супер-пупер...
Для проектирования своего нововведения или "хотелок" пользователей нужно учитывать не только легкость обновлений, быстродействие, но и самым важным будет удобство пользователей в работе с энтим инструментом)) При этом учитывать эргономичность формы, и не потерять производительность работы.
Чем хороша данная обработка - посидел, потыкал кнопки, скопировал код, описал красиво комментариями и забыл до УФ))
С сопровождением кода проблем не будет никаких. Проблемы возникают только у тех фирм которые сопровождаются у фирм-франчайзи которые имеют штат неопытных сотрудников, либо фирм которые наняли "сопроводителя" "подешевле". Но это другая история))
30. Илья (i132) 01.12.11 17:05
(26) Идея: для обновлений оставить Основную форму (без визуальных изменений) а добавленные реквизиты хранить на форме _дополнительные - и добавлять при открытии обходом всех элементов этой формы.
:удобно тем что видно на глаз новые реквизиты и легко изменить их положение.
31. Алекс Ю (AlexO) 01.12.11 22:48
(28) vkr,
как раз нисколько не прекрсаный, вам предложен более простой и надежный, а главное - сопровождаемый метод.
Не понимаете - так и скажите.
(29) woozee,
>> Чем хороша данная обработка - посидел, потыкал кнопки, скопировал код, описал красиво комментариями и забыл до УФ))
С сопровождением кода проблем не будет никаких. Проблемы возникают только у тех фирм которые сопровождаются у фирм-франчайзи которые имеют штат неопытных сотрудников, либо фирм которые наняли "сопроводителя" "подешевле".
- ну что ж, остается вам пожелать получить срочное задание по доработке/исправлению вот после такого же программиста "а че тут непонятно, если не можешь разобрать программно <мной> созданные формы - ты дурак".
А 1С специально сделана, чтобы путать всех и вся. И не надейтесь, что вас кто-то пожалеет и будет писать "как вам удобно/известно". 1с-ники - в большинстве народ малограмотный.
32. Антон (woozee) 02.12.11 09:23
(31) AlexO,
>> "а че тут непонятно, если не можешь разобрать программно <мной> созданные формы - ты дурак"

Самое интересное что есть доля правды))) Дело в том что есть некий стандарт разработки, предложения от 1С. Все эти материалы находятся на диске ИТС. Если хотя бы о них догадываться и если еще немного и почитывать, то разбираться в стандартных конфигурациях, и в коде тех программистов которые хотя бы примерно им придерживаются - проблем особых не возникает))

......
//Программист =========
  ДобавитьПрограммноЭлементыФормы();
//Программист =========
......

//Программист =========
Процедура ДобавитьПрограммноЭлементыФормы()

  //Поле ввода и Надпись ФизЛица
  ......

  //Поле ввода и Надпись Договора
  ......

КонецПроцедуры
//Программист =========
...Показать Скрыть


Чего сложного?:)

(30) Дело в том что бывает добавлена страница в панельке без отображения заголовков этих страниц. Либо забываешь привязать процедурку к стандартному реквизиту, например, ПриИзменении... ПриВыборе
CratosX; vkr; +2 Ответить 1
33. Алекс Ю (AlexO) 02.12.11 22:27
(32) woozee,
1с сама же и нарушает везде и свюду свои "правила".
потому у 1с главное правило - никаких правил...
34. vkr (vkr) 05.12.11 08:21
(31),(33) Вот уж никогда не придерживался "стандартов разработки" от 1С...
Могу посоветовать Вам прочесть прекрасную книгу :
Мифический человеко-месяц или Как создаются программные системы
(The mythical Man-Month: Essays on Software Engineering)
Автор: Фредерик П. Брукс
Издание 1975 или 2010 г.
Надеюсь, она Вам будет полезна...
35. Алекс Ю (AlexO) 06.12.11 21:51
(28) vkr,
а и не перегоняйте, сделайте, как я советую в (26) ))
и просто, и обновлять больше не надо.. разве что изменится сама "родная" форма-родитель, и вам захочется сделать "потомка" снова на неё похожим..
(30) i132,
что за форма "Дополнительные"? предлагаете создать новую форму, хранить на ней некие новые реквизиты, потом программно считывать их оттуда и вставлять программно же на старую форму?
а зачем вся эта длиннющая цепочка? а если "порвется" где-нить - как отследите, что перестало работать?
(34) vkr,
теория программирования, теории обработки БД, хранения данных, и 1с - несовместимы ))
это уже известно давно с выходом снежка...
(0) рано или поздно возникнут проблемы как в (18), т.к всегда "остаются куски причудливой формы", все эти программные изыски неуниверсальны в силу уже указанной причины - ребята, это не Си, а 1С, которая плевать хотела на все правила, стандарты и развитие программирования, а с выходом 8.2 - и вообще плевать на программиста..
36. Алекс Ю (AlexO) 06.12.11 22:09
хотя у меня есть идея, где все это "программное" чудо пригодится... как раз для "чистого" творчества нужно...
только боюсь, даже в условиях ограниченных требованиях, которые я предъявлю, программное формирование элементов от 1С не выйдет из своих жестких рамок..
А декомпилировать всю форму со всеми элементами из=за обновлений, чтобы добавить один-два новых элементов на форму..
А почему никто не попробовал сделать как предложено в (30) - добавлять только нужные, и привязками/размещением играть?
хотя сами элементы могут сместится на новой форме.... а это уже никак не отследишь программно - или писать целый механизм сравнений и корректировок..
короче, я вам способ подсказал, но можете все делать программно ))
а я попробую в том механизме, где это действительно нужно и очень важно...
37. Алекс Ю (AlexO) 06.12.11 22:14
слушай, Истур, а это ведь ты натолкнул меня на мысль со своей идеей дискретно декомпилировать.. хотя и так вроде было на поверхности, а вот поди ж ты... ))
надоть тебе плюсик за это поставить...
Так проблема из (18) поправлена?
если можно, пришли исправленный вариант по личке... а то тут с этими ограничениями замучаешься качать...
38. vkr (vkr) 07.12.11 08:39
(35) Да, я с Вами согласен по поводу идеологической несовместимости 1С с нормальными принципами...
Хотя, по мере возможности, борюсь у себя с этой проблемой (пусть даже за счет некоторых потерь сил и нервов).
Спасибо за диалог! :)
39. Антон (woozee) 07.12.11 09:06
(37) AlexO, странно, муза под конец рабочего дня приходит =)
40. Алекс Ю (AlexO) 07.12.11 22:48
(38) vkr,
с 1с бороться бесоплезно ))
примените стиль айкидо - уйти с линии удара и пусть валится...а как упадет - можно диктовать свои условия.. ))
(39) woozee,
что-то путное на 1с можно изобрести только абстрагировавшись от 1с ))
42. Александр Крынецкий (echo77) 10.12.11 13:45
При добавлении колонки в ТабличноеПоле метод УстановитьДействие не прокатывает :-/

Было бы неплохо накидать справку в обработке, подобную той что вы здесь привели
43. vkr (vkr) 12.12.11 08:21
(40) Спасибо, Вы очень точно сформулировали методику взаимоотношений с 1С... :)
Буду теперь знать, как это называется...
Только на диктовку им условий мне начхать - я работаю по-своему, клиенты довольны - это главное...
44. Sverkalov Сверкалов (Sverkalov) 28.12.11 22:09
45. Алекс Ю (AlexO) 24.01.12 02:23
(44) что-то сомнительно... в тонком же это невозможно в принципе - так откуда "для управляемых форм"??
46. Василий Зайцев (vasiliy_b) 24.01.12 09:04
(45) Почему же невозможно? Программно добавлять элементы на форму можно?! Обходить все элементы формы можно?! так почему же это нереально?
47. Алекс Ю (AlexO) 25.01.12 01:32
(46) в УП нельзя. УФ формируются динамически, поэтому программно ничего добавить нельзя.
Только если в режиме толстого клиента.
48. Василий Зайцев (vasiliy_b) 25.01.12 09:10
(47) AlexO, А как же тогда реализован вывод реквизитов свойств объектов на формы? В типовых конфигурациях в управляемых формах? Прежде чем говорить посмотрите сначала УТ 11 например, в справочник номенклатур добавьте пару свойств.... и о чудо дядьки из 1с прибегут и добавят вам эти реквизиты к объекту, чтоб они динамически сформировались.... а потом еще будут прибегать когда вы будете обновления накатывать.
49. Анатолий (Yasen) 25.01.12 12:48
(47) AlexO,
программно ничего добавить нельзя

Откуда такие сведения если не секрет? Религия не позволяет или Нуралиев запретил?
50. Василий Зайцев (vasiliy_b) 27.01.12 10:51
Ошибка: Берем ТЧ документа, добавляем новый реквизит(я добавлял типа число (15,3)) далее выводим эту колонку на форму привязываем событие "ПриИзменении", и добавляем изменение цвета при выводе строки.
Декомпилируем эту колонку и получаем следующие ошибки:
Было:
Колонка.УстановитьДействие("ПриИзменении",Новый Действие("Товары_БруттоПриИзменении"));

Надо
Колонка.ЭлементУправления.УстановитьДействие("ПриИзменении",Новый Действие("Товары_БруттоПриИзменении"));

...

Было
Колонка.ЭлементУправления.ТипЗначения = Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,3));
Это не нужно, ругается т.к. тип уже назначен. И еще нужно добавить:
Колонка.Имя = "_Брутто"
Иначе имя колонки добавляет "Колонка1"
51. Алекс Ю (AlexO) 29.01.12 15:17
(48) да, ошибся, извините.
Думал, только невизуальные реквизиты можно.
Посмотрел, добавлять можно, но что-то все через ж.. происходит с результатом..
52. Илья Олегович Червяков (amiralnar) 02.02.12 16:31
Отличная обработка, спасибо! Пол года о ней мечтал. Ну теперь - держись, УПП =)
53. Илья Олегович Червяков (amiralnar) 08.02.12 17:02
Есть проблема:

Для декомпиляции выбираю форму реализации товаров и услуг.
При работе через терминал (возможно это важно) подвисает на процедуре ДеревоЭлементовФормыПриПолученииДанных(Элемент, ОформленияСтрок)
За 5 секунд успевает выполнить эту процедуру 85 000 раз.

Пока отключаю процедуру и ориентируюсь по пустым строкам.

Можно ли при построении дерева сразу указать представление ячеек?
54. Андрей Д. (bambr1975) 08.02.12 21:26
(0),(53) - алгоритм этой обработки очень пригодился в написании главного алгоритма публикации http://infostart.ru/public/106310/
поэтому, рискну здесь привести свои корректировки процедуры модуля обработки СформироватьДеревоСЭлементамиФормы :

Для каждого СтрДерева Из МассивСтрок Цикл
Панель = СтрДерева.Элемент;
ИмяПанели = Панель.Имя;
Для каждого СтраницаПанели Из Панель.Страницы Цикл
пФормаКопия.ЭлементыФормы[ИмяПанели].УстановитьДействие("ПриСменеСтраницы", Неопределено);
пФормаКопия.ЭлементыФормы[ИмяПанели].Страницы.Удалить(0);
Для каждого Стр1Уровня Из ДеревоЭлементовФормы.Строки Цикл
Если пФормаКопия.ЭлементыФормы.Найти(Стр1Уровня.Элемент.Имя)=Неопределено Тогда
Если Стр1Уровня.ПарситьСтраницы<>ложь тогда
//в процедуре "ПередОткрытием" модуля формы обработки добавил колонку в дерево элементов формы
//КолонкиДерева.Добавить("ПарситьСтраницы",Новый ОписаниеТипов("Булево"));
//Еще - в самом начале процедуры СформироватьДеревоСЭлементамиФормы в начало цикла добавил
//Стр1Уровня.ПарситьСтраницы=истина;

Если Стр1Уровня.Страница = Неопределено Тогда
Стр1Уровня.Страница = СтраницаПанели.Имя;
Стр1Уровня.Панель=ИмяПанели;
Стр1Уровня.ПарситьСтраницы=ложь;

КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;

//пФормаКопия.ЭлементыФормы.Удалить(Панель);
//Для каждого Стр1Уровня Из ДеревоЭлементовФормы.Строки Цикл
// Если пФормаКопия.ЭлементыФормы.Найти(Стр1Уровня.Элемент.Имя)=Неопределено Тогда
// Если Не ЗначениеЗаполнено(Стр1Уровня.Панель) или Стр1Уровня.ТипЭлемента = "Панель" Тогда
// Стр1Уровня.Панель = ИмяПанели;
// КонецЕсли;
// КонецЕсли;
//КонецЦикла;

КонецЦикла;

Строки1Уровня = ДеревоЭлементовФормы.Строки;
ПослСтрока = Строки1Уровня.Количество()-1;
Для Сч = 0 По ПослСтрока Цикл
ТекСч = ПослСтрока-Сч;
ТекСтрока = Строки1Уровня[ТекСч];
Если ЗначениеЗаполнено(ТекСтрока.Страница) Тогда
СтрРодитель = Строки1Уровня.Найти(ТекСтрока.Панель+"_"+ТекСтрока.Страница,"ПолноеИмя",истина);
//было СтрРодитель = Строки1Уровня.Найти(ТекСтрока.Страница,"ИмяЭлемента",Истина);
НовСтр = СтрРодитель.Строки.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр,ТекСтрока);
ПеренестиПодчиненныеСтроки(НовСтр,ТекСтрока);
Строки1Уровня.Удалить(ТекСч);
КонецЕсли;
КонецЦикла;

В случае этих корректировок зависания (по крайней мере, у меня) не происходит. Структура дерева элементов формы тоже, по-моему, не страдает.
HolodZar; zqzq; wing; Cerberdm; Vida; amiralnar; +6 Ответить 5
55. kiruha Дронов (kiruha) 15.03.12 05:00
Возможно ли от программно созданной формы перейти к непрограммно ?
Шаг обратный декомпиляции, чтобы клиенту высылать стандартную, нединамическую ?
56. Алекс Ю (AlexO) 30.03.12 17:38
(55) kiruha,
нет, невозможно - механизма превращения кода 1с в "физический" объект с записью в конфигурацию (на диск) не существует.
Впрочем, в 1с8 в принципе нет выгрузки объектов интерфейса отдельно.
Даже просто создания махонького реквизита для хранения данных у объекта.
Это привет вам от Великого Отсутствия ООП в 1с ))
Если же вы про превращение УФ в обычную форму - тоже невозможно автоматически.
57. Алекс Ю (AlexO) 30.03.12 18:08
(22) Istur,
Да ты что) А у меня проект, где все добавленные реквизиты выводятся программно, благополучно уже сдан и работает.

ну, и как обновляете модуль формы со всеми процедурами обработки таким образом созданных элементов?
58. Алекс Ю (AlexO) 30.03.12 18:11
(8) mamanelli,
ведь нормальный кодер должен знать это "на кончиках пальцев"

ждем статью, где все, что надо будет знать программисту "на кончиках пальцев", будет описано и выложено в коде, набранном именно таким же методом - без справки по памяти ))
59. rasswet (rasswet) 31.03.12 10:03
при попытке разобрать форму (устанавливаем курсор на форму элемента в дереве слева) в ЗУП релиз 47 (командировки организаций) падает сеанс 1С:Предприятие 8.2 (8.2.15.301)
60. Алекс Ю (AlexO) 31.03.12 14:59
(48) vasiliy_b,
в справочник номенклатур добавьте пару свойств.... и о чудо дядьки из 1с прибегут и добавят вам эти реквизиты к объекту, чтоб они динамически сформировались....

ну и где же динамически добавленные "реквизиты"? уж не хранятся ли они в строго ограниченных регистрах свойств объектов?
вы или ваши дядьки из 1с сделате так, чтобы "программно созданный" реквизит хранил данные, а не просто использовался для подстановки предопределенных значений??
61. Алекс Ю (AlexO) 31.03.12 15:00
62. Алекс Ю (AlexO) 31.03.12 17:46
В УПП в справочнике Проекты при выборе ФормыЭлемента - вылет.
63. rasswet (rasswet) 31.03.12 20:22
(61) ну..не совсем..другой парсер с этого сайта парсит без ошибки.
но мне нравится работать с тем, который тут. а он валится.
64. Андрей Д. (bambr1975) 31.03.12 20:59
(63) rasswet, попробуйте слегка поправить код (как описано в (54)) - может, поможет ;)
65. Алекс Ю (AlexO) 01.04.12 01:11
(62) нашел проблему (вариант решения в части определения родителя в (54)):
модуль объекта, в процедуре СформироватьДеревоСЭлементамиФормы:
строку
СтрРодитель = Строки1Уровня.Найти(ТекСтрока.Страница,"ИмяЭлемента",Истина);	//поиск по уникальным значениям

заменить на:
			//если элементы имеют одинаковое название - то сам элемент может стать своим "родителем",
			//и тогда далее в рекурсивной процедуре "ПеренестиПодчиненныеСтроки" произойдет зацикливание.
			//Поэтому необходимо применить поиск по неуникальным значениям в коллекции дерева.
			ПараметрыОтбораРодителей = Новый Структура ("ИмяЭлемента", ТекСтрока.Страница);
			НайденныеРодители = Строки1Уровня.НайтиСтроки(ПараметрыОтбораРодителей, Истина);	//массив найденных родителей с одинаковыми именами
			Если НайденныеРодители.Количество() > 1 Тогда
				//если среди найденых "родителей" кроме самого родителя и элемента будут еще "родители" (элементы с тем же именем),
				//то делаем родителем первого найденного:
				Для Каждого СтрокаРодитель Из НайденныеРодители Цикл
					Если НЕ СтрокаРодитель = ТекСтрока Тогда
						//нашли ссылку на родителя:
						СтрРодитель = СтрокаРодитель;
						Прервать;
					КонецЕсли;
				КонецЦикла;
			Иначе
				СтрРодитель = Строки1Уровня.Найти(ТекСтрока.Страница,"ИмяЭлемента",Истина);	//поиск по уникальным значениям
			КонецЕсли;
...Показать Скрыть


Проблема в том, что некоторые элементы и их родители могут называться одинаково (например, как в справочнике "Проекты": страница и ПолеВвода - оба элемента называются "Описание", но один является контейнером, а другой - нет), и тогда уникальным поиском находилось первое значение, которое могло оказаться отнюдь не родителем, а самим элементом (с тем же названием), и тогда в рекурсивной процедуре ПеренестиПодчиненныеСтроки происходило зацикливание (элемент сам себе бесконечно добавлял "подчиненную" строку).
Код выше (получилось с оговорками - вопрос, если кроме родителя и самого элемента будут еще элементы с таким же именем, то за "родителя" будут принят первый расположенный по списку и "не-ТекСтрока" элемент.

Остался непонятным еще вопрос. Зачем в цикле
	Для каждого СтрДерева Из МассивСтрок Цикл
		Панель = СтрДерева.Элемент;
		ИмяПанели = Панель.Имя;
                .....
	КонецЦикла; 
...Показать Скрыть

заполняется "Стр1Уровня", когда в конце все равно переменная перезаполняется данными дерева:
Строки1Уровня = ДеревоЭлементовФормы.Строки;


Но еще постоянно ошибка в попытке (не знаю, критично или нет для результата?):
Процедура "ДобавитьДействие"
Ошибка времени выполнения, стр 140
Ошибка при вызове метода контекста "ПолучитьДействие".

Исправленный файл обработки с изменениями из (54):
Прикрепленные файлы:
ДекомпиляцияЭлементовФормы(испр).epf
66. rasswet (rasswet) 03.04.12 20:20
(65) спасибо, завтра протестирую на той же форме.
67. rasswet (rasswet) 04.04.12 16:05
(65) протестировал ваш файл.
теперь не виснет. но есть Ошибка
{ВнешняяОбработка.ДекомпиляцияИАнализФорм.МодульОбъекта(165)}: Поле объекта не обнаружено (Верх)
мТекст.ДобавитьСтроку(Таб + СтрокаПробелов + "УстановитьПоложениеЭлемента(" + ТекстЭлементДляРазмеров + "," +
68. rasswet (rasswet) 04.04.12 16:09
(65) уточню. ошибку выводит когда ставлю Флаг напротив "работники организации" табличное поле. и при полном анализе формы. на других элементах ошибку не выдает.
69. Алекс Ю (AlexO) 06.04.12 12:11
(67) rasswet,
я не знаю, что у вас за конфигурация, и что за объект "Работники организаций", в котором есть некое ТабличноеПоле.
Поэтому здесь не помогу ничем.
По поводу
Поле объекта не обнаружено (Верх)

- у распарсиваемого объекта нет свойства "Вверх", которое ищет обработка и пытается изменить.
70. rasswet (rasswet) 06.04.12 14:06
(69) зуп конфигурация. немного измененная..
71. Алекс Ю (AlexO) 10.04.12 15:10
(68) rasswet,
когда ставлю Флаг напротив "работники организации" табличное поле. и при полном анализе формы

если эти "Работники организаций" - это регистр сведений, то в типовой ЗУП ошибок нет.
72. Дандронтий Крузенштерн (dandrontiy) 10.04.12 15:22
Идея интересная. А вот бы обработку, которая из <неуправляемой> формы создавала <управляемую>
73. rasswet (rasswet) 10.04.12 15:42
(71)это документ "командировки организаций", табличная часть его называется "работники организации"
74. Алекс Ю (AlexO) 10.04.12 17:41
(72) dandrontiy,
1c в принципе "не предусмотрела" таких конвертаций и механизмов для этого не вводила в платформу.
75. Алекс Ю (AlexO) 10.04.12 17:48
(73) rasswet,
ругается на поля ТП.
Поля "ОсвобождатьСтавку" и "НапомнитьПоЗавершении" - имеют тип булево (флажки), и, видимо, с этим и связано "непонимание" обработки. Остальные поля с дургими типами - отрабатывают.
76. Дандронтий Крузенштерн (dandrontiy) 11.04.12 11:25
(74) AlexO, Так я про это и говорю.
НО наверно можно собрав информацию о всех элементах формы попытаться создать кучу областей на управляемой форме, куда накидать такие же элементы. просто количество вложенных областей получится очень большим, и вручную такую работу проделать просто нереально.
77. Алекс Ю (AlexO) 12.04.12 18:11
(76) dandrontiy,
это вы про чисто механическую обработку визуальных элементов, которые и в 8.1, и в 8.2 - основаны у 1с на одних и тех же сишных бибилиотеках.
А с кодом-то что будете делать? или у вас форма будет работать и функционировать без кода формы? :)
78. Ю М (mtv:)) 23.04.12 08:57
(0) Наткнулся на ограничения программной генерации элементов формы:

1. В ФормеДокумента у ПоляВвода невозможно программно задать "Связь по владельцу".
2. В ФормеСписка при программной вставке Колонки в ТабличноеПоле, в диалоге "Отбор и сортировка" отсутствует втавленная Колонка.

Пока только это, возможно есть и другие ограничения.
79. Роман Сюзев (sorb) 25.04.12 08:40
Отличная обработка, нередко ей пользуюсь.

На днях столкнулся с такой проблемой: при попытке анализа формы обработки "ПанельФункций" из БП 2.0 словил ошибку:
{ВнешняяОбработка.ДекомпиляцияИАнализФорм.МодульОбъекта(490)}: Поле объекта не обнаружено (Имя)
				Если пФормаКопия.ЭлементыФормы.Найти(Стр1Уровня.Элемент.Имя)=Неопределено Тогда
В отладчике видно следующее:
Стр1Уровня.Элемент = Панель (Тип Панель)
Стр1Уровня.Элемент.Имя = "Поле объекта не обнаружено (Имя)"
Стр1Уровня.ИмяЭлемента = "ПанельПериод"

Теперь вопросы :) :
1. Кто-нибудь пробовал анализировать данную конкретную форму? Если да, то возникала ли такая ошибка?
2. Из кода видно, что вложенность панелей не учитывается. Правильно ли я понимаю, что это и послужило причиной ошибки?

P.S. Шибко ковыряться сейчас нет времени, поэтому буду благодарен за любую помощь.
80. Алекс Ю (AlexO) 26.04.12 23:54
Вот и пришло время начать говорить о том, что НЕЛЬЗЯ сделать программно.
Нельзя создавать стандартные кнопки - Добавить, Переместить, Сортировать и т.д.
Потому как нужно задавать действие, а его как такового не существует - пока не создана панель с кнопками. Т.е. в платформу не вшиты события стандартных кнопок, на которые можно было бы сослаться - они генерируются при создании элемента. Создаешь панель - создаются кнопки и события. Либо можно сослаться на уже созданные кнопки, но только если они есть. АвтоЗаполнение компанели, кстати, тоже не работает при программном создании.
Это ответ 1с - ООПу и наследованию классов.
И даже программное создание своих кнопок - требует, чтобы события обработки действий находились в модуле формы, иное не работает ни при каких обстоятельствах (ссылки на форму/другие формы - бесполезны).
В 8.2 на УФ данную проблему можно обойти (создавать стандартные кнопки в своих панелях), но там свои проблемы - с размещением кнопок и далеко не в каждой пользовательской панели их можно разместить.
81. Алекс Ю (AlexO) 27.04.12 01:45
Далее. Нельзя программно переместить элемент с одной вкладки на другую.
Все интереснее и чудесатее..
82. Алекс Ю (AlexO) 27.04.12 02:19
(28) vkr, (29) woozee,
вот и прошел мой пример испытание временем ))
Попробуйте программно создать вкладку, ТП на ней, компанель к ней.... на последнем пункте все и рушится.
Нельзя создать такую панель.
А работает единственный мой способ с подменой формы.
Так что программное создание элементов, мягко говоря, оченьо узкое и специализированное занятие.
(22) Istur,
Да ты что) А у меня проект, где все добавленные реквизиты выводятся программно, благополучно уже сдан и работает.

значит, ничего серьезного не делали программно ))
Вот даже элементарную стандартную панель нельзя сделать ))

Upd:
Ниже разобрались, что можно сделать создание КП через общий модуль (но не глобальный), заработало автозаполнение (почему не работало - причина осталась неясна), и без хранения исходной КП с кнопками на родительской форме.
83. Андрей Д. (bambr1975) 27.04.12 10:00
(82) AlexO, честно говоря, Вы производите впечатление человека неглупого, но какого-то ни во что не верящего и ужасно невнимательного.
Специально для Вас смоделирована ситуация с программным добавлением табличного поля и автозаполнением связанной с ним командной панели.
P.S. Ограничения в программном добавлении элементов на форму безусловно есть - но и ручную обработку поступающей информации тоже никто не отменял - просто можно же себе жизнь упростить...
Прикрепленные файлы:
ВнешняяОбработка1.epf
84. Алекс Ю (AlexO) 27.04.12 17:42
(83) именно это и пробовал - и в модуле формы, и в общем модуле:
     КоманднаяПанель = ЭлементыФормы.КоманднаяПанель2;
     КоманднаяПанель.ИсточникДействий = ЭлементыФормы.ТабличноеПоле1;
	 КоманднаяПанель.Автозаполнение=Истина;

- не работает...
Сейчас вообще ругается - "Перменная не определена: ГраницаЭлементаУправления".
В общем, веселая у меня база...
85. Андрей Д. (bambr1975) 27.04.12 17:50
(84) AlexO, источник действий - существующий реквизит формы (он у Вас существует? Проверьте!)
ГраницаЭлементаУправления - системное перечисление. Доступно в толстом клиенте. Вы в толстом клиенте работаете?
Короче - разобраться можно... Если понимать, зачем Вам это...
86. Алекс Ю (AlexO) 27.04.12 17:59
(85) bambr1975,
источник действий - существующий реквизит формы

мы же его (ТабличноеПоле) полностью программно создаем? или все-таки должно быть уже в реквизитах формы - реквизит табличное поле?
. Доступно в толстом клиенте

я знаю, что это системное перечисление. Как и "ТипКнопкиКоманднойПанели".
Все работало, а потом - раз, и "не видит" перечислений...
Работаю конечно в толстом. Все уже проверил (сама думал - вдруг слетело).
87. Алекс Ю (AlexO) 27.04.12 18:04
(83) bambr1975,
вот, кстати, мой идентичный неработающий код:
	КоманднаяПанель = ЭлементыФормы.Добавить(Тип("КоманднаяПанель"),"кпПроект",Истина,ЭлементыФормы.Панель1);
	УстановитьПоложениеЭлемента(КоманднаяПанель,10,25,6,380);
	КоманднаяПанель.ИсточникДействий = ЭлементыФормы.тпМенеджеры;
	КоманднаяПанель.УстановитьПривязку(ГраницаЭлементаУправления.Низ,КоманднаяПанель,ГраницаЭлементаУправления.Верх);
	КоманднаяПанель.УстановитьПривязку(ГраницаЭлементаУправления.Право,ЭтаФорма.Панель,ГраницаЭлементаУправления.Право);
	КоманднаяПанель.АвтоЗаполнение = Истина;
...Показать Скрыть

тпМенеджеры - до этого программно созданное ТП.
88. Андрей Д. (bambr1975) 27.04.12 18:05
Реквизиты формы должны находиться на закладке "Реквизиты" у формы. Их программно создавать у нас не получится (в этом и есть ограничение. А вот ЭЛЕМЕНТЫ ФОРМЫ, связать с реквизитами и назначить им свойства - пожалуйста.
89. Алекс Ю (AlexO) 27.04.12 18:09
Ненадежно оно как-то все. Автозаполнение сразу не заработало, перечисления - перестал видеть немного погодя.
Системные кнопки тоже не видит. Вернее, их действия.
90. Андрей Д. (bambr1975) 27.04.12 18:14
В Вашем неработающем коде, скорее всего для тпМенеджеры не установлено
ЭлементыФормы.тпМенеджеры.Данные="<строка реквизита формы, значение которого у вас должно выводиться в это тп>;
Этот реквизит должен быть или табличной частью объекта, форму которого Вы разрабатываете или этот реквизит должен быть описан на закладке "Реквизиты" самой формы.
91. Андрей Д. (bambr1975) 27.04.12 18:15
Системные кнопки тоже не видит. Вернее, их действия

Ну... это смотря как эти действия задавать. У меня видит.
92. Алекс Ю (AlexO) 27.04.12 18:16
(90) bambr1975,
да ну как не установлено - установлено конечно же :)
ТабличноеПоле = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"),"тпМенеджеры",Истина,ЭлементыФормы.Панель1);
	УстановитьПоложениеЭлемента(ТабличноеПоле,40,173,6,380);
	ТабличноеПоле.Данные = "МенеджерыПроектов";

где МенеджерыПроектов - ТЧ объекта
93. Андрей Д. (bambr1975) 27.04.12 18:18
Вы в табличное поле можете вывести табличную часть объекта.
У Вас в объекте есть табличная часть "МенеджерыПроектов"?
94. Алекс Ю (AlexO) 27.04.12 18:19
(91) bambr1975,
ну например, вот так:
кпПроектКнопки.Вставить(1,"Скопировать",ТипКнопкиКоманднойПанели.Действие,"&Скопировать",Новый Действие("Скопировать"));

хотел системную кнопку "Скопировать" заарканить.
95. Андрей Д. (bambr1975) 27.04.12 18:19
А теперь проверьте, что в сформированном вами коде !ОБЯЗАТЕЛЬНО! должжна присутствовать строка
ТабличноеПоле.ТолькоПросмотр=ложь;
(автоматом не формирует!)
96. Алекс Ю (AlexO) 27.04.12 18:20
(93) bambr1975,
это и есть табличная часть, со своими реквизитами, которые идут на колонки ТП.
Иначе бы ругалась на несовместимость типов ))
97. Алекс Ю (AlexO) 27.04.12 18:21
(95) bambr1975,
а вот это не проверял.
Попробую заново переделать - может, протолкнет ))
98. Андрей Д. (bambr1975) 27.04.12 18:24
Там немного по-другому надо...
Попробуйте разобраться с методом СтандартноеДействие=ЗначениеВСтрокуВнутр(Кнопка.Действие) - для нужного вам действия, а потом запишите в переменную результат Действие=ЗначениеИзСтрокиВнутр(СтандартноеДействие)
И тогда уже:
кпПроектКнопки.Вставить(1,"Скопировать",ТипКнопкиКоманднойПанели.Действие,"&Скопировать",Действие);
99. Андрей Д. (bambr1975) 28.04.12 11:00
В обработке http://infostart.ru/public/106310/ появилась тестовая возможность "Декомпилирование изменений". Может, кому-то пригодится.
100. Алекс Ю (AlexO) 28.04.12 12:27
(98) bambr1975,
Попробуйте разобраться с методом СтандартноеДействие=ЗначениеВСтрокуВнутр(Кнопка.Действие)

Андрей, а откуда взять Кнопка.Действие, если "Скопировать", положим, нет на форме в принципе? И нет как класса, который можно было бы инициализировать.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа