Смысл добавлять реквизиты и элементы программно, если обработчики для них нужно прописывать в коде формы.
Было бы больше пользы - если бы показали "типовые приемы" обработки событий программно добавленных элементов.
(1) Смысл в том что элементы формы могут "слететь" при обновлении конфигурации. А если их задавать программно, то объединение кода намного проще, особенно если пользоваться KDiff например.
Я давно перешел на такой способ добавления реквизитов на форму (в шапки документа, в табличную часть). Правда основной кусок кода выносится в Общие модули.
(2)Согласен. Пришел к этому опытным путем.
Тоже элементы добавляю программно. При сравнении-объединении сразу видны изменения. И не нужно потом еще форму руками менять.
(2)крупные конторы именно так и делают. столкнулся с этим как только перешел из свободных охотников - ЛЮБЫЕ добавления на форму типовую программно. и сразу понтяно почему, при обновлении сама форма всегда будет актуальной, а код легко переносится.
(1) В примере добавления поля ввода, показано добавление обработчика
/Можно добавить обработчик события
//См. синтакс-помощник чтобы узнать список событий
// Интерфейс (управляемый) -> Поле формы -> ПолеФормы -> События
// а так же остальные варианты расширения поля формы в зависимости от вида кнопки
// Интерфейс (управляемый) -> Поле формы -> Расширение поля ввода -> События
// и прочее
ПолеВвода.УстановитьДействие(
"ПриИзменении", //Имя события
"ПриИзмененииКомментария"); //Имя процедуры обработчика
(3) Как добавить обработчик не расположенный в форме? В тех случаях когда я из внешней (по отношению к форме) части программы хочу добавить кнопку или поле ввода. Насколько я знаю (могу и ошибаться) назначить обработчик можно только расположенный в модуле формы. А значит надо исполнять "танцы с бубном" по вызову своих обработчиков (расположенных например в общем модуле) из обработчиков расположенных на форме. И тут получается несостыковочка. Вроде бы форму можно полностью построить программно. Но не полностью .... т.к. обработчики должны быть в форме заранее.
Если есть какой-то способ обойти это "ограничение" - буду рад если поделитесь со мной.
(1) в современных конфигурациях, про обработчики уже позаботились. В формах есть подключаемая процедурка
Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
которая ведет в общий модуль СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду
Там в свою очередь, есть вызов ОбщегоМодуля МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры);
где по имени команды и формы, можно определить свою, и напилить свои обработчики.
В итоге, получим абсолютно неизмененный объект, на поддержке...но в нем, программно добавленная кнопка и свой обработчик событий...
единственное, что у некоторых элементов параметров, предполагается много...и они как бы будут недоступны..но тут приходится или маневры искать, или немного усовершенствовать.. но в простых случаях, вполне себе все решаемо
(4) Так-то оно так. Если дело касается добавления какой-нибудь "некузявой" кнопочки, или чего-то незначительно-дополняющего функциональность формы или объекта который форма представляет.
Но если копнуть глубже, и рассматривать некую систему в которой есть оснастка, в которую разные модули (подсистемы) добавляют нужные им элементы управления (списки, диаграммы, таблицы со связью один ко многим и т.п.). Да еще и замахнуться на механику, когда пользователь сам решает какие модули и подсистемы ему нужны... Другими словами, разработать решение в стиле "плагинов" как во всяких там WinAmp-ах и прочих модных штуках. И тут получается нужно в форме-оснастке предусмотреть все возможные типы событий (который на ИТС кстати рекомендуют обрамлять префиксом "Подключаемый_"), а потом еще и у этих событий предусмотреть модель поведения когда нужны: а) только клиентские вызовы, б) клиентские и внеконтекстные сервеные, в) клиентские и контекстные серверные вызовы.
Поэтому да, многое можно, но навык "танец с бубном" должен быть 99lvl
И речь в данном случае не о "сферическом слоне в вакууме", а о например Рабочем Месте, которое настраивается в зависимости от роли пользователя, подразделении пользователя, полномочиям которые ему делегировали временно или постоянно и т.п.
В целом, я не пытаюсь очернить, или критиковать подходы. Просто думаю разумно было бы - побольше раскрыть нюансы именно обработки событий программно-добавленных элементов. Описать на какие подводные грабли можно наступить, как обойти.
(1) https://infostart.ru/public/1106063/ как раз заложена логика обработки событий от элементов формы. Тут нужно поиграться с именами :) и Выполнить("Кусок кода") и будет магия практически программного создания всего :)) тоже столкнулся с проблемой сначала как блин подготовить неизвестное количество событий-процедур для команд... но оказалось нужна одна, но хитровыкорчеванная, грабли конечно, но вариант имеет право на жизнь.
(1) Смысл есть. К примеру, сегодня выполнял такую задачу. Динамическое количество кнопок и у каждой кнопки была своя задача. Код для всех задач был одинаковый, но уникальность кода для каждой кнопки выполнил алгоритмически
С расширением порядок проблем при обновлении намного меньше. С 8.3.6 их начал юзать, и функционал расширений только улучшается.
Ранее да, на ОФ именно программным кодом пользовался, и вот ни разу не визуально, и весьма проблематично. Пользовался обработкой с инфостарта по декомпиляции форм. Т.е. сперва визуально делаешь, потом в програмный код. Так вот телодвижений и в УФ осталось много. С расширением все намного проще. Мое имхо, конечно же.
Ошибочка. Добавлять элементы на форму надо с проверкой, например,
Если Элементы.Найти("Владелец") = Неопределено Тогда
ПолеВвода = Элементы.Добавить("Владелец", Тип("ПолеФормы"), ЭтаФорма);
ПолеВвода.Заголовок = "Владелец";
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "Объект.Владелец";
КонецЕсли;
Они ведь иногда появляются, когда 1с-овцы трезвеют...
К тому же, если на форме много изменений, процесс перехода на расширение может занять большое время, и элемент всё ещё может присутствовать в конфигурации на форме, поэтому надо включать защиту от дурака уже заранее.
(11)Описанная проблема обычно решается установкой префикса в имени добавляемого реквизита.
Максимум, 1с-овцы могут добавить аналогичное по содержанию поле. И их будет 2 на форме.
Все значения строки - из них хочу сделать на форме флажки, то есть булево
Как вариант, сначала создать список значений как реквизит формы, затем добавить поля формы и связать их с реквизитом формы, указав в пути к данным путь "ИмяРеквизитаСпискаЗначений[ИндексСтроки].Пометка" и "ИмяРеквизитаСпискаЗначений[ИндексСтроки].Представление"
Любое изменение флажка будет так же влиять и на список значений.
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("МойСписок", Новый ОписаниеТипов("СписокЗначений")));
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
ЭтотОбъект.МойСписок.Добавить("Вариант 1");
ЭтотОбъект.МойСписок.Добавить("Вариант 2");
ЭтотОбъект.МойСписок.Добавить("Вариант 3");
ЭтотОбъект.МойСписок.Добавить("Вариант 4");
Индекс = 0;
Для Каждого ЭлементСписка Из ЭтотОбъект.МойСписок Цикл
ГруппаЭлементов = Элементы.Добавить("Группа_" + Формат(Индекс, "ЧГ=0"),
Тип("ГруппаФормы"),
ЭтотОбъект);
ГруппаЭлементов.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаЭлементов.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
ФлажокЭлемента = Элементы.Добавить("МойСписокПометка_" + Формат(Индекс, "ЧН=0; ЧГ=0"),
Тип("ПолеФормы"),
ГруппаЭлементов);
ФлажокЭлемента.Вид = ВидПоляФормы.ПолеФлажка;
ФлажокЭлемента.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
ФлажокЭлемента.ПутьКДанным = СтрШаблон("МойСписок[%1].Пометка", Формат(Индекс, "ЧГ=0"));
ФлажокЭлемента.УстановитьДействие("ПриИзменении", "ПриИзмененииФлажка");
ПолеЭлемента = Элементы.Добавить("МойСписокЭлемент_" + Формат(Индекс, "ЧГ=0"),
Тип("ПолеФормы"),
ГруппаЭлементов);
ПолеЭлемента.Вид = ВидПоляФормы.ПолеНадписи;
ПолеЭлемента.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
ПолеЭлемента.ПутьКДанным = СтрШаблон("МойСписок[%1].Представление", Формат(Индекс, "ЧГ=0"));
Индекс = Индекс + 1;
КонецЦикла;
Коллеги, приветствую!
Сейчас разбираюсь с подобной задачей. Но мне нужно кнопки командной панели создавать при наступлении события, а не только "однажды" "присозданиинасервере". Есть у кого-нибудь готовые алгоритмы?
Есть пример как добавить в табличную часть столбец, строковые данные. На примере программного добавления.
имеется Табличная часть товары в документе Реализация товаров и услуг.