[Шпаргалка] Программное создание элементов формы

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

Добрый день, Коллеги!

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

Применение

Есть определенные ситуации, когда без программного формирования элементов формы не обойтись:

  1. Заранее неизвестно какое количество элементов необходимо разместить на форме (Примеры: Система тестирования, где при формирование тестового задания заранее неизвестно сколько будет вопросов или документ корректировки регистров, когда так же заранее не известно какие колонки будут у таблицы формы).
  2. Доработка типового функционала. Программное размещение элементов впоследствии упрощает обновление типовых конфигураций. Многие разработчики даже придерживаются данного правила при работе с «расширениями».

Шпаргалка

 

Оглавление

Введение. 1

Общее. 2

Группа – Тип("ГруппаФормы"). 2

Поле – Тип("ПолеФормы"). 2

Создаем реквизит. 3

Создаем Поле. 3

Декорация – Тип("ДекорацияФормы"). 3

Декорация «Надпись». 3

Декорация «Картинка». 3

Кнопка – Тип("КнопкаФормы"). 3

Создание команды.. 3

Создание кнопок. 4

Бонус – общий модуль с готовыми функциями. 4

 

Введение

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

Общее

Создание элементов, реквизитов и команд лучше производить в процедуре «ПриСозданииНаСервере».

Есть два варианта размещения элементов на форме – «добавить» и «вставить».

ЭтаФорма.Элементы.Добавить([Название нового элемента], [Тип элемента], [Элемент-родитель]) – Элемент будет добавлен на размещаемый элемент-родитель в конец списка.

ЭтаФорма.Элементы.Вставить([Название нового элемента], [Тип элемента], [Элемент-родитель], [Последующий элемент]) – Элемент будет добавлен на размещаемый элемент-родитель и вставлен перед желаемым элементом.

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

 

Группа – Тип("ГруппаФормы")

Элементы формы, которые можно создать с типом «ГруппаФормы»:

  • ГруппаКнопок
  • ГруппаКолонок
  • КоманднаяПанель
  • КонтекстноеМеню
  • ОбычнаяГруппа
  • Подменю
  • Страницы
  • Страница
 

 Пример создания элементов типа "ГруппаФормы"

Поле – Тип("ПолеФормы")

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

Элементы формы, которые можно создать с типом «ПолеФормы»:

  • ПолеHTMLДокумента
  • ПолеВвода
  • ПолеГеографическойСхемы
  • ПолеГрафическойСхемы
  • ПолеДендрограммы
  • ПолеДиаграммы
  • ПолеДиаграммыГанта
  • ПолеИндикатор
  • ПолеКалендарь
  • ПолеКартинки
  • ПолеНадписи
  • ПолеПереключателя
  • ПолеПланировщика
  • ПолеПолосыРегулирования
  • ПолеТабличногоДокумента
  • ПолеТекстовогоДокумента
  • ПолеФлажок
  • ПолеФорматированногоДокумента

Создаем реквизит

При создании важно понимать, что указывается не "тип", а "описание типов" и для часто используемых типов: "строка", "число" и "дата", необходимо указывать квалификатор. Рассмотрим на примере ниже.

 

 Пример создания реквизитов

Создаем Поле

При создании поля указываем  тип «ПолеФормы», принцип мало чем отличается от создания группы:

 

 Пример создания полей

Декорация – Тип("ДекорацияФормы")

Обе существующие декорации имеют один тип, но разный вид.

Декорация «Надпись»

 

 Пример создания декорации надпись

Декорация «Картинка»

 

 Пример создания декорации картинка

Кнопка – Тип("КнопкаФормы")

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

Создание команды

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

 

 Пример заранее описанного общего действия для всех команд

 

 Пример создания команды

Создание кнопок

 

 Пример создания кнопок

Бонус – общий модуль с готовыми функциями

«Лень — двигатель прогресса» и костылей J

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

И скопируйте в него код:

 

 Код общего модуля

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

 

 Пример реализации интерфейса без использования функций общего модуля

 

 Пример реализации интерфейса с использованием функций общего модуля

 

Всем удачного кодинга!

 

