Обработчики событий при записи объектов. Зачем и что за чем?

0. AlbinaAAA 1294 25.07.19 15:06 Сейчас в теме
Программисту, имеющему немного опыта на платформе 1С 8.3, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта....

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

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

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. s22 19 25.07.19 19:26 Сейчас в теме
+
serverstar; DrAku1a; avmironov; user692332_tomskih_nl; ivangrant; any__uta; Marina_Sh; AlbinaAAA; +8 Ответить
2. Xershi 1389 25.07.19 20:40 Сейчас в теме
На ИС уже есть такая статья.
Так мало того про подписки на события ни слова!
3. AlbinaAAA 1294 25.07.19 20:50 Сейчас в теме
(2) То была моя статья, написанная в 2012-м году. Меня радует, что вы её помните (если речь о ней). Но по новым правилам на старые публикации не начисляются стартмани. Мне порекомендовали в техподдержке ту удалить и создать новую. Чтобы не быть голословной прикрепляю скрин с личного кабинета, где видно ту статью неактивной, и скрин с ответом с техподдержки. Я статью значительно доработала, а про подписки допишу. Спасибо за отклик!
Прикрепленные файлы:
debuger; bgazobeton; userMKA; Jimbo; avmironov; METAL; Maxanamoon; RuSeek; user847462; arakelyan; ivangrant; Alia777; user1126770; Suslik_Johns; mamonth; Светлый ум; marcal116; Award; dsdred; user650871_vaskozmin; A_Max; user811769; catv; Evg-Lylyk; +24 Ответить
4. Xershi 1389 25.07.19 21:21 Сейчас в теме
(3) прикол! Да, будет кстати!
5. rusmil 256 26.07.19 05:21 Сейчас в теме
(3) А сколько должно пройти времени для статьи, по прошествии которого перестают начисляться стартмани?
7. AlbinaAAA 1294 26.07.19 06:30 Сейчас в теме
(5) зависит от даты публикации. Если статья опубликована раньше 2013 года, то не начисляются. Почему, не знаю.
8. rusmil 256 26.07.19 06:40 Сейчас в теме
(3) Я правильно понимаю, что удалив старую статью, у вас уменьшился общий рейтинг как автора?
Может стоило просто в старой статье задать ссылку на новую статью?
user1044557; avmironov; user1126770; RustIG; AlbinaAAA; +5 Ответить
9. AlbinaAAA 1294 26.07.19 08:19 Сейчас в теме
(8) Спасибо большое за подсказку, сама не догадалась так сделать :)) Отправила на модерацию, посмотрим пропустят ли..
12. AlbinaAAA 1294 26.07.19 12:13 Сейчас в теме
(8) модератор не пропускает такую публикацию :(
13. rusmil 256 26.07.19 12:55 Сейчас в теме
(12) Интересно, как это модератор мотивирует.? В Вашем случае получается пишем новую статью и теряем рейтинг? Мне кажется это как-то несправедливо.
Мах; avmironov; user847462; RustIG; +4 Ответить
14. AlbinaAAA 1294 26.07.19 13:03 Сейчас в теме
(13) дословно "вас обсмеют в комментариях и меня тоже", два раза отправляла и два раза отказ с непонятным ответом..
15. rusmil 256 26.07.19 13:21 Сейчас в теме
(14) Ну тогда может они смогут рейтинг накопленный на старой статье перекинуть в новую статью, ведь он накоплен заслуженно, а новая статья это замена старой, чем такой вариант им не подходит?
Мах; avmironov; user847462; RustIG; +4 Ответить
16. AlbinaAAA 1294 26.07.19 13:27 Сейчас в теме
(15) Напишу в техподдержку с такой просьбой. Спасибо вам за участие!
18. AlbinaAAA 1294 29.07.19 20:18 Сейчас в теме
(8) получилось :)) ещё раз благодарю!
avmironov; +1 Ответить
24. alexey-simf 25.11.19 13:50 Сейчас в теме
(3) Для более полного комплекта можно и расширения упомянуть.
26. user970589 8 13.06.20 10:24 Сейчас в теме
(3)подскажите, есть ли возможность сделать подписку на обращение к реквизиту справочника? на чтение. Просто РЛС ковырять долго по правам. Если бы можно было выдернуть при обращении.. понимаю, что скорее всего нет, если вы полно изложили информацию в статье.
А, вижу, что нет, извините.
10. w.r. 639 26.07.19 08:28 Сейчас в теме
(2)

Так мало того про подписки на события ни слова!


Вот это самая интересная тема. Так как большинство типовых конфигураций на поддержке удобно менять именно через подписки
6. sam441 198 26.07.19 06:07 Сейчас в теме
11. Hatson 514 26.07.19 09:34 Сейчас в теме
Дополнение к материалу из книги
"Разработка управляемого интерфейса"
Глава 3.9. Последовательность событий при записи объекта из формы.
avmironov; METAL; AlbinaAAA; +3 Ответить
17. vikhrov53 52 29.07.19 13:30 Сейчас в теме
Спасибо за хорошо структурированный материал. Коротко и ясно и с пояснениями где и как применять. Возможно стоит стилистически доработать раздел "В модуле формы или в модуле объекта ?", а то при первом прочтении я не все понял.
avmironov; +1 Ответить
19. FreeArcher 150 06.08.19 10:07 Сейчас в теме
Отличная статья.
Но хорошо бы рассмотреть обратный процесс т.е. отмену проведения. Там последовательность событий иногда сбивает столку, когда забываешь порядок.
avmironov; +1 Ответить
20. kuzyara 1596 15.08.19 10:30 Сейчас в теме
Прикрепленные файлы:
Tjodmar; CodeNull; shiaju; bgazobeton; Divedition; avmironov; METAL; user847462; pal; Дмитрий74Чел; Kamik; MarinaLed; Dnki; FreeArcher; +14 Ответить
21. u_n_k_n_o_w_n 33 19.08.19 09:31 Сейчас в теме
Отличная статья!!!

Спасибо за ваш труд.
user1098876; avmironov; user1485340; +3 Ответить
22. Dnki 4 29.09.19 11:13 Сейчас в теме
Спасибо! Хочу посмотреть на Ваш косметичку и удивиться.
user1485340; +1 Ответить
23. ymarch 21.10.19 23:09 Сейчас в теме
Спасибо, очень полезно.
avmironov; user1485340; +2 Ответить
25. topchydv 27.02.20 08:40 Сейчас в теме
Спасибо, очень лаконично и насыщенно. Все по делу. Статья помогла разложить все по полочкам у меня в голове!
user1098876; avmironov; +2 Ответить
27. Rabot 86 09.07.20 18:59 Сейчас в теме
Я бы добавил такой нюанс про подписки на события. Допустим у нас есть несколько подписок на событие документа "ПриЗаписи".
Если Отказ установить в обработчике объекта "ПриЗаписи", то ни одна подписка вызываться уже не будет.
А вот, если Отказ установить в одной из подписок "ПриЗаписи", то последующие подписки всё равно будут вызваны, хоть и с флагом Отказ = Истина.
Не знаю уж баг это или фишка, но на сколько я знаю это до сих пор так.
avmironov; AlbinaAAA; +2 Ответить
28. maxdmt 27 06.08.20 14:05 Сейчас в теме
Интересное дело.
Если в форме вызвать запись/провдение/отмену проведения - обработчики в форме вызываются.
Если в форме вызвать пометку на удаление - обработчики в форме не вызываются.
29. YuruSar 08.12.20 12:02 Сейчас в теме
Недоумкам, типа я,
Очень нужная статья...
По Вашему гвайду я
Пройду путём создателя.
avmironov; AlbinaAAA; +2 Ответить
30. AlbinaAAA 1294 09.12.20 11:52 Сейчас в теме
31. YuruSar 09.12.20 16:30 Сейчас в теме
(30) Создатель сволочь. ЗиКГУ, документ Увольнение. Многофункциональный, ЭТК, в ПФР. Пытаюсь в интерфейсе поменять комментарий - безуспешно. Ловлю по подписке, меняю, сохраняю. Ловлю повторно в подписке. Источник.Комментарий до исправления. Источник.Ссылка.Комментарий - измененный. Очень тонкий клиент. Просветите!
32. dhurricane 09.03.21 15:50 Сейчас в теме
По поводу события формы "ПриЗаписиНаСервере":
Если нужно изменить записанные данные перед отправкой их на клиент, необходимо использовать ТекущийОбъект

Есть ли у Вас примеры, для чего это может понадобиться?
33. user1562048 14.03.21 09:31 Сейчас в теме
При записи на сервере))))
(32)
34. nickoleyes@gmail.com 24.08.21 10:21 Сейчас в теме
(32) Заполнить Ответственного
35. dhurricane 24.08.21 11:08 Сейчас в теме
(34) Зачем заполнять Ответственного в данных формы, но без записи этого ответственного в базу данных?
36. nickoleyes@gmail.com 24.08.21 13:21 Сейчас в теме
(35) ТекущийОбъект, это данные записываемого в базу данных объекта.
37. dhurricane 24.08.21 13:31 Сейчас в теме
(36) ...в обработчике "ПередЗаписьюНаСервере". В обсуждаемом же обработчике "ПриЗаписиНаСервере" это уже записанный объект.
38. nickoleyes@gmail.com 24.08.21 13:44 Сейчас в теме
(37) ВЫ правы. Прошу прощения. Замылился.
39. AlbinaAAA 1294 24.08.21 17:11 Сейчас в теме
(32) Наверно правильнее было бы написать так: "Если нужно изменить записанные дополнительные данные на основании данных формы и данных объекта, то необходимо использовать в данном обработчике при обращении к данным объекта ТекущийОбъект, а при обращении к реквизитам формы Объект"
Назначение этого обработчика – записать в базу данных дополнительную информацию, связанную с данными записываемого объекта. Оно аналогично предыдущему обработчику "При записи", там то же самое назначение, но в модуле объекта. Ведь совсем не обязательно, что все исходные данные для записи дополнительной информации находятся в самом объекте. Они могут находиться и в форме. Как раз для таких случаев и предназначено это событие.

Пример: До записи объекта был какой-то РеквизитОбъекта = 3 и во время записи РеквизитОбъекта по каким-то условиям программно в обработчиках выше поменяли, например, на 5. Т.е. записали в базу РеквизитОбъекта =5 и получилось, что в данном обработчике "ПриЗаписиНаСервере" Объект.РеквизитОбъекта = 3, а ТекущийОбъект.РеквизитОбъекта=5.
А ранее, в обработчике ПриЗаписи в модуле объекта, создали какой-то документ, который должен быть создан и записан только, если создан и записан этот объект (поэтому делаем то в транзакции). Далее, пришли в обработчик модуля формы "ПриЗаписиНаСервере" и видим, что там реквизит формы , в зависимости от которого и значения РеквизитОбъекта нужно что-то дописать в тот ранее созданный и записанный документ. И вот тут используем в условии Объект.РеквизитФормы и ТекущийОбъект.РеквизитОбъекта (а не Объект.РеквизитОбъекта). Надеюсь, понятно написала)
avmironov; +1 Ответить
40. dhurricane 24.08.21 17:35 Сейчас в теме
(39) Какие тогда данные в Вашем примере уходят на клиент? Вновь созданный объект?

Процитированную в моем сообщении фразу я понял, как "Если хотите увидеть в форме объекта РеквизитОбъекта равным 4, необходимо писать ТекущийОбъект.РеквизитОбъекта = 4". Вероятно, неправильно понял, но не представляю, как еще можно интепретировать фразу "перед отправкой их [прим.: данные] на клиент".
41. AlbinaAAA 1294 24.08.21 17:47 Сейчас в теме
(40) Согласна. Вы поняли правильно, как написано. Мне правильнее было бы написать так "Если нужно изменить записанные дополнительные данные на основании данных формы и данных объекта, то необходимо использовать в данном обработчике при обращении к данным объекта ТекущийОбъект, а при обращении к реквизитам формы Объект".

Ну, а если, помедитировать над фразой "перед отправкой на клиент", то можно представить такой пример: далее после передачи данных объекта на клиент мы должны отразить эти, созданные дополнительные данные, на форме . Например на форме есть надпись реквизит формы "Создан документ такой-то с такими-то данными".
После обсуждаемого выше обработчика вызывается событие формы После записи на сервере, смысл которого, вывод в форме некоторой дополнительной информации, связанной с данными объекта. И там мы отразим данные созданного документа.
avmironov; +1 Ответить
42. dhurricane 24.08.21 17:58 Сейчас в теме
(41)
Например на форме есть надпись реквизит формы "Создан документ такой-то с такими-то данными".
Пример плохой практики. :-) При возникновении ошибки транзакция будет отменена, а вот изменения в данных формы - нет.

