gifts2017

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

Опубликовал Альбина Андрюхина (AlbinaAAA) в раздел Программирование - Теория программирования

     Программисту, имеющего немного опыта на платформе 1С 8.2, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта, а-а-а-а-аааа!!.....  
Именно такое сложное чувство непонимания было поначалу и у меня. В процессе обучения и реального опыта  была создана эта шпаргалка, целью которой было "разложить всё по полочкам", чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи объектов.

Для чего нам вообще нужны эти обработчики?

Очень часто программисту требуется переопределить стандартное поведение системы во время записи объектов, а именно: отменить запись, в случае каких-то условий; запросить дополнительную информацию у пользователя; дозаполнить реквизиты; что-то ещё записать в базу данных на основании этой записи; что-то изменить на форме после записи и т.д. и т.п.  Каждый программист рано или поздно сталкивается с подобными задачами, потому знать назначение и последовательность запуска этих событий программисту, работающему на платформе 1С 8.2, необходимо.

В модуле формы или в модуле объекта?

Сначала  надо определиться нужны ли нам данные формы? Будет ли запись записываться  программным способом или только интерактивно? Будем ли вести диалог с пользователем?

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

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

Потому можно сразу определиться с обработчиком модуля формы или модуля объекта будем работать.

Модуль формы: на клиенте или на сервере?

Далее, если выбран модуль формы, то надо определиться какой обработчик потребуется: исполняемый на клиенте, или исполняемый на сервере. Если потребуется диалог с пользователем, то на клиенте, в противном случае на сервере. Их можно отличить  по имени директивы компиляции или по имени обработчика (когда на сервере, это пишется в имени, например ПередЗаписьюНаСервере()).

Последовательность запуска событий (в том порядке, в каком они перечислены) и небольшие подробности : 

Во многих обработчиках есть параметр «Отказ». Там, где этот параметр присутствует означает, что в этом обработчике ещё можно отказаться от записи,  присвоив параметру «Отказ»  значение Истина, и тогда запись произведена не будет.

1)    Модуль формы  ПередЗаписью(Отказ, ПараметрыЗаписи)  

Выполняется на клиенте!

Этот обработчик следует использовать, если необходимо организовать диалог с пользователем перед тем, как записать объект. Запросить дополнительную информацию,  предупредить о чём-либо, дать возможность отказаться и т.п.

Второй параметр  этого обработчика  «ПараметрыЗаписи»  имеет тип «Структура». У документов эти параметры заполняются системой предопределенными параметрами РежимЗаписи, РежимПроведения. Можно добавить свои.

 Эти параметры передаются между событиями формы ПередЗаписьюНаСервере, ПриЗаписиНаСервере, ПослеЗаписиНаСервере, где их можно благополучно  использовать. Например, при записи регистра сведений, надо сделать запись в другой регистр сведений старое значение ресурса. Можно передать старое значение в эти самые параметры и уже в ПриЗаписиНаСервере сделать запись в другой регистр.

2)  Модуль формы  ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)  

3)  Модуль объекта  ОбработкаПроверкиЗаполнения (Отказ, ПроверяемыеРеквизиты)

Эти два обработчика проверки заполнения реализуются через параметр «ПроверяемыеРеквизиты» типа Массив, содержащий реквизиты, которые надо проверять (т.е. которым установлено свойство проверки заполнения  «Выдавать ошибку»)

И если из этого массива убрать реквизит, то проверяться он не будет, если добавить, то будет выполняться проверка заполнения.    

Таким образом, можно сказать, что эти два обработчика событий предназначены :

  1. Для включения в  проверку заполнения тех реквизитов, у которых в свойствах  «ПроверкаЗаполнения» указано «Не проверять».  Для этого надо добавить  этот реквизит в массив параметр «ПроверяемыеРеквизиты»
  2. Для того, чтобы исключить из автоматической проверки реквизиты, у которых установлено свойство проверки заполнения  «Выдавать ошибку» в зависимости от каких-то условий. Для этого надо удалить  этот реквизит из массива параметра «ПроверяемыеРеквизиты»

Имеется несколько особенностей, которые необходимо учитывать:

  1. Если у формы из которой записывается объект в свойствах не установлено «ПроверятьЗаполнениеАвтоматически», то тогда эти обработчики проверки заполнения не вызываются и проверки не происходят!
  2. Вызываются только при интерактивной записи! При программной записи  не вызываются.  Для проверки нужно использовать метод объекта ПроверитьЗаполнение(), который инициирует запуск этих событий.
  3. Для документов, имеющих возможность проведения , эти события проверки заполнения вызываются только при проведении!

Оба эти события выполняются на сервере, отличие в том, что  ОбработкаПроверкиЗаполненияНаСервере() это событие  модуля формы и, следовательно,  есть доступ к данным формы. А ОбработкаПроверкиЗаполнения() - событие модуля объекта.

 4)  Модуль формы ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

В этом обработчике можно дозаполнять реквизиты объекта или провести дополнительные проверки. Есть доступ к данным формы. Есть параметр ТекущийОбъект. 

Параметр ТекущийОбъект  имеет тип класса «объект» в зависимости от типа записываемого объекта (СправочникОбъект,ДокументОбъект и т.д). Т.е. экземпляр класса объект создан, и можно обратиться к его свойствам и методам, но в базу данных ещё не записан. 

Начало транзакции 

5)   Модуль объекта ПередЗаписью(Отказ)

В этом обработчике можно дозаполнять реквизиты объекта или провести дополнительные проверки.

Для документов  в параметры данного обработчика добавляются ещё два параметра:РежимЗаписи, РежимПроведения.

Запись

6)  Модуль объекта ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)

Возникает в момент, когда выполняется установка  номера нового документа, задачи или бизнес-процесса. 

Или ПриУстановкеНовогоКода(СтандартнаяОбработка,Префикс)

Возникает в момент, когда выполняется установка нового кода элемента справочника, узла плана обмена или кода плана видов характеристик. 

Эти событии вызываются для объектов у которых указано свойство «Автонумерация»  и только для тех объектов, у которых пустой код на момент записи.

Если установить параметру СтандартнаяОбработка значение Ложь, то новый номер генерироваться не будет и можно программно задать код объекта в данном обработчике.

7)  Модуль объекта ПриЗаписи(Отказ)

Вызывается после записи объекта в базу данных, но до окончания транзакции записи.

Ссылка уже есть и можно записать в базу данных дополнительные данные на основании текущего объекта, используя эту ссылку.

Например, при записи создавать другой документ, содержащий реквизит ссылку на записываемый.

 8)      Модуль формы  ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

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

Параметр ТекущийОбъект  имеет тип класса «объект» в зависимости от типа записываемого объекта (СправочникОбъект,ДокументОбъект и т.д). Можно обратиться к его свойствам и методам.

 Завершение  транзакции

 9)      Модуль формы ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

Выполняется на сервере.

Можно использовать для того, чтобы визуально что-то отобразить на форме.

10)      Модуль формы ПослеЗаписи(ПараметрыЗаписи) 

Выполняется на клиенте!

Можно использовать для того, чтобы визуально что-то отобразить на форме или  выдать предупреждение пользователю. 

Всё!!!

Пример выбора обработчиков событий записи объекта:

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

Для решения этой задачи потребуется использовать обработчики события модуля формы по двум причинам:

1) Диалог с пользователем возможен только на клиенте, а клиентеские обработчики есть только в модуле формы. Для диалога будем  использовать клиентскую процедуру модуля формы ПередЗаписью(), и сохраним ответ пользователя в  параметре этой процедуры «ПараметрыЗаписи».  

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    Если
Вопрос("Будем создавать новый документ?", РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да тогда
       
ПараметрыЗаписи.Вставить("Ответ","Да");
    Иначе
       
ПараметрыЗаписи.Вставить("Ответ","Нет");
    КонецЕсли;
КонецПроцедуры

2) А в процедуре  ПриЗаписиНаСервере() модуля формы примем этот параметр и в зависимости от него будем создавать документ или нет. Почему именно эта процедура? Ссылка будет получена только после записи, но поскольку нам нужно записывать в транзакции, то нужно использовать процедуры ДО завершения транзакции, но уже имеющие ссылку на записываемый объект.  ПередЗаписью() не подходит , так как ещё нет ссылки, а ПослеЗаписи()  не подходит, так как транзакция уже завершена. Остаётся ПриЗаписи(), но перед нами встаёт выбор: модуля формы или модуля объекта? Поскольку обработчик события ПриЗаписи() модуля объекта не содержит параметр, содержащий ответ пользователя, а  событие ПриЗаписиНаСервере() модуля формы содержит, то ответ очевиден-используем это событие ПриЗаписиНаСервере() модуля формы потому что:

1)   Это событие выполняется в транзакции  2)  Содержит параметр «ПараметрыЗаписи», в котором уже содержится ответ пользователя, который передался из процедуры ПередЗаписью()  3) Ссылка уже создана и можно создавать новый документ, используя эту ссылку.

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

См. также

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

Комментарии

1. Сергей Ожерельев (Поручик) 27.09.12 11:58
Очередной копипаст из мануалов.
2. Владислав Мороз (vlad.frost) 27.09.12 12:09
(1) А я считаю - полезная публикация, даже если и копипаст. При найме программистов хорошо если каждый третий отвечает на такие вопросы правильно.
3. Альбина Андрюхина (AlbinaAAA) 04.10.12 07:08
(1) обновила статью, учитывая ваше замечание.. но копипаста как такового и не было, разве, что параметры из СП выдернула.
В материале использованы знания, полученные только на курсе проекта spec8.ru и в результате реального опыта.
4. Div (Maldiv) 04.10.12 07:58
В свое время тоже помучился с этим, когда пришлось дорабатывать код, где обработка событий происходила и в форме и на сервере. +1
5. Иван Титов (Ibrogim) 04.10.12 07:58
5) Модуль объекта ПередЗаписью(Отказ)для всех объектов, кроме документов
В этом обработчике можно дозаполнять реквизиты объекта или провести дополнительные проверки. Есть доступ к данным формы.


Ошибка
6. Альбина Андрюхина (AlbinaAAA) 04.10.12 11:42
(5) Угу, спасибо за внимательность :) конечно, доступа к данным формы нет, так как модуль объекта..
7. Евгений Федоров (FedorovEvg) 09.10.12 15:18
Мне кажется, что картинка из приложения к книжке Радченко была бы более уместна чем эта статья. Там последовательно, графически изображено как отрабатывают события, причем на всех уровнях (форма, модуль сервер). Не понимаю, зачем переписывать, это словами и указывать.
Единственно, что для новичков не совсем логично, так это отработка событий ОбработкаПроверкиЗаполнения и ОбработкаПроверкиЗаполненияНаСервере не при записи объекта, а при проведении, НО никто не мешает проявить смекалку и вставить вызов процедуры ПроверитьЗаполнение() в процедуры ПередЗаписью у формы элемента.
8. Альбина Андрюхина (AlbinaAAA) 09.10.12 22:22
(7)
Мне кажется, что картинка из приложения к книжке Радченко была бы более уместна чем эта статья. Там последовательно, графически изображено как отрабатывают события, причем на всех уровнях (форма, модуль сервер). Не понимаю, зачем переписывать, это словами и указывать.

Да всё просто на самом деле :) Очень много людей предпочитает обучаться не по сухим схемам, а чтобы им объяснили простым человеческим языком и с примерами что и как. И, на мой взгляд, именно поэтому тысячи людей предпочитают платить тысячИ рублей за курсы проекта spec8.ru, вместо того, чтобы почитать Радченко за несколько сотен (а можно и бесплатно скачать). Потому что там тренеры простым человеческим языком объясняют сложные вещи и показывают "как надо и как не надо" и при этом на очень высоком профессиональном уровне. Так что, немалая категория людей предпочитает именно такой способ обучения, когда на словах.. и чем проще, тем лучше..
Михаська; FilatovRA; n.melnikov; Stayler; SuhoffGV; Shurgent; CaSH_2004; +7 Ответить
9. mic auto (4ur) 11.10.12 10:00
сколько времени у меня на полке стоит та же книжка Радченко, только вот даже половину ее еще не осилил - просто изучать как то времени да и желания не хватает, а вот когда возникает реальная задача, тогда судорожно бросаешься искать источники информации. К сожалению практика достаточно разнообразная и некоторые знания достаточно редко нужны - без применения и забыть можно
10. Александр Удалов (higs) 11.10.12 10:43
А мне тоже понравилась раскладка по событиям. Просто, понятно, доступно. Спасибо!!
11. Viktor Kupko (zipik) 11.10.12 11:12
12. Viktor Kupko (zipik) 11.10.12 11:12
есть еще подписки на события..еще бы их разобрать
13. Viktor Kupko (zipik) 11.10.12 11:13
зачем они и как их применять
14. Viktor Kupko (zipik) 11.10.12 11:13
ведь уже есть вышеперечисленные обработчики
15. Альбина Андрюхина (AlbinaAAA) 11.10.12 11:39
(12) zipik, тут посмотрите http://infostart.ru/public/154317/

а если в двух словах, подписку на событие удобно использовать:
1) в типовых конфигурациях, чтобы без проблем обновляться. Типовые объекты не трогаем, а свой функционал реализуем через подписку на событие, перехватывая нужное событие и перенаправляя в свой общий модуль через параметр "Обработчик" подписки (типовые общие модули лучше не трогать, опять-таки из-за обновления) где и пишем свой код.
2) если нужно перехватить определенное событие для множества объектов. Например, для многих документов во время проведения нужно прописать выполнение одинакового действия. И чтобы не прописывать одно и то же в каждом документе и используется подписка на событие.
Подробнее сейчас написать нет времени, возможно, позже..
16. Сергей Онучин (sonuchin3) 11.10.12 19:37
6) Модуль объекта ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
...Или ПриУстановкеНовогоКода(СтандартнаяОбработка,Префикс)
... Эти событии вызываются для объектов у которых указано свойство «Автонумерация» и только для новых объектов.


- Новый объект или нет - не имеет значения. А зависит от того, пустой ли номер (код).
Т.е. если у нового объекта вручную задать код, то событие ПриУстановкеНовогоКода() не будет вызвано, а если у записанного объекта вручную очистить код, то событие ПриУстановкеНовогоКода() будет вызвано.
17. Dimon (klel) 11.10.12 20:26
Большое спасибо аз полезную информацию, полезна новичкам =)
18. Андрей Романовский (and_r) 12.10.12 05:45
Идея статьи очень хорошая, но тема, я считаю не раскрыта. Может какие-то примеры надо было привести, а так, соглашусь, что очень напоминает фрагмент из книг входящих в комплект поставки
19. Альбина Андрюхина (AlbinaAAA) 12.10.12 06:08
(18) and_r, показательный пример, хорошо раскрывающий тему, в статье есть..может Вы невнимательно читали.. а громоздить статью простейшими примерами на каждый обработчик намеренно не стала, думаю, что статья от этого не стала бы более информативной, а уровень читабельности статьи бы снизился.. а то, что очень напоминает фрагмент из книг, это исключительно субьективное восприятие выбранной темы :)
20. Альбина Андрюхина (AlbinaAAA) 12.10.12 06:19
(16) sonuchin3, очень ценное замечание! Спасибо!
21. Ann Korableva (Moll) 14.10.12 18:34
Благодарим автора за достаточно полезную информацию, которая несомненно полезна новичкам =]
конечно же всю эту информацию можно найти и в сп и книжках и хоть угодно где, но опубликованная информация в одном месте, достаточно структурирована - вещь полезная

удачи на конкурсе ;)
22. Альбина Андрюхина (AlbinaAAA) 14.10.12 19:26
23. Сергей Маликов (SergeMalikov) 15.10.12 10:54
Альбина! И я вас поздравляю с победой в конкурсе. Надеюсь увидеть вас на продвинутом курсе.
24. Альбина Андрюхина (AlbinaAAA) 15.10.12 12:12
Спасибо, Сергей! :) я сейчас на конвертации, продвинутый после :)
25. Vlad Matveev (psamt1k) 15.10.12 13:24
26. Ann Korableva (Moll) 21.10.12 19:29
ну вот :]
очередной раз пригодилась ваша статья, своеобразная такая шпаргалочка получилась, ещё раз благодаримс ;]

ну и конечно же присоединяюсь к поздравлениям...
удачи в следующих конкурсах
27. Олег Шалимов (CaSH_2004) 14.11.12 00:07
(12)Меня тоже интересовал этот вопрос, в кратце ответ сводится к тому что перехватываются события модуля объекта, но только ПОСЛЕ их выполнения:
- ПриУстановкеНовогоНомера / ПриУстановкеНовогоКода
- ПриКопировании
- ОбработкаЗаполнения
- ПередЗаписью
- ПриЗаписи
- ПередУдалением
- ОбработкаПроведения (только документы)
- ОбработкаУдаленияПроведения (только документы)
- ОбработкаПроверкиЗаполнения (только документы)

Суть использования идентична указанному в статье. Непонятно только почему в статье Использование подписок сказано что идет замедление выполнения в подписке чем в модуле объекта, на мой взгляд они равноправны, так же как вызвать из модуля объекта процедуру общего модуля - тоже будет замедление, но оно ничтожно с самой процедурой

Указаны только для Справочников и Документов, но есть еще и множество других объектов (всякие планы и регистры)

Кстати не указана очередность обработкичков при проведении документа, что очень важно! Например она така:
- МодульОбъекта.ПриЗаписи()
- МодульОбъекта.ОбработкаПроведения()
- МодульФормы.ПриЗаписиНаСервере()

И вот возникает интересная дилема, предположим что при проведении 1-го документа, проверяется корректность созданного на его основании 2-го документа, а его мы заполняем только исходя из данных в управляемой форме в обработчике ПриЗаписиНаСервере().
И вот что же делать если проверка выполняется ДО корректировки, а нужно ПОСЛЕ? Если бы в управляемом режиме был доступен параметр объекта ДополнительныеСвойства, то в него можно было бы внести нужные данные (я так раньше и делал) и в обработчике ПриЗаписи() все выполнить, до проверки в ОбработкаПроведения().
На первый взгляд кажется что связь механизма записи в объекте в управляемом режиме абсолютно оторвана от заполнения формы, что очень плохо! Было бы неплохо чтобы ДополнительныеСвойства были взаимосвязаны с ПараметрыЗаписи, а то все они работают в пределах своей области.
Однако в статье не описан интересный хитрый момент, хотя до него можно догадаться но лучше указать: в обработчике ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) как видим есть ТекущийОбъект и есть ПараметрыЗаписи. А в ТекущийОбъект присутствует ДополнительныеСвойства, а значит их можно связать вручную, например так:
   &НаСервере
   Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    Для Каждого Элемент Из ПараметрыЗаписи Цикл
    ТекущийОбъект.ДополнительныеСвойства.Вставить(Элемент.Ключ, Элемент.Значение);
  КонецЦикла;
КонецПроцедуры
...Показать Скрыть

После чего в объекте можно получить то что нам нужно и обработать это
Spacer; kawaietz; +2 Ответить 1
28. Альбина Андрюхина (AlbinaAAA) 14.11.12 14:08
(27) CaSH_2004, про очередность обработчиков при проведении документов, упустила, согласна :)
Что касается примера, то, как любила повторять моя учительница математики (царство ей небесное) "Понять задачу - это значит на 50% её решить" и вот тут я понимаю, что не совсем понимаю условие задачи :(

Итак, Вы пишите:

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

Да, второй документ создаётся ПОСЛЕ проведения первого,и, соответсвенно, проверка ПЕРВОГО документа уже прошла. Так как очередность обработчиков при проведении документа такая:
- МодульОбъекта.ПриЗаписи()
- МодульОбъекта.ОбработкаПроведения()
- МодульФормы.ПриЗаписиНаСервере()

а ВТОРОЙ документ мы создаем в модуле формы в процедуре ПриЗаписиНаСервере(), так как ссылка ПЕРВОГО док-та уже создана и мы можем создать на его основании ВТОРОЙ документ, используя данные управляемой формы. Хорошо. И проверить второй документ никто нам не мешает прописав в коде ПроверкаЗаполнения() вот так:

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

И получаем при записи первого проверяем корректность заполнения второго.

Читаю далее Ваше условие задачи:
И вот что же делать если проверка выполняется ДО корректировки, а нужно ПОСЛЕ?

Вот тут непонятно. Корректировки ЧЕГО и в какой момент? Проверка ЧЕГО ? Потому рассуждения далее мне непонятны, но интересны.
29. Олег Шалимов (CaSH_2004) 14.11.12 15:40
(28) Ну как бы проводить 1-й документ по всем обработчикам - лишняя трата ресурсов при условии что потом все это отменится только из-за того что не удалось создать документ, например у меня Маршрут где 30 накладных которые нужно развести по клиента, и вот Маршрутный лист делает движения, и потом мы проверяем и перезаписываем все 29 накладных, а на 30-й вылетает ошибка и нужно все отменить.
Поэтому для меня важно все проверки и записи на основании сделать ДО, а не ПОСЛЕ проведения основного документа - Маршрута.
Проверяется соответствие накладных данным в Маршруте.

А так все верно вроде, наверно я что-то не разглядел, поздно уже было...
30. Альбина Андрюхина (AlbinaAAA) 23.11.12 07:43
(29) CaSH_2004, теперь понятно :) ваша задача относится к категории оптимизации. Обработчик "ПриЗаписиНаСервере" в своем примере я использовала потому, что нужен был ПараметрЗаписи, в котором находился ответ пользователя на вопрос "создавать второй документ или нет?". А если решать вашу задачу, то этот ПараметрЗаписи нам и не нужен и потому ничто не мешает воспользоваться процедурой "ПриЗаписи", которая запускатся ДО процедуры "ОбработкаПроведения", но ссылка записываемого док-та уже есть, и потому можно создать документы на её основании и проверить их. Причем, можно сначала их записать все без проведения, проверить корректность, сохранить в коллекцию значений, а потом, если все док-ты прошли успешно проверку, перебрать коллекцию и провести созданные на основании первого документы. И всё это в процедуре "ПриЗаписи".
31. elvis1917 (elvis1917) 06.03.13 12:29
Вопрос по примеру выбора обработчиков событий записи объекта:
А если документ будет создавать и записываться программно - разве в ПараметрахЗаписи будет параметр Ответ? Не выдаст ли система ошибку?
32. Алекс Ю (AlexO) 06.03.13 12:43
Ну как всегда - за картинку, которая у меня уже года четыре, как нарисована, накидали сотни баллов :)
И куча восторженных отзывов.
33. Альбина Андрюхина (AlbinaAAA) 08.04.13 07:01
(31) elvis1917, когда объект записывается программно обработчики модуля формы не вызываются, а вызываются только обработчики модуля объекта. Потому ошибки не будет, так как процедура ПриЗаписиНаСервере, которая содержит параметр ПараметрыЗаписи - это обработчик модуля формы, потому при программной записи он просто не будет вызываться.
34. ivdic (ivdic) 09.10.13 11:12
хотелось бы все это графически в виде блок схемы отобразить
35. rimma_n (rimma_n) 09.10.13 15:06
Полезная шпаргалка получилась, спасибо!
36. Сергей Маслов (LexSeIch) 10.10.13 04:50
Мир этому дому.
Полезная статья. Больше бы такой информации. Я имею в виду небольших заметок на конкретную тему. Читая их - что то обновляешь в памяти, что-то узнаешь новое... Да и из комментов порой узнаешь много интересного.
37. Алекс Одинэсник (Alex1Cnic) 10.10.13 10:25
добавлю в свою базу знаний
38. Владимир Клименко (KliMich) 12.10.13 01:52
Не мешало бы нарисовать блок-схему, в которой показана последовательность вызова событий.
И осветить, что такое подписка на события (как они туда вклиниваются и с чем ее едят)
39. Сергей Ожерельев (Поручик) 12.10.13 03:31
(38) Скачай книгу Разработка управляемого интерфейса Хрусталёвой, там всё описано и нарисовано.
40. Владислав Мороз (vlad.frost) 15.10.13 16:14
(0) Крутая публикация. Хотел плюс поставить, а я его оказывается уже ставил в прошлом году :)
41. Елена Пименова (Bukaska) 15.10.13 16:23
Я примерно понимаю, зачем эти все обработчики.
Можно построить свою подсистему, где будут пиленые документы как надо клиенту.
И в итоге мы только перенаправляем из стандартных подсистем обработчики на свои перепиленные объекты, в результате чего пациент не на "Игле", в отличие от той ситуации, когда мы пилим в ней все что есть.
Хотя ниче не спорю, перепилить конфу проще, чем сделать собственную подсистему с своими наработками)))
42. Анатолий (hame1e00n) 23.10.13 12:12
Спасибо, очень нужная информация, пригодилось :-)
43. Елена Мocкаленко (melenaspb) 24.10.13 11:05
Еще бы понять какие данные в каком обработчике использовать : Объект, ТекущийОбъект, ТекущийОбъект.Ссылка и т.п.
44. Dima Neumoichev (Ndochp) 18.11.13 13:33
(0) Столкнулся с проблемой, не пойму к какому событию подключаться.
Есть некий документ, при его проведении должен сформироваться и возможно провестись новый документ. (на основании регламентированного сделать документ разнесение по упр учету, но данных для разнесения хватает не всегда)
Проблема в том, что если в "ПриЗаписи" это все делать, то при ошибке проведения подчиненного документа падает исходная транзакция, а должен просто записываться непроведенный документ разнесения.
45. Альбина Андрюхина (AlbinaAAA) 22.11.13 14:41
(44) Ndochp, я бы тоже использовала обработчик модуля объекта "ПриЗаписи", но новый документ бы просто записывала, без проведения, а потом там же("ПриЗаписи") через попытку попробовала бы провеси этот новый документ. В таком случае транзакция не слетит.
46. Константин Назаров (kinazarov) 16.07.14 13:32
Спасибо за статью.
Было бы очень полезно добавить в эту статью дополнение о подписках на события и их месте в этой последовательности вызова обработчиков.
Часто бывает так, что использовать подписку на событие эффективнее, потому что не затрагивает модули, находящиеся на поддержке и очередное обновление конфигурации проходит с куда меньшими затратами труда и времени.
kawaietz; swimdog; solary; kostyaomsk; +4 Ответить 1
47. Константин Юрин (kostyaomsk) 23.08.14 08:13
Хорошая статья. В свое время взял за основу разработки. Сейчас вот написал статью про практическое применение, рассмотрев практический пример передачи параметров вглубь цепочки обработчиков.
48. Константин Юрин (kostyaomsk) 23.08.14 08:15
(46) kinazarov, верно замечено. Приходится опытным путем устанавливать что все подписки на события выполняются после стандартных обработчиков Объекта (не формы) и и выполняются тоже только на сервере.
49. Скоров Геннадий (gesk) 31.10.15 17:20
Спасибо! У меня не было книжки Радченко под рукой
50. Петр Лунегов (pvlunegov) 19.01.16 14:46
ПослеЗаписиНаСервере - выполняется после завершения Транзакции записи или проведения документа!
Я нашел то, что искал!
Огромное спасибо!
Мне как раз нужно было событие, которое начинается после события ОбработкаПроведения.
В модуле объекта, модуле менеджера - таких событий нет!
Зато есть в модуле формы документа!

Вопрос: Видимо ранее, в других версиях платформы, такого события не было? Или я не прав?
Много программировал на 8.1 такого события не помню
Видимо добавили в управляемых формах?
51. Петр Лунегов (pvlunegov) 19.01.16 15:59
Еще раз спасибо за ответ на мучивший меня несколько часов ответ.
Думал что нет такого события - После проведения.
Оказывается, УЖЕ есть.
Раньше точно не было.

И это хорошо. 1с идет на встречу многочисленным просьбам программистов и вносит ДОПОЛНЕНИЯ в свою объектную модель.

Почему бы не добавить событие в МОДУЛЬ ОБЪЕКТА - ПОСЛЕПРОВЕДЕНИЯ?
Возможно я чего-то не знаю, но мне кажется обоснованным такое предложение.
Видимо подводные камни реализации объектной модели в платформе 1с не дают изменять оную.
Поэтому 1с поступила иначе - добавили событие в МОДУЛЬ ФОРМЫ ПослеПроведенияНаСервере.

Ну хотя бы так. Уже легче жить.

А как-же быть с проведением документа из формы списка? Ведь при этом не открывается форма, вызывается объектная модель документа.
В ней нет события МОДУЛЯ ФОРМЫ ПослеПроведенияНаСервере.

Косякс! 1с не отвечает на таковые вопросы или умалчивает.
А вопрос то животрепещущий! В реальной жизни программиста ооочень актуальный!

Вот я например, сделал обработку события МОДУЛЯ ФОРМЫ ПослеПроведенияНаСервере.
После проведения документа теперь проводятся (с ошибками) пачка других документов.
Приходит пользователь и говорит - при проведении из формы списка ваш алгоритм не работает!

Я его посылаю на 1с (на 2 буквы), почти что на 3 буквы (1 не хватает).
52. Nicholas Mikuslas (Nicholas) 21.01.16 18:50
В обработчике ПриЗаписиНаСервере() можно использовать как Объект, так и ТекущийОбъект. В чем разница?
53. Игорь Нешик (ineshyk) 25.11.16 19:21
(50)только учтите, что ПослеЗаписиНаСервере не всегда выполняется.
54. Игорь Нешик (ineshyk) 25.11.16 19:23
(52)Разница в том, что в поле Объект нельзя переопределять значения, т.к. в базу запишется уже текущий объект.

Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа