gifts2017

Автоматическое добавление новых реквизитов на форму (УФ)

Опубликовал Александр Полтава (Патриот) в раздел Программирование - Работа с интерфейсом

Идея такая: Программист добавил реквизит в объект. В комментарии этого реквизита прописал некое спец. слово (можно не матерное). На форму объекта новый реквизит далее попадает автоматом в спец. группу "Дополнительно".

Столкнулся давеча с проблемой: при добавлении реквизита в типовую конфу принято на форму его выводить программно. Сие упрощает дальнейшее обновление, поэтому разработчиками БСП для подобных целей заведён специальный ОМ "МодификацияКонфигурацииПереопределяемый". А в нашем случае нужен конкретный его метод

Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт

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

Так вот, чтобы не добавлять туда код вывода реквизита на форму каждый раз, при добавлении нового реквизита в объект конфигурации, и написана эта статья.

Идея такая:

Программист добавил реквизит в объект. В комментарии этого реквизита прописал некое спец слово (можно не матерное).

На форму объекта новый реквизит далее попадает автоматом в спец группу "Дополнительно".

Для этого в процедуру МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере нужно добавить вызов нижеследующей процедуры, смысл которой понятен из её комментария и текста.

Такой подход особенно подходит к концепции, когда добавляемые на типовую форму реквизиты намеренно выводятся на отдельную закладку.

//Добавляет нетиповые доп реквизиты на форму
//1. реквизит считается дополнительным, если его комментарий начинается со строки "+доп"
//(смысловая нагрузка: "+" = добавить, "доп" = на закладку "Дополнительно")
//2. реквизит добавляется на форму, только если в ней используется механизм доп реквизитов БСП
//(а он используется почти во всех формах элемента)
//определяется это по наличию в элементах формы группы "ГруппаДополнительныеРеквизиты"
//
//Автор: Патриот 2016_07
Процедура _ДобавитьНетиповыеРеквизиты(Форма)
	Попытка
		ВсеРеквизиты = Метаданные.НайтиПоПолномуИмени(Форма.ИмяФормы).Родитель().Реквизиты;
	Исключение
		//значит у объекта нет коллекции "Реквизиты" (например у "Журналы документов")
		Возврат;
	КонецПопытки;
	
	Реквизиты = Новый Массив;
	Для Каждого Реквизит Из ВсеРеквизиты Цикл
		Если ВРег(Лев(Реквизит.Комментарий, 4)) = "+ДОП" Тогда
			Реквизиты.Добавить(Реквизит);
		КонецЕсли;
	КонецЦикла;
	
	Если Реквизиты.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	//Добавляем страницу с Доп реквизитами следом за типовой страницей ГруппаДополнительныеРеквизиты
	ТиповаяГруппа = Форма.Элементы.Найти("ГруппаДополнительныеРеквизиты");
	
	Если ТиповаяГруппа = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	_грДопРеквизиты = Форма.Элементы.Добавить("_грДопРеквизиты", Тип("ГруппаФормы"), ТиповаяГруппа.Родитель);
	_грДопРеквизиты.Заголовок = "Доп реквизиты";
	//копируем свойства новой группы из типовой
	//именно копируем, а не задаём константно, т.к. в разных формах эти свойства м.б. разными
	_грДопРеквизиты.Вид = ТиповаяГруппа.Вид;
	_грДопРеквизиты.Группировка = ТиповаяГруппа.Группировка;
	_грДопРеквизиты.ОтображатьЗаголовок = ТиповаяГруппа.ОтображатьЗаголовок;
	_грДопРеквизиты.Отображение = ТиповаяГруппа.Отображение;
	
	Для Каждого Реквизит Из Реквизиты Цикл
		НовыйЭлемент = Форма.Элементы.Добавить(Реквизит.Имя, Тип("ПолеФормы"), _грДопРеквизиты);
		НовыйЭлемент.ПутьКДанным = "Объект." + Реквизит.Имя;
		НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	КонецЦикла;
КонецПроцедуры

ОпосляСкриптум:

1. При необходимости, можно сделать так же и для ТЧ.

2. Можно добавлять группу "_грДопРеквизиты" и при отсутствии группы "ГруппаДополнительныеРеквизиты", например в корень формы или искать группу с типом "страницы" и добавлять в неё в качестве последней страницы, но мне пока такого не требовалось.

ОпосляОпосляСкриптум:
В какой-то мере идея подсмотрена из механизма доп реквизитов БСП, поэтому укажу здесь также на плюсы и минусы этого механизма относительно изложенного в статье.

плюсы доп. реквизитов БСП:

  • для добавления доп реквизита БСП не нужен программист
  • пользователь может задать условие видимости реквизита
  • не требуется обновление БД (а в случае добавления реквизита обновиться динамически нельзя - надо гнать всех пользователей из базы)

плюсы обычных реквизитов:

  • работа в запросе (для выбора каждого доп реквизита надо делать соединение с ТЧ доп реквизиты)
  • обращение в коде (доп реквизит придётся либо искать по наименованию, чего никому бы не посоветовал, либо хранить на него ссылку в некоем соответствии (в ПВХ или РС) в базе)
  • возможность задавать любые свойства реквизита, например, связь по типу или параметры выбора

------------------------------------
ИНТЕРЕСНЫХ ВАМ ЗАДАЧ, ПЛОДОТВОРНОЙ РАБОТЫ И ОРИГИНАЛЬНЫХ/ОПТИМАЛЬНЫХ РЕШЕНИЙ!!

См. также

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

Комментарии

1. Алекс Кон (alex-l19041) 03.08.16 17:48
Если "Программист добавил реквизит в объект", то что ТАК сложно добавить на форму ???
2. Александр Полтава (Патриот) 03.08.16 20:42
(1) alex-l19041, в статье всё написано
при добавлении реквизита в типовую конфу принято на форму его выводить программно. Сие упрощает дальнейшее обновление, поэтому разработчиками БСП для подобных целей заведён специальный ОМ "МодификацияКонфигурацииПереопределяемый"
3. Алексей Ларин (roofless) 04.08.16 14:24
на вид гениально, будет рабочая задача - проверим
4. Яков Коган (Yashazz) 04.08.16 15:19
(3) roofless, где тут гениальность? Азы и трюизмы, баян баяном.

Автор, а если нужно не поле ввода? А если доп.реквизиты вырублены функ.опцией?
spy-83; ret-Phoenix; h00k; Spacer; +4 1 Ответить 2
5. Александр Полтава (Патриот) 04.08.16 17:45
(4) Yashazz,
баян баяном
может ещё и аргументы на сей счёт есть?
а если нужно не поле ввода?
А если то, а если сё... Вы, вроде, матёрый автор и д.б. в курсе, что у каждого решения есть своя область применения. Пересекается ли она с областью ваших задач или нет -- это другой вопрос, и, если нет, то просто нужен другой инструмент (!!) =))
А если доп.реквизиты вырублены функ.опцией?
не тестил, но не думаю, что в данном случае с формы удаляется группа "ГруппаДополнительныеРеквизиты", так что всё д.б. ок.
6. Алексей Ларин (roofless) 05.08.16 08:08
(4) Yashazz, когда зашел в этот модуль в нашей бухии 3.0, то увидел километры однотипных строк кода по добавлению нетипового функционала.
никто и не задумывался, что это можно упростить, тк копипастить было быстрее.
на универсальность этот метод не претендует, но как идея для развития вполне пойдет.
при крике "баяяян!" в народе принято бросать ссылкой)))
yurii_host; AzagTot; +2 Ответить
7. Александр Полетаев (Alias) 05.08.16 11:57
Как замена типовому механизму "доп.реквизитов", но избавленная от нескольких его минусов -- очень даже неплохая идея.

Если нужно не поле ввода (один из вопросов) -- можно ведь и расширить функционал. Например, реализовать гораздо более сложную чем просто "+доп" нотацию описания реквизита. представьте себе нотацию типа "+доп(ПолеВвода="Новый заголовок")" (обычное поле ввода с заголовком) или "+доп(ПолеВыбора[1="вариант 1",2="вариант 2",3="вариант 3"]="Выберите вариант"", который сделает радиобатон на три варианта.

Конечно, идея не предназначена конкурировать с механизмом создания расширений для формы, и понятно что гибкость расширения ей недоступна.

Зато она простыми силами быстро решает простые задачи, и точно уж может конкурировать (а иногда и превосходить!) типовой механизм "доп.реквизитов" в БСП.
Патриот; roofless; +2 Ответить 1
8. Антон Антонов (monkbest) 05.08.16 15:24
(7) Alias, расширения не везде доступны, если у конфы выставлен режим совместимости то не будет расширений, а УТ 11 с режимом совместимости
9. Александр Полетаев (Alias) 05.08.16 17:30
(8) monkbest, Ваш довод подтверждает что предложенная автором идея имеет место быть, а в случае невозможности пользоваться расширениями -- даже очень выигрышно смотрится.

