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

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

Преимущества программной доработки форм:

  • Можно использовать в расширениях
  • Легко копировать / переносить доработки
  • Различия видны при сравнении конфигурации
  • Легче производить обновление конфигурации

В данном примере все элементы формы будут добавлены в событии формы ПриСозданииНаСервере() 

 

 Добавление команды

 

 Добавление поля ввода

 

 Добавление реквизита формы

 

 Добавление группы формы

 

 Добавление страниц формы

Обработка тестировалась на релизе платформы 8.3.13.1513.

14 Comments

  1. mvgfirst

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

    Было бы больше пользы — если бы показали «типовые приемы» обработки событий программно добавленных элементов.

    Reply
  2. ViperGSV

    (1) Смысл в том что элементы формы могут «слететь» при обновлении конфигурации. А если их задавать программно, то объединение кода намного проще, особенно если пользоваться KDiff например.

    Я давно перешел на такой способ добавления реквизитов на форму (в шапки документа, в табличную часть). Правда основной кусок кода выносится в Общие модули.

    Reply
  3. spec8s

    (1) В примере добавления поля ввода, показано добавление обработчика

    /Можно добавить обработчик события

    //См. синтакс-помощник чтобы узнать список событий

    // Интерфейс (управляемый) -> Поле формы -> ПолеФормы -> События

    // а так же остальные варианты расширения поля формы в зависимости от вида кнопки

    // Интерфейс (управляемый) -> Поле формы -> Расширение поля ввода -> События

    // и прочее

    ПолеВвода.УстановитьДействие(

    «ПриИзменении», //Имя события

    «ПриИзмененииКомментария»); //Имя процедуры обработчика

    Reply
  4. Boneman

    (1) в современных конфигурациях, про обработчики уже позаботились. В формах есть подключаемая процедурка

    Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)

    которая ведет в общий модуль СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду

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

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

    В итоге, получим абсолютно неизмененный объект, на поддержке…но в нем, программно добавленная кнопка и свой обработчик событий…

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

    Reply
  5. ret

    Если УФ и платформа больше 8.3.10, то имхо, проще заюзать расширение. В нем нагляднее и конфа не снимается с поддержки.

    Reply
  6. spec8s

    (5) Не соглашусь, таким образом невозможно понять, какие реквизиты были добавлены в расширении, а какие уже были в исходной конфигурации.

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

    Reply
  7. ret

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

    Ранее да, на ОФ именно программным кодом пользовался, и вот ни разу не визуально, и весьма проблематично. Пользовался обработкой с инфостарта по декомпиляции форм. Т.е. сперва визуально делаешь, потом в програмный код. Так вот телодвижений и в УФ осталось много. С расширением все намного проще. Мое имхо, конечно же.

    Reply
  8. mvgfirst

    (3) Как добавить обработчик не расположенный в форме? В тех случаях когда я из внешней (по отношению к форме) части программы хочу добавить кнопку или поле ввода. Насколько я знаю (могу и ошибаться) назначить обработчик можно только расположенный в модуле формы. А значит надо исполнять «танцы с бубном» по вызову своих обработчиков (расположенных например в общем модуле) из обработчиков расположенных на форме. И тут получается несостыковочка. Вроде бы форму можно полностью построить программно. Но не полностью …. т.к. обработчики должны быть в форме заранее.

    Если есть какой-то способ обойти это «ограничение» — буду рад если поделитесь со мной.

    Reply
  9. mvgfirst

    (4) Так-то оно так. Если дело касается добавления какой-нибудь «некузявой» кнопочки, или чего-то незначительно-дополняющего функциональность формы или объекта который форма представляет.

    Но если копнуть глубже, и рассматривать некую систему в которой есть оснастка, в которую разные модули (подсистемы) добавляют нужные им элементы управления (списки, диаграммы, таблицы со связью один ко многим и т.п.). Да еще и замахнуться на механику, когда пользователь сам решает какие модули и подсистемы ему нужны… Другими словами, разработать решение в стиле «плагинов» как во всяких там WinAmp-ах и прочих модных штуках. И тут получается нужно в форме-оснастке предусмотреть все возможные типы событий (который на ИТС кстати рекомендуют обрамлять префиксом «Подключаемый_»), а потом еще и у этих событий предусмотреть модель поведения когда нужны: а) только клиентские вызовы, б) клиентские и внеконтекстные сервеные, в) клиентские и контекстные серверные вызовы.

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

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

    В целом, я не пытаюсь очернить, или критиковать подходы. Просто думаю разумно было бы — побольше раскрыть нюансы именно обработки событий программно-добавленных элементов. Описать на какие подводные грабли можно наступить, как обойти.

    Reply
  10. rpgshnik

    (1) https://infostart.ru/public/1106063/ как раз заложена логика обработки событий от элементов формы. Тут нужно поиграться с именами 🙂 и Выполнить(«Кусок кода») и будет магия практически программного создания всего :)) тоже столкнулся с проблемой сначала как блин подготовить неизвестное количество событий-процедур для команд… но оказалось нужна одна, но хитровыкорчеванная, грабли конечно, но вариант имеет право на жизнь.

    Reply
  11. Anthon

    Ошибочка. Добавлять элементы на форму надо с проверкой, например,

    Если Элементы.Найти(«Владелец») = Неопределено Тогда

    ПолеВвода = Элементы.Добавить(«Владелец», Тип(«ПолеФормы»), ЭтаФорма);

    ПолеВвода.Заголовок = «Владелец»;

    ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;

    ПолеВвода.ПутьКДанным = «Объект.Владелец»;

    КонецЕсли;

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

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

    Reply
  12. rmIvanT

    Как добавить реквизиты/кнопки в нужное место(Форма, Группа, Командная панель) например в начало списка, по умолчанию элементы добавляются в конец

    Reply
  13. SlavaKron

    (12) Вставить вместо добавить. Пример для кнопки контекстного меню. Нам надо вставить ее в начало списка меню:

    Если КонтекстноеМеню.ПодчиненныеЭлементы.Количество() > 0 Тогда
    Кнопка = Форма.Элементы.Вставить(«ИмяКнопки», Тип(«КнопкаФормы»), КонтекстноеМеню, КонтекстноеМеню.ПодчиненныеЭлементы[0]);
    Иначе
    Кнопка = Форма.Элементы.Добавить(«ИмяКнопки», Тип(«КнопкаФормы»), КонтекстноеМеню);
    КонецЕсли;
    Reply
  14. rmIvanT

    (13) Благодарю, помогло

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *