Программная модификация и генерация форм

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

Я отношусь к адептам программной модификации форм и считаю это лучшим способом сократить количество анальной боли при обновлении конфигураций.

А ещё программная генерация элементов форм позволяет сделать, например, динамическое количество колонок (как в документах установки цен).

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

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

Модификацию формы привязываем к событию “ПриСозданииНаСервере”

Группа формы

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

Таким образом мы создали сразу свернутую группу. В которую в дальнейшем мы положим наши реквизиты объекта.

Реквизиты объекта

Начнем с самого простого. Мы создали реквизит в документе, справочнике, обработке или ещё где нибудь и хотим разместить его на форме, в надежде, что он будет сохраняться при записи нашего объекта.

Для примера возьмем реквизит Контрагент и разместим его в группе “МОД_СвернутаяГруппа”

Табличная часть

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

Вот мы и добрались до табличной части. В принципе такая же самые принципы. Главное отличие в том, что нам сначала нужно вывести таблицу формы, а затем привязать к этой таблице колонки. Просто обращаем внимание на поле “ПутьКДанным”.

Но табличная часть получилась уродской. Дата в одном конце таблицы, сумма в другом…

Для красоты выведем заглушку в нашу табличную часть

Красивее же?!

Реквизиты формы

При добавлении заглушки мы подобрались к программному созданию реквизитов формы. То есть тех реквизитов, которые мы не хотим сохранять автоматически в объекте (документе или справочнике). Но хотим выводить в них какие то служебные данные и не только.

Давайте сразу сделаем таблицу значений.

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

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

А теперь генерируем элементы

Ну вроде выглядит неплохо.

Кнопки

Добавление кнопки делается в 3 этапа

  1. Создание команды
  2. Размещение команды на форме
  3. Определение обработчика команды

Обработчик команды – это просто клиентская процедура в модуле формы.

Меню и подменю

Кнопку мы добавляли в стандартную командную панель формы. Подобным образом можно размещать в командные панели динамического списка, табличной части итп. Но только вместо Элементы.ФормаКоманднаяПанель, было бы Элементы.ИмяТабличнойЧасти.КоманднаяПанель

Но давайте накодим свою командную панель с кнопками и подменю.

Получаем такой результат:

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

Всё это время, мы пользовались методом Элементы.Добавить(<Имя>, <ТипЭлемента>, <Родитель>), который добавляем новый элемент в конец родительской группы, если указан родитель и в конец формы, если в родителя передаем Неопределено.

Существует метод Элементы.Вставить(<Имя>, <ТипЭлемента>, <Родитель>, <Элемент>), где последним параметром передается элемент родительской группы, ПЕРЕД КОТОРЫМ мы хотим добавить наш вновь созданный элемент.

Представим, что мы хотим вставить новую кнопку между уже существующими

Результат:

Всё тоже самое можно использовать для других элементов на форме.

Страницы

Это вообще easy peasy lemon squeezy

Перемещение элементов формы

А давайте теперь контрагента из группы с табличной значений переместим на страницу 2. И поставим его перед декорацией.

Динамические списки

Про динамические списки у меня есть отдельная статья, посвященная только им.

Лайфхаки

Для некоторого упрощения можно использовать использовать библиотеки для упрощенной генерации элементов форм. Первая попавшаяся: https://infostart.ru/1c/articles/1270443/

Интересный инструмент – “Декомпилятор управляемых форм” https://infostart.ru/public/304736/ Поддерживает не все свойства элементов форм. Да и сгенерированный код получается немного “грязноватым”, но бывает очень удобно накидать в конфигураторе элементов и в режиме предприятия просто сгенерировать значительную часть кода.

Файлы и заключение

Когда соберетесь модифицировать формы, то не пишите весь код в событии ПриСозданииНаСервере, а выносите блоками. Блок с табличной частью, блок с какой то одной группой итп. Я к такому привык очень быстро, когда при разработке приложений под ОС Android пересел с View на JetPack Compose. В котором вообще весь интерфейс генерируется кодом.

Подготовленный пример в виде внешней обработки, который работает на БП, РТ, УНФ, УТ, КА2, ERP

chevron_left
chevron_right