Однако наряду с этим не могу не отметить, что Ваши данные несколько устарели, и УТ11 уже вполне себе работает с расширениями, т.к. имеет режим совместимости "Версия 8.3.6" уже с октября 2015 года.
10. Яков Коган (Yashazz) 07.08.16 13:05
(5) Патриот, аргументы есть - этот элементарный код встречается во множестве типовых конфигураций, а маркировка задач реквизита в его комментарии служебной строкой (в т.ч., кстати, xml со всеми нужными данными или строкой для НСтр) во множестве оригинальных и допиленных, и сам юзаю ещё с 8.0

Инструмент заявлен с претензией на универсальность, так что область применения не отмазка. Просто восторгающимся не худо б учитывать и более широкий круг задач.

Насчёт "ГруппаДополнительныеРеквизиты" - вы что, правда думаете, что БСП и вообще механика типовых стабильно соблюдает нотацию имён и принцип построения форм? Вы можете быть гарантированы, что есть подобная группа? Наивно. Гарантированы мы можем быть, только что есть сама форма.

11. Александр Полтава (Патриот) 07.08.16 15:43
(10) Yashazz,
этот элементарный код встречается во множестве типовых конфигураций
может не этот и не во множестве? Работаю с ЗУП, УТ, ЕРП, ДО и, каюсь, но похожего подхода не встречал. Ну и стоит ли говорить, что этот код был написан мной и с нуля, поэтому я буду воистину удивлён, если вы видели его в типовых))))))))))
Насчёт
универсальность
и завязке на механизмы БСП. Статья не такая длинная, и если бы вы читали, то заметили, что я коснулся момента, как расширить её универсальность.
12. Яков Коган (Yashazz) 09.08.16 18:31
(11) Патриот, если Вы не видели, как в типовых конфах динамически создаются реквизиты на формах, то что я могу поделать... А если вы не видели, как ещё в 7.7 в комментариях к реквизитам писали служебные обозначения - тем более.
13. Александр Полтава (Патриот) 10.08.16 10:47
(12) Yashazz, полно вам уже. Ну я же в первых строках статьи написал о том, что в БСП, а значит и
в типовых конфах динамически создаются реквизиты на формах
а далее идёт рассказ о предлагаемой модификации этого процесса
14. Вадим Миляев (PrinzOfMunchen) 08.09.16 21:01
Вы серьёзно? АВТОМАТИЗАЦИЯ и УНИВЕРСАЛЬНОСТЬ через строковый комментарий в виде "спец слова"? Всего лишь добавить реквизит в КОНФИГУРАТОРЕ и НЕ нужен программист? Пускать обычных пользователей в конфигуратор? Я бы ещё хотя бы просто по улыбался и мимо прошёл, если бы тут был очередной супер-универсальный регистр-сведений, в котором просто указывалась привязка через метаданные, какой реквизит выводить в доп. реквизиты, но это......
А когда один пользователь должен только видеть реквизит, второй редактировать, а третий ни того ни другого? Спец-слово для каждого случая? И потом снова километры ненужного кода, да ещё и недокументированного....
Может , чтобы обойтись без программиста, хоть для управления выводом реквизитов, дать возможность пользователю это делать на стороне предприятия?
Если вы уж добавляете реквизит в типовой объект, то и тот же "левый" (свой) примитивный регистр сведений погоды не сделает.
Ну а если хотите чтобы прям автоматизация и универсальность, то может и подсистемку свою?
Я, в своё время, делал для управляемого приложения подсистему конструктора управляемых форм в режиме предприятия. То есть, всё как в конфигураторе, только в предприятии. Для любого объекта, накидал свою сборку элементов, можешь даже отчет с СКД привинтить, сохранить как элемент своего справочника, например, "Дополнительные элементы формы для договора контрагента". Привязал конкретному пользователю. Только я делал динамический рабочий стол. А в принципе-то, взял и запилил бы регистр сведений, в котором к элементу справочника "ИдентификаторыОбъектовМетаданных" привязывались бы по пользователям элементы моего справочника. С указанием, в какую форму и в какую группу выводить.
Ну как вариант. Тут хоть какая-то универсальность...Можно вообще без конфигуратора обойтись. Создал доп. реквизит типовой, а вывод его уже свой сделал, так же в предприятии.... Чуть универсальнее, не правда ли?
15. Александр Полтава (Патриот) 08.09.16 23:20
(14) PrinzOfMunchen, вы как-то криво читали и в голове всё перемешалось у вас. Пересказывать вышеописанную статью мне лень и это бессмысленно. Во первых, потому, что если всё разжёвывать каждому, то больше ни на что времени не останется, а всё равно найдутся те, кто не воспримет разжёвывания. Во вторых, потому, что разжёвывание провоцируют у читающих лень, и, вместо того, чтобы разобраться самостоятельно и читать хоть сколько-нибудь внимательно, они будут постоянно надеяться на разжёвывания.
Но всё же одну подсказку я сделаю:
Всего лишь добавить реквизит в КОНФИГУРАТОРЕ и НЕ нужен программист?
вот это ваше ошибочное высказывание является следствием того, что вы читали через слово и скорее всего в произвольном порядке
16. Вадим Миляев (PrinzOfMunchen) 09.09.16 05:15
(15) Патриот, а разница? Это-то мелочь. Ключевое что в статье? "В комментарии этого реквизита прописал некое спец слово (можно не матерное).".
Это вот вообще не комильфо.
Сама идея не нова. Да и реализация могла быть универсальнее. Притензия к этому.
17. Александр Полтава (Патриот) 09.09.16 09:36
(16) PrinzOfMunchen,
  • Так если нет разницы, зачем вы эту "мелочь" в комментарии пишете?
  • Если вам надо универсальности, пишите универсальный код, благо разработчики БСП предоставили для этого удобную возможность, и в статье описано, где это делать.
  • Если же у вас возникает задача, к которой подходит удобный "молоток" предложенный в статье, то и пользуйтесь на здоровье. Но не стоит тратить своё и моё время на то, чтобы рассказать мне, как много есть случаев, где "молоток" не подходит, а нужен "трактор" (на который я сослался в статье, как уже упомянул во втором пункте).
  • То, что класс задач, решаемых предложенным "молотком", существует, доказано моим опытом, но главное - существованием механизма доп реквизитов БСП. С которым я и сравнил достоинства и недостатки своего "молотка".
