Программное добавление элементов на управляемую форму

0. spec8s 788 13.02.19 11:46 Сейчас в теме
Пример добавления Команд, Полей ввода, Групп, Страниц, Реквизитов, Обработчиков событий.

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

Отзывы
20. adamst 2 25.09.20 18:40 Сейчас в теме
полезные данные! удобно сразу все собрано в одном месте
для добавление реквизитов с помощью расширений очень удобно
keifaya; GetNight; dmbarchenkov; uno-c; ybatiaev; spec8s; +6 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. mvgfirst 6 13.02.19 12:46 Сейчас в теме
Смысл добавлять реквизиты и элементы программно, если обработчики для них нужно прописывать в коде формы.
Было бы больше пользы - если бы показали "типовые приемы" обработки событий программно добавленных элементов.
Рамзес; +1 Ответить
2. ViperGSV 13.02.19 14:28 Сейчас в теме
(1) Смысл в том что элементы формы могут "слететь" при обновлении конфигурации. А если их задавать программно, то объединение кода намного проще, особенно если пользоваться KDiff например.
Я давно перешел на такой способ добавления реквизитов на форму (в шапки документа, в табличную часть). Правда основной кусок кода выносится в Общие модули.
Трям; dronicbest; natalia_b2007; ivprovotorov; 1Cynep4eJIoBek; Dmitri93; Craig; SmArtist; +8 Ответить
21. alexsey777 10.11.20 12:24 Сейчас в теме
(2)Согласен. Пришел к этому опытным путем.
Тоже элементы добавляю программно. При сравнении-объединении сразу видны изменения. И не нужно потом еще форму руками менять.
Eillecho; dronicbest; natalia_b2007; +3 Ответить
46. user970589 8 06.10.22 08:24 Сейчас в теме
(2)крупные конторы именно так и делают. столкнулся с этим как только перешел из свободных охотников - ЛЮБЫЕ добавления на форму типовую программно. и сразу понтяно почему, при обновлении сама форма всегда будет актуальной, а код легко переносится.
3. spec8s 788 13.02.19 16:44 Сейчас в теме
(1) В примере добавления поля ввода, показано добавление обработчика

/Можно добавить обработчик события
//См. синтакс-помощник чтобы узнать список событий
// Интерфейс (управляемый) -> Поле формы -> ПолеФормы -> События
// а так же остальные варианты расширения поля формы в зависимости от вида кнопки
// Интерфейс (управляемый) -> Поле формы -> Расширение поля ввода -> События
// и прочее
ПолеВвода.УстановитьДействие(
"ПриИзменении", //Имя события
"ПриИзмененииКомментария"); //Имя процедуры обработчика
vit00lya; Aspire1C; Dmitri93; Craig; +4 Ответить
8. mvgfirst 6 14.02.19 15:32 Сейчас в теме
(3) Как добавить обработчик не расположенный в форме? В тех случаях когда я из внешней (по отношению к форме) части программы хочу добавить кнопку или поле ввода. Насколько я знаю (могу и ошибаться) назначить обработчик можно только расположенный в модуле формы. А значит надо исполнять "танцы с бубном" по вызову своих обработчиков (расположенных например в общем модуле) из обработчиков расположенных на форме. И тут получается несостыковочка. Вроде бы форму можно полностью построить программно. Но не полностью .... т.к. обработчики должны быть в форме заранее.

Если есть какой-то способ обойти это "ограничение" - буду рад если поделитесь со мной.
Рамзес; buy_sale; ixijixi; TuneSoft; user830833; +5 Ответить
37. ixijixi 1472 24.03.22 12:18 Сейчас в теме
(8) Если это формы документов/справочников на БСП, то во всех есть Подключаемый_ВыполнитьКоманду
38. ixijixi 1472 24.03.22 12:50 Сейчас в теме
(8) Пока искал, наткнулся на частичное решение, которое мне подошло.
Кнопка = Элементы.Добавить("МояКнопка", Тип("ДекорацияФормы"), ЭтотОбъект);
Кнопка.Заголовок = Новый ФорматированнаяСтрока(НСтр("ru = 'Сотрудники.'"),,,, "e1cib/command/Справочник.Команда.СотрудникиВнештатные");
jufyti; 0x00; +2 Ответить
4. Boneman 296 13.02.19 16:59 Сейчас в теме
(1) в современных конфигурациях, про обработчики уже позаботились. В формах есть подключаемая процедурка
Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
которая ведет в общий модуль СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду

Там в свою очередь, есть вызов ОбщегоМодуля МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры);

где по имени команды и формы, можно определить свою, и напилить свои обработчики.

В итоге, получим абсолютно неизмененный объект, на поддержке...но в нем, программно добавленная кнопка и свой обработчик событий...
единственное, что у некоторых элементов параметров, предполагается много...и они как бы будут недоступны..но тут приходится или маневры искать, или немного усовершенствовать.. но в простых случаях, вполне себе все решаемо
9. mvgfirst 6 14.02.19 15:48 Сейчас в теме
(4) Так-то оно так. Если дело касается добавления какой-нибудь "некузявой" кнопочки, или чего-то незначительно-дополняющего функциональность формы или объекта который форма представляет.
Но если копнуть глубже, и рассматривать некую систему в которой есть оснастка, в которую разные модули (подсистемы) добавляют нужные им элементы управления (списки, диаграммы, таблицы со связью один ко многим и т.п.). Да еще и замахнуться на механику, когда пользователь сам решает какие модули и подсистемы ему нужны... Другими словами, разработать решение в стиле "плагинов" как во всяких там WinAmp-ах и прочих модных штуках. И тут получается нужно в форме-оснастке предусмотреть все возможные типы событий (который на ИТС кстати рекомендуют обрамлять префиксом "Подключаемый_"), а потом еще и у этих событий предусмотреть модель поведения когда нужны: а) только клиентские вызовы, б) клиентские и внеконтекстные сервеные, в) клиентские и контекстные серверные вызовы.

Поэтому да, многое можно, но навык "танец с бубном" должен быть 99lvl

И речь в данном случае не о "сферическом слоне в вакууме", а о например Рабочем Месте, которое настраивается в зависимости от роли пользователя, подразделении пользователя, полномочиям которые ему делегировали временно или постоянно и т.п.

В целом, я не пытаюсь очернить, или критиковать подходы. Просто думаю разумно было бы - побольше раскрыть нюансы именно обработки событий программно-добавленных элементов. Описать на какие подводные грабли можно наступить, как обойти.
user1691741; +1 Ответить
48. Umka23 12 09.02.23 00:48 Сейчас в теме
(4)
Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)

Подскажите пожалуйста, где об этом почитать подробнее. Возможно с примерами доработок. Очень долго ищу уже и всё на какую то дичь наталкиваюсь.
10. rpgshnik 3359 12.08.19 04:37 Сейчас в теме
(1) https://infostart.ru/public/1106063/ как раз заложена логика обработки событий от элементов формы. Тут нужно поиграться с именами :) и Выполнить("Кусок кода") и будет магия практически программного создания всего :)) тоже столкнулся с проблемой сначала как блин подготовить неизвестное количество событий-процедур для команд... но оказалось нужна одна, но хитровыкорчеванная, грабли конечно, но вариант имеет право на жизнь.
35. psa247 18 15.10.21 19:29 Сейчас в теме
(1) Смысл есть. К примеру, сегодня выполнял такую задачу. Динамическое количество кнопок и у каждой кнопки была своя задача. Код для всех задач был одинаковый, но уникальность кода для каждой кнопки выполнил алгоритмически
5. ret 62 13.02.19 17:26 Сейчас в теме
Если УФ и платформа больше 8.3.10, то имхо, проще заюзать расширение. В нем нагляднее и конфа не снимается с поддержки.
y-nov; Shalnov; +2 Ответить
6. spec8s 788 13.02.19 18:27 Сейчас в теме
(5) Не соглашусь, таким образом невозможно понять, какие реквизиты были добавлены в расширении, а какие уже были в исходной конфигурации.

Когда придет время обновлять расширение, эти вопросы обязательно могут возникнуть.
user1147832; rozer; +2 Ответить
7. ret 62 14.02.19 08:13 Сейчас в теме
С расширением порядок проблем при обновлении намного меньше. С 8.3.6 их начал юзать, и функционал расширений только улучшается.
Ранее да, на ОФ именно программным кодом пользовался, и вот ни разу не визуально, и весьма проблематично. Пользовался обработкой с инфостарта по декомпиляции форм. Т.е. сперва визуально делаешь, потом в програмный код. Так вот телодвижений и в УФ осталось много. С расширением все намного проще. Мое имхо, конечно же.
11. Anthon 230 24.08.19 09:52 Сейчас в теме
Ошибочка. Добавлять элементы на форму надо с проверкой, например,

Если Элементы.Найти("Владелец") = Неопределено Тогда
ПолеВвода = Элементы.Добавить("Владелец", Тип("ПолеФормы"), ЭтаФорма);
ПолеВвода.Заголовок = "Владелец";
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "Объект.Владелец";
КонецЕсли;

Они ведь иногда появляются, когда 1с-овцы трезвеют...

К тому же, если на форме много изменений, процесс перехода на расширение может занять большое время, и элемент всё ещё может присутствовать в конфигурации на форме, поэтому надо включать защиту от дурака уже заранее.
22. alexsey777 18.11.20 17:35 Сейчас в теме
(11)Описанная проблема обычно решается установкой префикса в имени добавляемого реквизита.
Максимум, 1с-овцы могут добавить аналогичное по содержанию поле. И их будет 2 на форме.
12. rmIvanT 67 14.10.19 14:03 Сейчас в теме
Как добавить реквизиты/кнопки в нужное место(Форма, Группа, Командная панель) например в начало списка, по умолчанию элементы добавляются в конец
13. SlavaKron 14.10.19 14:26 Сейчас в теме
(12) Вставить вместо добавить. Пример для кнопки контекстного меню. Нам надо вставить ее в начало списка меню:
Если КонтекстноеМеню.ПодчиненныеЭлементы.Количество() > 0 Тогда
	Кнопка = Форма.Элементы.Вставить("ИмяКнопки", Тип("КнопкаФормы"), КонтекстноеМеню, КонтекстноеМеню.ПодчиненныеЭлементы[0]);
Иначе
	Кнопка = Форма.Элементы.Добавить("ИмяКнопки", Тип("КнопкаФормы"), КонтекстноеМеню);
КонецЕсли;
Barney06; rmIvanT; +2 Ответить
14. rmIvanT 67 14.10.19 15:04 Сейчас в теме
(13) Благодарю, помогло
Barney06; +1 Ответить
15. rmIvanT 67 19.12.19 14:07 Сейчас в теме
Как добавить ТаблицуЗначений с колонками в реквизиты формы?
Нашел https://infostart.ru/public/296433/
CratosX; AnKonAlm; +2 Ответить
16. Teut_Vlad 144 28.12.19 23:10 Сейчас в теме
17. Mechanik21 23 04.06.20 14:30 Сейчас в теме
Как добавить элементы из списка значений?
Заранее не знаю сколько там будет элементов
18. Mechanik21 23 04.06.20 14:33 Сейчас в теме
(17)Все значения строки - из них хочу сделать на форме флажки, то есть булево
19. spec8s 788 13.06.20 18:44 Сейчас в теме
(18)
Все значения строки - из них хочу сделать на форме флажки, то есть булево


Как вариант, сначала создать список значений как реквизит формы, затем добавить поля формы и связать их с реквизитом формы, указав в пути к данным путь "ИмяРеквизитаСпискаЗначений[ИндексСтроки].Пометка" и "ИмяРеквизитаСпискаЗначений[ИндексСтроки].Представление"

Любое изменение флажка будет так же влиять и на список значений.

        ДобавляемыеРеквизиты = Новый Массив;
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("МойСписок", Новый ОписаниеТипов("СписокЗначений")));
	ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
	ЭтотОбъект.МойСписок.Добавить("Вариант 1");
	ЭтотОбъект.МойСписок.Добавить("Вариант 2");
	ЭтотОбъект.МойСписок.Добавить("Вариант 3");
	ЭтотОбъект.МойСписок.Добавить("Вариант 4");
	
	Индекс = 0;
	Для Каждого ЭлементСписка Из ЭтотОбъект.МойСписок Цикл
		
		ГруппаЭлементов = Элементы.Добавить("Группа_" + Формат(Индекс, "ЧГ=0"),
			Тип("ГруппаФормы"),
			ЭтотОбъект);
		ГруппаЭлементов.Вид = ВидГруппыФормы.ОбычнаяГруппа;
		ГруппаЭлементов.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
			
		ФлажокЭлемента = Элементы.Добавить("МойСписокПометка_" + Формат(Индекс, "ЧН=0; ЧГ=0"),
			Тип("ПолеФормы"),
			ГруппаЭлементов);
		ФлажокЭлемента.Вид = ВидПоляФормы.ПолеФлажка;
		ФлажокЭлемента.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
		ФлажокЭлемента.ПутьКДанным = СтрШаблон("МойСписок[%1].Пометка", Формат(Индекс, "ЧГ=0"));
		ФлажокЭлемента.УстановитьДействие("ПриИзменении", "ПриИзмененииФлажка");
		
		ПолеЭлемента = Элементы.Добавить("МойСписокЭлемент_" + Формат(Индекс, "ЧГ=0"),
			Тип("ПолеФормы"),
			ГруппаЭлементов);
		ПолеЭлемента.Вид = ВидПоляФормы.ПолеНадписи;
		ПолеЭлемента.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
		ПолеЭлемента.ПутьКДанным = СтрШаблон("МойСписок[%1].Представление", Формат(Индекс, "ЧГ=0"));
		
		Индекс = Индекс + 1;
	КонецЦикла;
Показать
LomayaZakat; Mechanik21; +2 Ответить
20. adamst 2 25.09.20 18:40 Сейчас в теме
полезные данные! удобно сразу все собрано в одном месте
для добавление реквизитов с помощью расширений очень удобно
keifaya; GetNight; dmbarchenkov; uno-c; ybatiaev; spec8s; +6 Ответить
23. пользователь 05.02.21 09:25
Сообщение было скрыто модератором.
...
24. user625107_barabambler1s 09.08.21 14:02 Сейчас в теме
А как вставить форматированную строку программно?
25. spec8s 788 10.08.21 10:13 Сейчас в теме
(24)
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	//	Добавляем новый реквизит формы
    НовыеРеквизиты = Новый Массив;
	НовыеРеквизиты.Добавить(Новый РеквизитФормы("фСтрока", Новый ОписаниеТипов("ФорматированнаяСтрока"),, "Форматированная строка"));
	
	ЭтаФорма.ИзменитьРеквизиты(НовыеРеквизиты);

	//	 Добавляем новый элемент формы
    элФормы = ЭтаФорма.Элементы.Добавить("фСтрока", Тип("ПолеФормы"));
	элФормы.Вид = ВидПоляФормы.ПолеНадписи;
	элФормы.ПутьКДанным = "фСтрока";
	
	//	Задаем значение строки
	ЭтаФорма.фСтрока = Новый ФорматированнаяСтрока("Это форматированная строка",, WebЦвета.Аквамарин);
	
КонецПроцедуры
Показать
26. aximo 1976 03.09.21 16:06 Сейчас в теме
товарищи, а есть методы обновляемые форму не используя "ПриСозданииНаСервере"?
28. spec8s 788 03.09.21 16:24 Сейчас в теме
(26)Можно в любой процедуре с директивой &НаСервере
27. aximo 1976 03.09.21 16:06 Сейчас в теме
Или нужно все нарисовать - и играться с видимостью?
29. aximo 1976 03.09.21 16:30 Сейчас в теме
(28) а есть примерчик, что-то не обновляет форму
30. aximo 1976 03.09.21 16:42 Сейчас в теме
все) готово) - разобрался. а как удалить элементы определенной группы? есть примерчик?)
31. spec8s 788 03.09.21 17:32 Сейчас в теме
(30)Что-то типо:

Пока Группа.ПодчиненныеЭлементы.Количество() > 0 Цикл
   Элементы.Удалить(Группа.ПодчиненныеЭлементы.Получить(0));
КонецЦикла;
32. aximo 1976 03.09.21 18:22 Сейчас в теме
благодарю! я уже все сделал самостоятельно
33. aximo 1976 03.09.21 18:23 Сейчас в теме
34. spec8s 788 06.09.21 17:31 Сейчас в теме
(33)Предлагаю проверить такой вариант, результат удивит:

	
        М = Новый Массив;
	М.Добавить(1);
	М.Добавить(2);
	М.Добавить(3);
	
	
	Для Каждого ЗН Из М Цикл
		
		М.Удалить(М.Найти(Зн));
		
	КонеццИкла;
	
	Сообщить(М.Количество());
Показать
36. psa247 18 15.10.21 19:32 Сейчас в теме
Коллеги, приветствую!
Сейчас разбираюсь с подобной задачей. Но мне нужно кнопки командной панели создавать при наступлении события, а не только "однажды" "присозданиинасервере". Есть у кого-нибудь готовые алгоритмы?
39. nickolay-z 27.05.22 12:59 Сейчас в теме
(36) Как то так наверное

&НаКлиенте
Процедура КомандаПоказатьПредупреждение()
	ПоказатьПредупреждение(,"Ок!");	
КонецПроцедуры

&НаСервере
Процедура ПоказатьКнопкуПриИзмененииНаСервере()
	Команда = Команды.Добавить("ПоказатьПредупреждение");
	Команда.Заголовок = "Показать предпреждение";
	Команда.Действие = "КомандаПоказатьПредупреждение";
	КнопкаПредупреждения = Элементы.Добавить("ПоказатьПредупреждение", Тип("КнопкаФормы"), ЭтаФорма);
	КнопкаПредупреждения.ИмяКоманды = "ПоказатьПредупреждение";
	КнопкаПредупреждения.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
КонецПроцедуры

&НаСервере
Процедура УдалитьКнопку()
	Кнопка = ЭтаФорма.Элементы.Найти("ПоказатьПредупреждение");
	ЭтаФорма.Элементы.Удалить(Кнопка); 
	Команда = Команды.Найти("ПоказатьПредупреждение");
	Команды.Удалить(Команда);
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьКнопкуПриИзменении(Элемент)
	Если ПоказатьКнопку = Истина Тогда
		ПоказатьКнопкуПриИзмененииНаСервере();
	Иначе
		УдалитьКнопку();
	КонецЕсли;
КонецПроцедуры
Показать
40. ut11 2 06.06.22 15:55 Сейчас в теме
а общую команду можно программно на форму закинуть?
41. spec8s 788 07.06.22 00:26 Сейчас в теме
(40)Общая команда должна сама по себе быть на форме, если она назначена для объекта, без дополнительного кода.
42. Kontakt 109 10.06.22 10:50 Сейчас в теме
Есть пример как добавить в табличную часть столбец, строковые данные. На примере программного добавления.
имеется Табличная часть товары в документе Реализация товаров и услуг.
43. spec8s 788 10.06.22 11:51 Сейчас в теме
(42)
НовыеРеквизиты = Новый Массив;
НовыеРеквизиты.Добавить(Новый РеквизитФормы("ПолеСтр", Новый ОписаниеТипов("Строка"), "Объект.Товары"));
ИзменитьРеквизиты(НовыеРеквизиты);

НовыйЭлемент = Элементы.Добавить("ТоварыПолеСтр", ТИП("ПолеФормы"), Элементы.Товары);
НовыйЭлемент.ПутьКДанным = "Объект.Товары.ПолеСтр";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
44. alexchr 2 22.08.22 22:32 Сейчас в теме
а как добавить нужные поля между существующими, указанными способами они добавляются после существующих
45. spec8s 788 22.08.22 22:50 Сейчас в теме
(44)Заменить метод .Добавить() на метод .Вставить()
47. unknown181538 121 25.12.22 17:12 Сейчас в теме
А есть какие-нибудь БСП методы, которые с этим справляются?
Оставьте свое сообщение
Вакансии
Функциональный архитектор
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб.
Полный день

Ведущий программист 1С (удаленно)
Пермь
зарплата от 150 000 руб.
Полный день

Программист 1С
Домодедово
зарплата от 150 000 руб. до 180 000 руб.
Полный день

Консультант 1С
Москва
зарплата от 80 000 руб. до 150 000 руб.
Полный день