Другие полезные шпаргалки:

 Несколько 1С-Серверов на одном сервере  Свой заголовок отчету на СКД (с параметрами)

 

Публикации по работе с интерфейсом:

 Интерактивный выбор даты  Интерактивный выбор периода

 Свой флажок  Цифровые и аналоговые часы

36 Comments

  1. lmnlmn

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

    Reply
  2. VmvLer

    как шпаргалка неплохо для новичков

    пара замечаний, ну куда ж без них

    1. Напишите жирным шрифтом

    синтаксис ЭтаФорма.Элементы.

    использовать только если этот фрагмент кода расположена в методе с параметром

    ЭтаФорма, например Функция СоздатьГруппуФормы(ЭтаФорма, ПараметрыГруппы)

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

    написать Элементы.

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

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

    плодить еще тонну кода в типовой, а использовать аналоги оттуда.

    пожалуй все остальное чики-пуки, больше замечаний нет.

    Reply
  3. TanisIntec

    Как раз занимался динамическим созданием, полезная инфа

    Reply
  4. Timic

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

    Reply
  5. user774630

    (2)

    можно найти в общих модулях типовых конфигураций

    Ну вы бы сказали куда смотреть хотя бы для старта.

    Reply
  6. user774630

    (6) Ну т.е. как и большинство ваших комментов — вякнуть и всё.

    Reply
  7. VmvLer

    (7) Большинство моих комментариев по существу, но прямолинейно — это неприятно многим.

    А от вас пока лишь хамство.

    В чем я не прав конкретно в комментарии в (2) или в (6) — разве это не по существу вопроса?

    Reply
  8. Senator_I

    Спасибо, полезная вещь, добавил себе в «Избранное».

    Reply
  9. rpgshnik

    (2) этот код вызывается из общего модуля, по другому не получилось. Я знаю, что в модуле формы не обязательно писать ЭтаФорма. Я предлагаю не функции копипастить в модуль формы, а целиком модуль создать для этих целей. И при необходимости вызывать с модуля формы, функцию общего модуля.

    Reply
  10. ids79

    Спасибо, полезный материал!

    Сам хотел написать подобную статью, Вы меня опередили ))

    Для расширений динамическое создание элементов форм — это уже почти стандарт.

    Reply
  11. Labotamy

    Свойство ЭтаФорма объекта УправляемаяФорма удалено и поддерживается для совместимости. https://dl04.1c.ru/content/Platform/8_3_3_641/1cv8upd.htm

    Как бы 6ть лет прошло. Пора уже вообще забыть «ЭтаФорма»

    Reply
  12. Yashazz

    (7) А вы, товарисч, не ленитесь, время — оно денег стоит, а опыт по отыскиванию чего-либо в коде БСП и вовсе бесценен. А то вам мало что разжуй, так ещё и пищеварить, а как отказывают, так вы сразу хамите? Ну-ну.

    Reply
  13. Yashazz

    (11) Вот и убивать надо за такой стандарт. Есть же нормальная возможность перегрузить форму своей собственной, нафига такие танцы с бубном? Чтоб ваши последователи тратили втрое больше времени, пытаясь а) спрогнозировать внешний вид, б) поменять, чтоб ничего не сдохло?

    Reply
  14. rpgshnik

    (12) хорошее замечание, проверю. Удаленно «условно» выходит 🙃

    Reply
  15. ids79

    (14)Позволю себе с Вами не согласиться. Я сам сперва добавлял и изменял реквизиты в загруженной в расширение форме. Но потом перешел на программное создание именно для большей прозрачности и управляемости. Хотя, в целом, я сторонник использования расширений.

    Reply
  16. Yashazz

    (15) Знаете, примерно так же со мной не соглашались, когда я говорил, что концепция «переопределяемых» модулей — это костыль. Мне говорили, ты что, это удобно, прогрессивно и прозрачно, дописал своё в типовой и обновлять легче! А потом появились расширения)

    Так что, господа, попрыгаете на грабли программной доработки формы (особенно чужой и криво сделанной), поймёте. Лет через 5 вернёмся к этой теме)

    Reply
  17. azhilichev

    (15)

    программное создание под тяжестью собственной непрозрачности, негибкости, времязатратности и громоздкости

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

    Reply
  18. azhilichev

    (14) Программное создание отлично подходит для подключаемых механизмов, в виде API. Пример. Вы реализовали визуальный инструмент, который нужно подключить к нескольким формам. Вносить интерфейсные изменения во все формы — так себе решение. При каждом изменении внешнего вида и поведения необходимо будет вносить изменения во все экземпляры. Работа же через API — более логичное решение. Условно, при создании формы вызывается конструктор, который дополняет форму. И вся работа инструмента идет через 1-3 обработчика, которые используют единую логику, вынесенную в общий модуль.

    Reply
  19. Andrefan

    Отличная работа, спасибо. Для полноты картины хотелось бы ещё увидеть сложные ЭУ: таблица формы, динамический список, командная панель, контекстное меню таблиц.

    Reply
  20. MVK80

    (12), это будет до тех пор, пока разработчики типовых сами не избавятся от этого. Так-то, да я сам всегда использую ЭтотОбъект вместо ЭтаФорма и другим рекомендую.

    Reply
  21. rpgshnik

    (21) Динамический список включен в код модуля в конце публикации, а писал я про него уже давненько https://infostart.ru/public/728597/

    Reply
  22. smirnov.es

    Дима, спасибо за такой качественный контент.

    Reply
  23. rpgshnik

    (24) Пожалуйста, Жека 😉

    Reply
  24. unichkin

    (2) еще для передачи параметра в 8.3 не «ЭтаФорма», а «ЭтотОбъект».

    https://its.1c.ru/db/metod8dev/content/5293/hdoc/_top/%D1%8D%D1%82%D0%B0%D1­%84%D0%BE%D1%80%D0%BC%D0%B0

    Reply
  25. lvictor58

    (18) Ну, во-первых 5 лет еще как-то надо прожить, работать и зарабатывать, а не ждать непонятно чего.

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

    Reply
  26. Yashazz

    (19) Только это уникально редко встречается.

    Reply
  27. sulitckaja

    Есть реквизит формы «Таблица значений». При выборе у колонки на форме «ПутьКДанным»

    открывается форма «Выбор реквизита» в которой помимо реквизитов (колонки) есть еще реквизит Строка[0]

    в которой тоже присутствуют колонки. Может кто то подсказать, как и для чего используется реквизит Сnрока[0]? или ссылку где можно почитать? Изображение прикреплено.

    Спасибо заранее.

    Reply
  28. dhurricane

    (29) Т.о. можно, например, реализовать два варианта интерфейса: полный (с таблицей) и упрощенный (реквизиты первой строки отображаются как обычные поля ввода). Такое встречается в типовых конфигурация, например УТ11, документ «Заявка на расходование денежных средств». Он содержит переключатель для расшифровки платежа «Без разбиения / Списком» (см. рис.)

    P.S. Я немного слукавил. В УТ используется не первая строка таблицы, а текущая. Подход немного другой, но сути это не меняет.

    Reply
  29. sulitckaja

    (30)Спасибо большое за помощь.

    Reply
  30. karpik666

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

    Функция ВозможныеПараметрыДекорации()
    ПараметрыДекорации = Новый Структура(«Ширина, Высота, Вид»);
    Возврат ПараметрыДекорации;
    КонецФункции;

    поможет напомнить, что конкретно можно передать.

    Reply
  31. ksi_2166

    Спасибо от новичка в 8-ке

    Reply
  32. XSlava

    (32)Везде тупой не осмысленный код встречается, а не у только «1С-ников». Вы наверное ошиблись форумом.

    Reply
  33. azhilichev

    (35) «неосмысленный» пишется слитно. Перед и после «наверное» нужны запятые.

    Reply
  34. XSlava

    (36)Вы точно ошиблись форумом.

    Reply
  35. yurikmellon

    Спасибо, думаю пригодится

    Reply
  36. decdmb

    Очень удобно использовать в общем модуле МодификацияКонфигурацииПереопределяемый — так можно вносить изменения в типовые формы практически не изменяя их модуль (только добавляя процедуры обработчиков событий)

    Reply

Leave a Comment

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