18. Вадим Миляев (PrinzOfMunchen) 09.09.16 16:40
(17) Патриот, в том-то и дело, что это не молоток, а телевизор, для забивки гвоздей. Забить конечно можно, и всё будет ок,, с этим никто не спорит. Но это что-то вроде: "когда вам лень потратить 30 минут и сходить за молотком, или собрать свой, возьмите мой телевизор и забейте гвозди им!". Вот только таких телевизионщиков уже тоже целый вагон.
19. Александр Полтава (Патриот) 09.09.16 16:49
(18) PrinzOfMunchen, это ваше мнение. Почему я считаю его неправильным вытекает из статьи и комментов под ней. Но я бы рекомендовал потратить ваш напор на статьи про пере нумераторы, печатные формы и прочую лабуду, которой кишит ИС, а не докапываться к разработкам по принципу "мне этот инструмент не нужен - значит фигня".
20. Вадим Миляев (PrinzOfMunchen) 11.09.16 15:50
(19) Патриот, я не говорю, что идея плоха. Нормальная, адекватная идея, да ещё и с кодом написанным в подходящем месте. Но подход... Не собираюсь вступать в дальнейшую бессмысленную полемику. Со временем сами придёте к более системному подходу и осознаете, чем плоха зависимость от "специальной строки". Просто вас же и не окрепшие умы читают. ))) Решат, что это верх автоматизации, а потом и докажи, что язык 1С не "козёл". ))
21. nickVZ (nickVZ) 25.09.16 14:38
(2) Вообще-то, ныне стало модно Расширение (начиная с 8.3.7, сейчас 8.3.8 ,на которой, в частности, работает актуальный релиз БП3).. И модифицировать формы стало намного легче.
Еще: в упомянутой БП3 нет Общего модуля "МодификацияКонфигурацииПереопределяемый". Извините.
Но проблему общие модули не создают. При обновлении, имеется ввиду. Как и обработчики (подписки на события.
22. Александр Полтава (Патриот) 04.10.16 17:12
(21) nickVZ, ваш коммент не связан со статьёй.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа