gifts2017

Псевдо подписка на открытие форм в типовых конфигурациях 1С.

Опубликовал Дмитрий Калачев (wildhog) в раздел Администрирование - Системное

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

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

Всем известно что при внесении изменений в типовые конфигурации выгоднее руководствоваться принципом "Добавлять - лучше чем изменять". При небольших изменениях, например пользовательского интерфейса для облегчения последующего обновления лучше делать изменения программно. Это очевидно. И при открытии формы вставлять код, делающий изменения на форме, в процедуру события "При открытии".

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

В форме документа и элемента справочника - "УстановитьДоступностьПоляВводаНомера"

В форме списка и выбора документов -  "УстановитьОтборПоОрганизации"

Добавив в эти процедуры всего одну строчку кода вызывающую нашу процедуры - получаем псевдо подписку на событие "При открытии" большинства форм документов и справочников конфигурации не внося в сами формы ни строчки кода. т.е не изменяя их.  В самой процедуре определяем какая форма открылась например получив основной реквизит формы ,или любым другим способом и выполняем с формой все что необходимо - добавляем столбцы ТЧ, кнопки, переопределяем  обработчики событий формы и элементов формы и т.д

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

Вот... :)

Добавлено 02.06.2009

Сегодня tsd при обсуждении механизма редактирования добавленных реквизитов объектов предложил еще один вариант организации "псевдо подписки на открытие формы" и нетолько.

За  что ему бааальььшооооеее спасибо :)

А именно.

В своих последних типовых конфигурациях на 8 платформе фирма 1С реализовала такую полезную весчь как "Советы". Как любые ленивые программисты  - программисты фирмы 1С реализовали кнопку "Советы" программно. Т.е перед открытием формы вызывается процедура общего модуля "РаботаСДиалогами" - "УстановитьПодменюСоветы". Параметром ей передается "КоманднаяПанель". У передаваемой командной панели есть свойство "ИсточникДействия" - типа "Форма". Собственно она то нам и нужна!!! :)

Об обработчике нажатия кнопки "Советы" программисты 1С тоже позаботились.  Процедура - обработчик нажатия в форме вызывает также процедуру общего модуля "РаботаСДиалогами" - "ОткрытьСоветы". Форму в этой процедуре уже (наверное...) не получить, но и не больно то хотелось. Эта процедура нам может понадобиться для размещения обработчиков событий нажатия НАМИ созданных новых кнопок. Определять что за кнопка можно например по имени.

Таким образом мы, как не менее ленивые, чем программисты фирмы 1С можем использовать данный механизм не только для "псевдо подписки" на открытие формы, но и в некоторых случаях разместить обработчики событий элементов формы вне модуля формы. (Эхх, если бы это реализовали на уровне платформы....) Разумно применяя данную методику можно значительно снизить количество изменений типовых объектов конфигураций.

Вот... :)

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Василий Демидов (Душелов) 19.12.08 09:11
Давно этим пользуюсь и создаю программно элементы формы у типовых документов.
2. larissa builova (larisab) 20.12.08 21:24
Ну это касается 8, в ней всетаки легче обновлять, тут форму открыть и посмотреть можно и ту и другую.
А в семерке совсем туго обновлять, когда на форме бантиков добавлено.
Я при измении типовой, стараюсь форму не трогать без лишей необходимости.
Был случай, когда обновляла конфу, перенастроенную разными программистами и в течении лет 5 ни разу не обновляли толком, причем бухам говорили, что никто в городе такое не сможет сделать. Убила 25 часов, поставила.
На след.день звонят, оплачивать не будем, программа не работает. Оказывается пропал "бантик", а они без него жить не могут... Восстановить - 1 минута, но чуть не потеряла оплату недельной работы. С тех по не люблю программистов, которые меняют что-то на форме, не отражая это никак в коде или объектно.
3. larissa builova (larisab) 20.12.08 21:32
(0) +1 Ставлю плюс, а его не видно, ставлю второй раз, грит, вы уже голосовли
4. Сергей Старых (tormozit) 20.12.08 23:01
5. Сергей Старых (tormozit) 20.12.08 23:03
Кстати ссылка на статью http://infostart.ru/blogs/748/ у тебя не работает.
6. Дмитрий Калачев (wildhog) 22.12.08 09:54
(4) Видел, читал, много думал. Очень полезная информация. Как говориться - в избранное.
Но, Вы предлагаете добавлять свои процедуры в обработчики событий ВСЕХ форм. А я предлагаю этого не делать, а воспользоваться инструментами которые предлагает сама типовая конфигурация. В некоторых случаях (я думаю часто, очень часто) вносимые изменения не особо существенны, но однотипны и множественны.
Привожу пример. Бухгалтерия жутко привыкла работать с артикулами номенклатуры. И хочет во всех документах, ТЧасти которых, содержат номенклатуру видеть ее артикул. Если использовать мой метод, для динамического добавления колонки артикула необходимо изменить всего одну процедуру в типовой. Конечно, процедуру вывода артикула всеже придеться добавлять в ручную, и тут Ваш метод - 100% решение.
Второй пример еще удачнее. Вывод в УТ в ТЧ документов доп.свойств той же номенклатуры. В УТ 10.3 это вообще делается в 2 строки. В процедуре УстановитьДоступностьПоляВводаНомера добавляем вывод колонки в ТЧ. А в "ПоказатьКодАртикул" выводим непосредственно значение. Выгода как говориться налицо, точнее на конфу :)
В общем хотел донести мысль о том, что типовые конфигурации очень часто предоставляют возможности "мягкого" изменения конфигурации, и эти возможно стоит использовать. Естественно по месту, по ситуации и с пониманием того, что делаешь.
(5) Виноват, исправлюсь :) Не разобрался с добавление гиперссылки...
7. Дмитрий Калачев (wildhog) 22.12.08 10:00
(6) Неправильно выразился. Вместо "обработчики событий" читать "модули"...
9. igor_gk (igor_gk) 03.06.09 12:30
Вот это какой-то гемор: "... В самой процедуре определяем какая форма открылась например получив основной реквизит формы ,или любым другим способом..."
А как-то красивее и проще можно?
10. inse0f (inse0f) 03.06.09 22:16
(9) увы
я тоже с этим столкнулся

вообще то есть в ИР наброски по настройке типовых форм по макету
на ее идеи я делал механизм настройки - копирование из шаблонной формы в типовую новых элементов
механизм работает только не так быстро как хотелось бы, с новой формой идея отличная

если раньше меня не сделают) подарю всем пряники к осени :)
11. Дмитрий Калачев (wildhog) 04.06.09 09:47
(9, 10) Гемор говорите, проблема? :) Учитывая что за Вас уже все сделали в плане определения основного реквизита формы, и соответственно - что за форма открылась. Абсолютно никаких проблем. тем более ссылку как это сделать привел. А красивее и проще у меня не получилось... Есть идеи - поделитесь. Хотя бы направлением в какую сторону копать, эксковатор стоит под парами :)
Имхо , лучше один раз сделать процедуру - потом в 10 обновлениях горя не знать, чем постоянно помнить где- что добавил изменил.
12. igor_gk (igor_gk) 04.06.09 15:01
Вчера вот сидел думал, и вот чего придумал :)
(Сразу предупреждаю - мне нужно просто "поймать" форму)

// Вызывается при открытии форм элементов справочников и документов
// из ОбщиеМодули.РаботаСДиалогами.УстановитьДоступностьПоляВводаНомера(...)
Процедура Игорь_ПриОткрытииФормыЭлементаДокумента(ФормаОбъекта) Экспорт
Попытка
ФормаОбъекта_Имя=ФормаОбъекта.Метаданные().ПолноеИмя();
ПозицияТочки=Найти(ФормаОбъекта_Имя,".");
ВидОбъекта=Лев(ФормаОбъекта_Имя,ПозицияТочки-1);
НазваниеОбъекта=Сред(ФормаОбъекта_Имя,ПозицияТочки+1);
Элемент=?(ВидОбъекта="Справочник","элемента ","");
Сообщить ("Открыта форма "+Элемент+ВидОбъекта+"а """+НазваниеОбъекта+""".");
// ФормаОбъекта.Закрыть(); // А ведь эта строчка может работать...
Исключение
КонецПопытки;
КонецПроцедуры
13. igor_gk (igor_gk) 04.06.09 15:12
Забыл сказать - это в УПП.
14. Дмитрий Калачев (wildhog) 04.06.09 17:19
(12) Млин, честно (извини за фомильярность) странный ты человек :)
Удалять гланды через ж... это по твоему нормально. а СКОПИРОВАТЬ четыре функции в свой общий модуль - слишком сложно.
Приведу тебе пример как я реализовал определение открытой формы. (использую функции из http://infostart.ru/blogs/748/)

ИмяОсновногоРеквизита = ЛксПолучитьИмяОсновногоРеквизитаФормы(Форма);
ОсновнойРеквизит = Форма[ИмяОсновногоРеквизита];
Если ТипЗнч(ОсновнойРеквизит) = Тип("ДокументОбъект.СчетНаОплату")
Сообщить("Открылась форма "+ОсновнойРеквизит);
КонецЕсли;

Тебе не кажется что несколько проще получилось?
15. igor_gk (igor_gk) 04.06.09 17:41
(14) "...Тебе не кажется что несколько проще получилось?"
Скажу больше - с функциями надежнее и правильнее, не нужно трястись, что 1С-ники прибьют свою "УстановитьДоступностьПоляВводаНомера", пользовать можно в любом месте, ну и вообще...
Но я ж делал только то что мне надо ;) и пользовал токо встроенные 1С-ные механизмы - что бы определить форму (для _моих_ задач) нужно всего 4-5 строчек, все. И никаких доп. ф-ций. Т.е. абсолютно ;)
16. Andrey Sokolenko (chang) 20.08.09 10:30
а я что-то не понимаю, а почему просто не сделать подписку на событие ПередОткрытием, где определить тип источника и отказавшись от стандартной обработки открытия, получить форму документа этого источника и самостоятельно открыть?
17. Артур Аюханов (artbear) 20.08.09 10:47
(16) Где в 8.1 (мы же говорим о типовых конфах) видел подписку на события формы объектов??
Подписка возможна только на события объектов !
18. Alex Rogachev (it_huntsman) 16.11.10 09:28
Спасибо, очень помогло когда потребовалось установить всем запрет на редактирование элемента формы "Ответственный".
19. lootinn 12.01.12 10:28
Спасибо, метод удобный и написано доступней, чем в других подобных публикациях.
20. Михаил Ражиков (tango) 12.01.12 10:43
(2) Лариса, имхо, предшественников не стоит пинать, ты ведь не знаешь, в каких условиях они были, а судя по твоим же словам (о звонке по бантику) - в не сладких. Полагаю, праведный (но тщательно скрываемый) гнев твой обращен должен быть как раз на "заказчика". Ну, и цена (именно цена за час) твоей работы в этом случае должна была быть такой, чтобы все эти приколы компенсировать. Если это было не так - обращай гнев свой на себя.
pavlo; brunen9; +2 Ответить
21. Zigfridish (Bassgood) 09.02.12 18:33
Ошибочное утверждение (подчеркнуто жирным):
"Таким образом мы, как не менее ленивые, чем программисты фирмы 1С можем использовать данный механизм не только для "псевдо подписки" на открытие формы, но и в некоторых случаях разместить обработчики событий элементов формы вне модуля формы."
Процедуры-обработчики событий элементов формы могут располагаться только в модуле самой формы, которой они принадлежат, т.е. процедуру по-любому придется описывать в модуле формы (если в ней есть необходимость).
22. Дмитрий Калачев (wildhog) 10.02.12 11:52
(21) Zigfridish,
Имелось ввиду, что некоторые обработчики событий присутствуют практически во всех формах, и по сути вызывают функции общих модулей. Поэтому перехватив выполнение кода в общем модуле можно "изменить" действия выполняемые обработчиком события, или вообще выполнять что-то иное - тем самым фактически разместив обработчики событий элементов формы вне модуля формы )
23. Zigfridish (Bassgood) 12.02.12 18:13
(22) wildhog,
Правильно, но все таки та фраза, которую я выделил в прошлом коменте, немного сбивает с толку, что имеется в виду исполнение алгоритма имеющегося обработчика события в общем модуле, а не в самой процедуре-обработчике формы =)
24. Мария Маленко (sweety-twetty) 08.02.13 11:16
Пользуюсь для создания элементов формы с помощью программного кода,но в данный момент возник вопрос: а можно ли в данной процедуре определить отказ от открытия формы?
25. Дмитрий Калачев (wildhog) 08.02.13 11:24
(24)
Можно закрыть форму и все.
26. Мария Маленко (sweety-twetty) 08.02.13 11:26
(25) просто хочу при выполнении некоторых условий, чтобы доступа к форме не было для некоторых сотрудников.

Вы хотите сказать передать назад отказ=истина или что-то в этом роде?у меня передается в общий модуль Форма и Метаданные - или Фома.Закрыть()?
27. Дмитрий Калачев (wildhog) 08.02.13 11:32
(26) Именно форма.закрыть();
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа