Обработчики событий при записи объектов. Зачем и что за чем?
Программисту, имеющему немного опыта на платформе 1С 8.3, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта....
Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов.
Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.
Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов.
Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.
Комментарии
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(2) То была моя статья, написанная в 2012-м году. Меня радует, что вы её помните (если речь о ней). Но по новым правилам на старые публикации не начисляются стартмани. Мне порекомендовали в техподдержке ту удалить и создать новую. Чтобы не быть голословной прикрепляю скрин с личного кабинета, где видно ту статью неактивной, и скрин с ответом с техподдержки. Я статью значительно доработала, а про подписки допишу. Спасибо за отклик!
Прикрепленные файлы:
(3)подскажите, есть ли возможность сделать подписку на обращение к реквизиту справочника? на чтение. Просто РЛС ковырять долго по правам. Если бы можно было выдернуть при обращении.. понимаю, что скорее всего нет, если вы полно изложили информацию в статье.
А, вижу, что нет, извините.
А, вижу, что нет, извините.
Спасибо за хорошо структурированный материал. Коротко и ясно и с пояснениями где и как применять. Возможно стоит стилистически доработать раздел "В модуле формы или в модуле объекта ?", а то при первом прочтении я не все понял.
Я бы добавил такой нюанс про подписки на события. Допустим у нас есть несколько подписок на событие документа "ПриЗаписи".
Если Отказ установить в обработчике объекта "ПриЗаписи", то ни одна подписка вызываться уже не будет.
А вот, если Отказ установить в одной из подписок "ПриЗаписи", то последующие подписки всё равно будут вызваны, хоть и с флагом Отказ = Истина.
Не знаю уж баг это или фишка, но на сколько я знаю это до сих пор так.
Если Отказ установить в обработчике объекта "ПриЗаписи", то ни одна подписка вызываться уже не будет.
А вот, если Отказ установить в одной из подписок "ПриЗаписи", то последующие подписки всё равно будут вызваны, хоть и с флагом Отказ = Истина.
Не знаю уж баг это или фишка, но на сколько я знаю это до сих пор так.
(30) Создатель сволочь. ЗиКГУ, документ Увольнение. Многофункциональный, ЭТК, в ПФР. Пытаюсь в интерфейсе поменять комментарий - безуспешно. Ловлю по подписке, меняю, сохраняю. Ловлю повторно в подписке. Источник.Комментарий до исправления. Источник.Ссылка.Комментарий - измененный. Очень тонкий клиент. Просветите!
(32) Наверно правильнее было бы написать так: "Если нужно изменить записанные дополнительные данные на основании данных формы и данных объекта, то необходимо использовать в данном обработчике при обращении к данным объекта ТекущийОбъект, а при обращении к реквизитам формы Объект"
Назначение этого обработчика – записать в базу данных дополнительную информацию, связанную с данными записываемого объекта. Оно аналогично предыдущему обработчику "При записи", там то же самое назначение, но в модуле объекта. Ведь совсем не обязательно, что все исходные данные для записи дополнительной информации находятся в самом объекте. Они могут находиться и в форме. Как раз для таких случаев и предназначено это событие.
Пример: До записи объекта был какой-то РеквизитОбъекта = 3 и во время записи РеквизитОбъекта по каким-то условиям программно в обработчиках выше поменяли, например, на 5. Т.е. записали в базу РеквизитОбъекта =5 и получилось, что в данном обработчике "ПриЗаписиНаСервере" Объект.РеквизитОбъекта = 3, а ТекущийОбъект.РеквизитОбъекта=5.
А ранее, в обработчике ПриЗаписи в модуле объекта, создали какой-то документ, который должен быть создан и записан только, если создан и записан этот объект (поэтому делаем то в транзакции). Далее, пришли в обработчик модуля формы "ПриЗаписиНаСервере" и видим, что там реквизит формы , в зависимости от которого и значения РеквизитОбъекта нужно что-то дописать в тот ранее созданный и записанный документ. И вот тут используем в условии Объект.РеквизитФормы и ТекущийОбъект.РеквизитОбъекта (а не Объект.РеквизитОбъекта). Надеюсь, понятно написала)
Назначение этого обработчика – записать в базу данных дополнительную информацию, связанную с данными записываемого объекта. Оно аналогично предыдущему обработчику "При записи", там то же самое назначение, но в модуле объекта. Ведь совсем не обязательно, что все исходные данные для записи дополнительной информации находятся в самом объекте. Они могут находиться и в форме. Как раз для таких случаев и предназначено это событие.
Пример: До записи объекта был какой-то РеквизитОбъекта = 3 и во время записи РеквизитОбъекта по каким-то условиям программно в обработчиках выше поменяли, например, на 5. Т.е. записали в базу РеквизитОбъекта =5 и получилось, что в данном обработчике "ПриЗаписиНаСервере" Объект.РеквизитОбъекта = 3, а ТекущийОбъект.РеквизитОбъекта=5.
А ранее, в обработчике ПриЗаписи в модуле объекта, создали какой-то документ, который должен быть создан и записан только, если создан и записан этот объект (поэтому делаем то в транзакции). Далее, пришли в обработчик модуля формы "ПриЗаписиНаСервере" и видим, что там реквизит формы , в зависимости от которого и значения РеквизитОбъекта нужно что-то дописать в тот ранее созданный и записанный документ. И вот тут используем в условии Объект.РеквизитФормы и ТекущийОбъект.РеквизитОбъекта (а не Объект.РеквизитОбъекта). Надеюсь, понятно написала)
(39) Какие тогда данные в Вашем примере уходят на клиент? Вновь созданный объект?
Процитированную в моем сообщении фразу я понял, как "Если хотите увидеть в форме объекта РеквизитОбъекта равным 4, необходимо писать ТекущийОбъект.РеквизитОбъекта = 4". Вероятно, неправильно понял, но не представляю, как еще можно интепретировать фразу "перед отправкой их [прим.: данные] на клиент".
Процитированную в моем сообщении фразу я понял, как "Если хотите увидеть в форме объекта РеквизитОбъекта равным 4, необходимо писать ТекущийОбъект.РеквизитОбъекта = 4". Вероятно, неправильно понял, но не представляю, как еще можно интепретировать фразу "перед отправкой их [прим.: данные] на клиент".
(40) Согласна. Вы поняли правильно, как написано. Мне правильнее было бы написать так "Если нужно изменить записанные дополнительные данные на основании данных формы и данных объекта, то необходимо использовать в данном обработчике при обращении к данным объекта ТекущийОбъект, а при обращении к реквизитам формы Объект".
Ну, а если, помедитировать над фразой "перед отправкой на клиент", то можно представить такой пример: далее после передачи данных объекта на клиент мы должны отразить эти, созданные дополнительные данные, на форме . Например на форме есть надпись реквизит формы "Создан документ такой-то с такими-то данными".
После обсуждаемого выше обработчика вызывается событие формы После записи на сервере, смысл которого, вывод в форме некоторой дополнительной информации, связанной с данными объекта. И там мы отразим данные созданного документа.
Ну, а если, помедитировать над фразой "перед отправкой на клиент", то можно представить такой пример: далее после передачи данных объекта на клиент мы должны отразить эти, созданные дополнительные данные, на форме . Например на форме есть надпись реквизит формы "Создан документ такой-то с такими-то данными".
После обсуждаемого выше обработчика вызывается событие формы После записи на сервере, смысл которого, вывод в форме некоторой дополнительной информации, связанной с данными объекта. И там мы отразим данные созданного документа.
(41)
Вспомнил другой пример из практики для передачи данных на клиент:
* в модуле объекта при записи в дополнительные свойства помещаются некоторые данные (например, результат проверки, или созданные связанные объекты);
* в модуле формы ПриЗаписиНаСервере (или ПослеЗаписиНаСервере) из дополнительных свойств данные извлекаются и помещаются в параметры записи для передачи их на клиент;
* в модуле формы ПослеЗаписи из параметров извлекаются данные и каким-либо образом отображаются пользователю (например, в отдельной форме списка созданных объектов).
Например на форме есть надпись реквизит формы "Создан документ такой-то с такими-то данными".
Пример плохой практики. :-) При возникновении ошибки транзакция будет отменена, а вот изменения в данных формы - нет.
Вспомнил другой пример из практики для передачи данных на клиент:
* в модуле объекта при записи в дополнительные свойства помещаются некоторые данные (например, результат проверки, или созданные связанные объекты);
* в модуле формы ПриЗаписиНаСервере (или ПослеЗаписиНаСервере) из дополнительных свойств данные извлекаются и помещаются в параметры записи для передачи их на клиент;
* в модуле формы ПослеЗаписи из параметров извлекаются данные и каким-либо образом отображаются пользователю (например, в отдельной форме списка созданных объектов).
(45) и я вчера ступила)) Написала , что при обращении к реквизитам формы мы обращаемся через Объект. Нет, обращаемся напрямую к реквизиту формы, без Объект- мы же говорим про модуль формы и про реквизит формы! Внесла в статью изменение, спасибо за замечание!
Провожу отладку расширения для типовой конфигурации "Управление торговлей, 11.4" и заметил, что при записи документа "ЗаказКлиента" обработчик события модуля формы "ПередЗаписью" срабатывает дважды: один раз - по команде "ЗаписатьДокумент" непосредственно из самой формы при нажатии кнопки "Записать", а второй вызов происходит отсюда:
Это стандартный механизм, предусмотренный типовой конфигурацией?
У меня просто в расширении после обработчика события "ПередЗаписью" происходит проверка правильности заполнения реквизитов, и пользователю выдается сообщение, если что-то не так. Заметил, что сообщение выскакивает дважды - прогнал по отладчику и увидел, что зачем-то производится двойная запись документа.
&НаКлиенте
Процедура Подключаемый_ОбработатьЗаписьОбъекта()
ОбщегоНазначенияУТКлиент.ОбработатьЗаписьОбъектаВФорме(ЭтотОбъект, ПараметрыДляЗаписи);
КонецПроцедуры
Это стандартный механизм, предусмотренный типовой конфигурацией?
У меня просто в расширении после обработчика события "ПередЗаписью" происходит проверка правильности заполнения реквизитов, и пользователю выдается сообщение, если что-то не так. Заметил, что сообщение выскакивает дважды - прогнал по отладчику и увидел, что зачем-то производится двойная запись документа.
(48)
Разработчики 1С рекомендуют в расширении использовать конструкцию:
&НаКлиенте
&После("Подключаемый_ОбработатьЗаписьОбъекта")
Процедура Расширение_Подключаемый_ОбработатьЗаписьОбъекта()
// Вставить содержимое метода.
КонецПроцедуры
при записи документа "ЗаказКлиента" обработчик события модуля формы "ПередЗаписью" срабатывает дважды
Разработчики 1С рекомендуют в расширении использовать конструкцию:
&НаКлиенте
&После("Подключаемый_ОбработатьЗаписьОбъекта")
Процедура Расширение_Подключаемый_ОбработатьЗаписьОбъекта()
// Вставить содержимое метода.
КонецПроцедуры
Вакансии
Ведущий разработчик 1С / Team lead отдела разработки 1С
Москва
зарплата от 300 000 руб. до 300 000 руб.
Полный день
Москва
зарплата от 300 000 руб. до 300 000 руб.
Полный день
Аналитик-архитектор 1С ЕРП (управленческого учета)
Москва
зарплата от 300 000 руб. до 300 000 руб.
Полный день
Москва
зарплата от 300 000 руб. до 300 000 руб.
Полный день