gifts2017

Как размещать на формах типовых объектов свои элементы, не изменяя сами объекты (Обычное приложение)

Опубликовал Андрей Фомин (FandrFa) в раздел Программирование - Практика программирования

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

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

Я бы хотел рассказать про возможность, с помощью которой можно легко размещать на формах типовых объектов (справочников, документов) свои реквизиты, не редактирую сами формы вообще. // Рассматриваются конфигурации БП2 и ЗУП2, в остальных, думаю, можно сделать аналогичным способом.

Данный метод не подходит, если необходимо серьезно изменить форму, добавить свои обработчики событий. В таком случае вам следут обратиться к статье TormozIt – «Методика переопределения и вызова обработчиков событий формы в 1С 8».

Мы рассматриваем простой пример, когда вы добавляете в документ и его ТЧ несколько реквизитов и просто хотите, чтобы они показывались на форме объекта.

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

Колонка = Форма.ЭлементыФормы.ИмяТП.Колонки.Добавить("ИмяКолонки", "ЗаголовокКолонки");

Колонка.УстановитьЭлементУправления(Тип("ПолеВвода"));

Колонка.Данные = "ИмяКолонки";

И поместить вызов этой процедуры в обработчике «При открытии».

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

 Поскольку данной функциональности в платформе нет, будем использовать обходной способ.

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

В нем, в частности, используется механизм нумерации объектов:

МеханизмНумерацииОбъектов.УстановитьДоступностьПоляВводаНомера(Метаданные(), ЭтаФорма, ЭлементыФормы.ДействияФормы.Кнопки.Подменю,ЭлементыФормы.Номер);

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

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

Этот факт идеально подходит для наших целей.

Все что нам остается – разместить в конце этой процедуры примерно такой код:

модСобственныеПроцедурыИФункции .ДоработатьФормуПриОткрытии(ФормаОбъекта);

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

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

В типовой конфигурации вам требуется добавить в табличные части N документов реквизит «СвойРеквизит1». Вам необходимо, чтобы пользователь видел его и мог заполнить.

Добавление колонок в ТП мы сделаем, используя данный метод, поэтому для изменения формы N документов нам потребуется изменить только один типовой модуль.

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

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Яков Коган (Yashazz) 16.04.13 10:30
2. aspirator 23 (aspirator23) 17.04.13 07:39
3. Сергей (Feelthis) 17.04.13 15:07
У кого-то было, у кого то - нет :)
4. Maximilian Alekseevich (1cmax) 18.04.13 20:07
дада, иногда не обращаешь внимания, на то что под носом
5. nalogos nal (nalogos) 18.04.13 20:59
Типового подхода нет.
но можно поизгаляться с программным добавлением элементов формы и дело это неблагодарное.

Как делаем мы.

1. Перехват событий формы.
2. Программное отрисовка формы. Элементы формы лучше привязывать к уже имеющимся, могу порекомендовать обратить внимание на событие формы <ОбновлениеОтображения>
3. События модуля можно подписатся на события.

Очень помогли почти готовые решения такие как компиляция формы.
6. Артур Аюханов (artbear) 20.04.13 00:19
(5) nalogos, как подписываетесь на события формы? Через событие менеджера метаданного? Или какойто новый способ нашли?
7. Яков Коган (Yashazz) 20.04.13 08:48
Я вообще наворотил свой механизм, который заключается в:
1. Перехвате универсальных вызовов, расположенных в большинстве форм в инициализации, перед и при открытии;
2. Создании отдельной закладки самой формы, в её коллекции страниц;
3. Размещении всего нужного на этой закладке (точно копируя некий образец, хоть бы и иную форму), чтобы меньше морочиться с привязками;
4. Навешивании событий на эти элементы формы.
8. А Р (p1l1gr1m) 22.04.13 08:44
(7) Yashazz, (7) Yashazz, напиши статью о своем способе
9. Наталия Киселева (kng67) 23.04.13 09:57
Полезная тема.
У нас дописаны на некоторых формах отдельные страницы, которые приходится восстанавливать после обновления.
Как я понимаю, воспользовавшись советами участниками обсуждения данной темы, можно обойти эту ситуацию.
10. Яков Коган (Yashazz) 25.04.13 18:52
(8) Так уж вроде всё рассказал. На статью там не хватит, если только каждый блок и каждый этап описывать сверхдетально.
11. Роман Фомкин (Roman24) 26.04.13 09:41
(10) ну так опиши сверхдетально
12. Сергей Видякин (badboychik) 03.10.13 12:02
(7) У нас тоже такой способ - создается дополнительная форма, на нее кидаются все элементы. А при открытии процедура копирует из нее все элементы вплоть до координат и вставляет на типовую. Получается как бы "фрейм" вставляется на новую закладку. Но это геморно очень