Вспомнил другой пример из практики для передачи данных на клиент:
* в модуле объекта при записи в дополнительные свойства помещаются некоторые данные (например, результат проверки, или созданные связанные объекты);
* в модуле формы ПриЗаписиНаСервере (или ПослеЗаписиНаСервере) из дополнительных свойств данные извлекаются и помещаются в параметры записи для передачи их на клиент;
* в модуле формы ПослеЗаписи из параметров извлекаются данные и каким-либо образом отображаются пользователю (например, в отдельной форме списка созданных объектов).
43. AlbinaAAA 1294 24.08.21 18:01 Сейчас в теме
(42) не соглашусь.
Пример плохой практики. :-) При возникновении ошибки транзакция будет отменена, а вот изменения в данных формы - нет.
Транзакция завершена и, если мы попали в обработчик После записи на сервере, значит всё записано.
44. dhurricane 24.08.21 18:02 Сейчас в теме
(43) Так транзакция может быть отменена здесь же, в обработчике "ПриЗаписиНаСервере".
45. dhurricane 24.08.21 18:09 Сейчас в теме
(43) Ой, неверно прочитал Ваш ответ, соответственно неверно его прокомментировал. Мы же говорим про событие "ПриЗаписиНаСервере", а не "ПослеЗаписиНаСервере".
46. AlbinaAAA 1294 25.08.21 09:12 Сейчас в теме
(45) и я вчера ступила)) Написала , что при обращении к реквизитам формы мы обращаемся через Объект. Нет, обращаемся напрямую к реквизиту формы, без Объект- мы же говорим про модуль формы и про реквизит формы! Внесла в статью изменение, спасибо за замечание!
avmironov; +1 Ответить
47. Funtik90 26.09.21 13:15 Сейчас в теме
Здравствуйте. объясните пожалуйста: "И ещё, отдельно отмечу, что при программной записи события модуля формы не запускаются!"
48. dklp 41 03.11.21 07:01 Сейчас в теме
Провожу отладку расширения для типовой конфигурации "Управление торговлей, 11.4" и заметил, что при записи документа "ЗаказКлиента" обработчик события модуля формы "ПередЗаписью" срабатывает дважды: один раз - по команде "ЗаписатьДокумент" непосредственно из самой формы при нажатии кнопки "Записать", а второй вызов происходит отсюда:

&НаКлиенте
Процедура Подключаемый_ОбработатьЗаписьОбъекта()
	
	ОбщегоНазначенияУТКлиент.ОбработатьЗаписьОбъектаВФорме(ЭтотОбъект, ПараметрыДляЗаписи);
	
КонецПроцедуры

Это стандартный механизм, предусмотренный типовой конфигурацией?

У меня просто в расширении после обработчика события "ПередЗаписью" происходит проверка правильности заполнения реквизитов, и пользователю выдается сообщение, если что-то не так. Заметил, что сообщение выскакивает дважды - прогнал по отладчику и увидел, что зачем-то производится двойная запись документа.
51. user1228586 03.05.23 14:58 Сейчас в теме
(48)
при записи документа "ЗаказКлиента" обработчик события модуля формы "ПередЗаписью" срабатывает дважды


Разработчики 1С рекомендуют в расширении использовать конструкцию:

&НаКлиенте
&После("Подключаемый_ОбработатьЗаписьОбъекта")
Процедура Расширение_Подключаемый_ОбработатьЗаписьОбъекта()
// Вставить содержимое метода.
КонецПроцедуры
49. CratosX 111 18.11.21 15:37 Сейчас в теме
можно ещё добавить, что перед ОбработкаУдаленияПроведения() отрабатывает процедура ПередЗаписью()
AlbinaAAA; avmironov; METAL; +3 Ответить
50. Sergey_is 02.02.22 17:46 Сейчас в теме
За "Для документов, имеющих возможность проведения, эти события проверки заполнения вызываются только при проведении!" отдельное спасибо.
avmironov; METAL; +2 Ответить
Оставьте свое сообщение
Вакансии
Консультант 1С
Москва
зарплата от 80 000 руб. до 150 000 руб.
Полный день

Аналитик 1C
Москва
зарплата от 120 000 руб. до 250 000 руб.
Полный день

Начальник отдела программирования
Уфа
зарплата от 125 000 руб.
Полный день

Программист/тестировщик
Москва
зарплата от 130 000 руб. до 150 000 руб.
Полный день

Ведущий разработчик 1С / Team lead отдела разработки 1С
Москва
зарплата от 300 000 руб. до 300 000 руб.
Полный день