Имя: Пароль:
1C
1С v8
Расширение конфигурации: как перехватить событие модуля формы без её заимствования?
, ,
0 alexey980
 
30.12.17
16:43
Пример: в типовой конфигурации есть документ РеализацияТоваровУслуг. Я хочу с помощью расширения в табличную часть Товары основной формы документа программно добавить колонку с остатками. Создал расширение, добавил (заимствовал) из типовой конфигурации форму документа и в модуль формы прописал такой код:


// перехватчики событий формы

&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)
    ЗаполнитьОстаткиНаСкладе();
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ТоварыНоменклатураПриИзмененииПосле(Элемент)
    ЗаполнитьОстаткиНаСкладе();
КонецПроцедуры

&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // добавляем реквизит для колонки остатков
    Реквизиты = Новый Массив;
    Реквизиты.Добавить(Новый РеквизитФормы("Остатки", Новый ОписаниеТипов("Строка"), "Объект.Товары" , "Доступно на складе", Ложь));
    ИзменитьРеквизиты(Реквизиты);
    
    // добавляю новый элемент формы для созданного только что реквизита
    НовыйЭлементФормы = Элементы.Добавить("ТоварыОстатки", Тип("ПолеФормы"), Элементы.Товары);             
    НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлементФормы.ТолькоПросмотр = Истина;
    НовыйЭлементФормы.ПутьКДанным = "Объект.Товары.Остатки";

КонецПроцедуры


// вспомогательная процедура заполнения колонки остатков
// используется запрос к соответствующему регистру накопления остатков

Процедура ЗаполнитьОстаткиНаСкладе()
    
    // для каждой Стр из табличной части Объект.Товары записываем Стр.Остатки = полученное из регистра значение
    // полный код не привожу, потому что суть вопроса сейчас не в этом
    
КонецПроцедуры

Расширение работает как нужно, колонка добавляется, остатки заполняются.

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

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

В общем, после каждого обновления типовой конфигурации я хочу всегда видеть новую форму документа, но с перехватчиками событий из старого расширения.
Возможно ли такое реализовать в принципе?
1 Фрэнки
 
30.12.17
17:11
нет

Контекст формы. Важно не само заимствование визуальной формы, а то, что заимствуется модуль формы и в ее контексте происходит обработка. И это еще не говорим о том, что программное добавление колонки тянет за собой и программную обработку его содержимого. Каким образом обрабатывается содержимое добавляемой колонки?
2 Lexey_
 
30.12.17
17:12
3 Фрэнки
 
30.12.17
17:13
т.е. в коде и в тексте топика объяснен порядок ее заполнение. Важно, что это заполнение происходит именно в контексте формы, что совершенно не будет доступно без ее заимствования.
4 AlvlSpb
 
30.12.17
18:47
(0) ДА. Заимствованная форма обновится вместе с конфигурацией, а вот добавленный код в расширении останется неизменным
5 Сергиус
 
30.12.17
18:56
(0)Так вроде как заимствование формы происходит один раз,а дальше уже на ее экземпляр в основной конфигурации накладывается то, что в расширении. И не важно, сколько раз обновляется конфа. В крайнем случае, у тебя просто расширение не подключится и будет ошибка.
6 Фрэнки
 
30.12.17
19:00
(5) он имеет ввиду, что основная форма получит какие-то не обязательно критичное изменение. И они окажутся перекрыты заимствованной. Вдруг.
7 alexey980
 
30.12.17
19:55
(6) да. боюсь, что при заимствовании основной формы всё, что с ней идет в придачу (а меня интересует только табличная часть Товары, и другое не нужно)будет перекрывать (или в лучшем случае просто захламлять) те изменения, которые форма получит после обновлении конфигурации, из-за чего она может оказаться неработоспособной. а значит, расширение придется переписывать регулярно.

(2) идея интересная. то есть не заимствовать форму, а создать некую "пустышку" с минимальным набором одноименных реквизитов и элементов (которые затрагиваются обработчиками-перехватчиками). и тогда, после обновлений основной формы туда будет наслаиваться только этот минимальный костяк из расширения. нужно будет попробовать.
8 Byasha
 
30.12.17
20:15
(7) Можешь даже "пустышку" сделать без реквизитов. Но тогда при программном формировании формы нужно будет ПОСЛЕ обработчика события "При создании на сервере" переопределить обработчики событий нужных тебе типовых элементов формы, на обработчики из расширения. А уже из обработчиков расширения выполнять вызов типовых. Это более геморойно, и есть вероятность что программсты 1С переопределят вызов типового обработчика, но в этом случае форма будет именно "пустышкой". В таком случае, какие-либо интерфейсные изменения типовой формы не будут влиять на расширение.
9 alexey980
 
30.12.17
20:46
(8) действительно, геморойно. нет смысла возиться. видимо, для поставленной задачи вывода остатков товара в основную форму документа механизм расширений - не самое элегантное решение. если не лезть в конфигурацию, можно вполне обойтись внешней обработкой ВидОбработкиЗаполнениеОбъекта() с типом команды ТипКомандыЗаполнениеФормы(). там минус только в том, что в документе колонка с остатками добавляется и заполняется по нажатию кнопки "Заполнить", а не автоматически
10 mistеr
 
30.12.17
22:14
(2) Это должно быть реализовано штатно и с удобствами, а не такими вот хаками. Блин, хорошую идею не могут нормально реализовать.
11 rozer76
 
30.12.17
23:18
(0) да, без обновления сохраненной формы могут быть проблемы http://курсы-по-1с.рф/news/2017-11-24-forms-customization-by-using-extensions/
12 AlvlSpb
 
30.12.17
23:54
(11) Смотрите с 11.10 Там главный вывод из всего видео Не вноси изменение в форму расширения в ИЗМЕНЕННУЮ  в конфигурации форму. Т.е. делай изменения в расширении с типовой формой и НИКОГДА не возникнет такой ситуации. Что и подтверждается практикой. Если заимствуешь типовую, то никаких обновлений не требуется, все работает как надо
13 alexey980
 
02.01.18
15:28
всё это, конечно, полезная информация. но больше для общего развития, а не для решения поставленной задачи. напомню, задача стояла в том, чтобы не изменяя типовую конфигурацию иметь возможность динамически дополнять типовую форму документа своими реквизитами и элементами.

варианты решения:

1. использовать внешнею обработку ВидОбработкиЗаполнениеОбъекта() и ТипКомандыЗаполнениеФормы()

минус - чтобы отобразить изменения на форме документа, пользователю нужно будет нажать на кнопочку "Заполнить"
    
2. используя механизм расширений, заимствовать типовую форму и в модуле заимствованной формы определить перехватчик события ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

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

минус - в общем модуле одноименный обработчик события формы полностью подменяет стандартный, то есть таких гибких инструментов как в расширении (позволяющих лишь дополнять стандартные обработчики Перед или После) там не предусмотрено
    
еще один минус -  нужно снимать с поддержки конфигурацию, хоть и порядок обновления будет в данном случае значительно упрощен (впрочем, можно сначала позаимствовать в расширение "пустой" общий модуль "МодификацияКонфигурацииПереопределяемый" и уже там описать свой обработчик события - тогда снимать с поддержки конфигурацию не придется)
14 ildary
 
02.01.18
15:48
(13) В последнем методе можно сделать так:

в ОМ(перекрытом) МодификацияКонфигурацииПереопределяемый
определяем свой обработчик, например КонтрагентПриИзмененииДобавленный()

в котором в начале или концу делаем вызовКонтрагентПриИзменении() - вот вам и Перед или После
15 alexey980
 
02.01.18
16:25
в общем, я попробовал такой вариант. заимствовал в расширение из основной конфигурации общий модуль "МодификацияКонфигурацииПереопределяемый", и прописал там следующий код:

&Перед("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
    
    Если Форма.ИмяФормы = "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента" Тогда
        
    // здесь добавляю на форму свои реквизиты и элементы
    
    КонецЕсли

КонецПроцедуры

в основной конфигурации общий модуль "МодификацияКонфигурацииПереопределяемый" не трогал (не редактировал). всё и так работает.
16 ildary
 
02.01.18
20:13
(15) именно это я и предлагал. Вообще процедура ПриСозданииНаСервере() модуля МодификацияКонфигурацииПереопределяемый позволяет сделать многое, но меня удивляет, что до сих пор эта процедура вызывается не во всех формах...
17 Мыш
 
02.01.18
21:18
(16) Оно постепенно внедряется. И зачем при наличии подобных модулей городить огород с расширениями? )
18 triviumfan
 
02.01.18
21:38
Не понимаю, что не так с расширением?! Добавил форму, удалил все ненужные элементы, таблица формы - контролируемое свойство. Все. Что за демагогия?!
19 alexey980
 
02.01.18
23:03
(17) в данном случае я вынес общий модуль "МодификацияКонфигурацииПереопределяемый" в расширение только лишь для того, чтобы вообще не трогать типовую конфигурацию. тогда при обновлении не будет никаких сравнений и объединений с конфигурацией поставщика, что позволит немного сэкономить времени
20 alexey980
 
02.01.18
23:46
(18) в (2) есть ссылка на доходчивое объяснение, что не так с расширениями, только предложенный там вариант решения очень геморройный. вариант в (15) значительно лучше, так как никакую форму в расширение вообще добавлять не нужно
21 AlvlSpb
 
03.01.18
00:46
(13)"2. используя механизм расширений, заимствовать типовую форму и в модуле заимствованной формы определить перехватчик события ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

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

Абсолютно, на все 100%, неверный, вывод.С точностью наоборот. Прекрасно отработает все внесенное новое разработчиками и после ваше изменение. НИКАКОГО конфликта, да и откуда им взяться, если у вас ПОСЛЕ? Спокойно отрабатывает код типовой и добавка - ваши изменения
22 triviumfan
 
03.01.18
00:59
(21) конфликт будет, если ты тупо добавил в расширение всю форму и за ней подтянулись десятки объектов, а также все элементы формы - контролируемые свойства.
Но так делает только невежда.
23 AlvlSpb
 
03.01.18
03:13
(22) И даже в этом случае - не могу представить конфликтной ситуации. Конфликт в формах (еще раз, для скептиков, - В ФОРМАХ) может возникнуть, по практике, только, если что-то добавляешь в интерфейс одной и той же формы в РАЗНЫХ расширениях. Даже не в модуль, а, именно, в интерфейс.
PS И вообще, складывается устойчивое впечатление, что про расширения здесь, в основном пишут теоретики, ни разу или крайне мало использовавшие расширения и знающие о них только из литературы (в лучшем случае), в худшем - руководствующиеся своим представлением как это работает, без реальной практики.
24 alexey980
 
03.01.18
11:38
(21) согласен. на счет этого момента заблуждался
25 alexey980
 
03.01.18
11:47
(22) а как тупо не всю форму добавлять? разве при заимствовании за ней автоматически не подтягиваются все связные объекты?
26 alexey980
 
03.01.18
11:59
(18) я попробовал добавить форму и потом удалить всё лишне. после этого форма перестала открываться. поэтому нужно перелопатить всю форму, чтобы разобраться, что можно удалить, а что лучше трогать
27 AlvlSpb
 
03.01.18
14:41
(26) Добавляете форму, делаете необходимые изменения и можете смело удалять лишние реквизиты, а следом за ними и подтягивающиеся с ними справочники. все что нельзя удалять, подскажет программа, остальное - смело в топку. Форма в расширении из конфигуратора может выглядеть необычно куцей, но в пользовательском режиме все будет ОК. И само расширение станет выглядеть понятней без кучи мусора подтянутого заимствованной формой
28 rozer76
 
03.01.18
23:26
(12)
>> Там главный вывод из всего видео Не вноси изменение в форму расширения в ИЗМЕНЕННУЮ  в конфигурации форму.

нет, главный вывод  - если после обновления конфы поставщик тронул расширяемую форму то необходимо зачастую обновить сохраненную форму чтобы именно изменения из расширения применялись 100% - тогда и будет все тип-топ...
29 AlvlSpb
 
04.01.18
00:10
(28) Нет и еще раз нет. Если изначально была взята типовая, НЕизмененная форма, то после обновления добавляй в форму в расширении все что угодно, будут и изменения из обновления и внесенные изменения. Вот если изначально что-то делалось с типовой в конфигураторе и эту измененную заимствовали в расширение, тогда надо обновлять.
И видео это подтверждает. Посмотрите вначале в заимствованной форме доступность поля ОТЛИЧАЕТСЯ от того же свойства в основной и в конце автор объясняет прямым текстом, что бралась уже измененная форма в расширение.
И практика показывает, что ничего не надо обновлять если берешь изначально типовую форму
30 rozer76
 
04.01.18
17:32
(29) да не причем тут измененная конфа или нет. Сохраненная форма важна и именно с ней идет анализ -основная с сохраненной и расширения с сохраненной и потом идет обьединение результа в резултформу. А сохраненная фиксируется в момент помещения формы в расширение. Так вот НУжно обновить СОХРаненную форму ручками.
31 rozer76
 
04.01.18
18:24
+ (30)
>>Вот если изначально что-то делалось с типовой в конфигураторе и эту измененную заимствовали в расширение,

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