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

25.08.21

Разработка - Математика и алгоритмы

Программисту, имеющему немного опыта на платформе 1С 8.3, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта.... Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов. Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.

Казалось бы, всё это есть в литературе. Зачем словами переписывать?  В этой статье собрана и структурирована информация из разных источников. Однако не всегда и не у всех есть эта литература под рукой. А тут информация в открытом источнике  и достаточно структурированная, изложенная простым языком. Тем самым делаем эти знания более понятными и доступными.

Будем рассматривать запись документа, чтобы не загромождать статью и не описывать все типы объектов (у них всё также, за небольшим исключением).

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

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

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

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

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

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

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

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

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

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

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

Сначала вызывается событие формы ОбработкаПроверкиЗаполненияНаСервере На данном этапе есть доступ к данным формы.

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

Затем вызывается событие прикладного объекта ОбработкаПроверкиЗаполнения.

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

Эти два обработчика событий предназначены :

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

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

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

Если данные формы не нужны, то используйте обработчик модуля объекта ОбработкаПроверкиЗаполнения

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

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

Важно понимать, что в предыдущем обработчике (в процессе проверки заполнения) произошло «разделение» формы на форму и прикладной объект (пока только в памяти сервера), данные которого будут записаны в базу данных.

В обработчике модуля формы ПередЗаписьюНаСервере появляется возможность доступа как к данным основного реквизита формы Объект, а также и к самому объекту, который будет записан через параметр обработчика ТекущийОбъект.

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

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

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

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

Поэтому если какие-либо алгоритмы должны выполняться при любом способе записи данных объекта, а не только при записи из формы, их следует размещать в обработчике события объекта (ПередЗаписью), а не в обработчике события формы.

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

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

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

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

Запись

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

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

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

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

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

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

7)  Модуль объекта ОбработкаУдаленияПроведения (Отказ)

Этот обработчик запускается только при отмене проведения документов с целью удаления движений из регистров. При этом неважно как отменяется проведение документа - программно или интерактивно.

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

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

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

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

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

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

Можно ещё отказаться от записи.

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

Этот обработчик запускается только при проведении документов. При этом неважно как проводится документ - программно или интерактивно.

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

Параметр РежимПроведения определяет как будет проводиться документ: оперативно или неоперативно.

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

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

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

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

Если данные для записи дополнительной информации находятся в самом объекте, то мы использовали обработчик модуля объекта ПриЗаписи(). А вот если данные находятся в форме, то как раз для таких случаев и предназначено это событие, потому как есть доступ к данным формы.

Этот обработчик ещё используется, если нужны данные параметра обработчика ПараметрыЗаписи, которые «приехали» в этом параметре из других обработчиков.

Через параметр ТекущийОбъект доступны данные, которые уже были записаны в информационную базу и имеет тип класса Объект (ДокументОбъект). Можно обратиться к его свойствам и методам, а также использовать для вызова экспортных методов объекта.

Работать следует именно через этот параметр, то есть не путать с основным  реквизитом формы Объект, так как там данные, которые были до записи и его изменения бесполезны потому, что после этого обработчика данные из ТекущегоОбъекта запишутся в Объект.

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

Итак, по поводу этого обработчика можно сделать следующие выводы:

  • Если нужно выполнять какие-то действия, связанные с записанным объектом, и при этом, например, нужна ссылка на этот объект, необходимо использовать ТекущийОбъект.Ссылка.
  • Основной реквизит формы Объект можно использовать только для сравнения того, что «было», с тем, что «записалось». 
  • Если нужно изменить записанные дополнительные данные на основании данных формы и данных объекта, то необходимо использовать в данном обработчике при обращении к данным объекта ТекущийОбъект

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

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

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

Этот обработчик используют, когда предполагаются действия над формой. Это те действия, которые должны быть выполнены только в том случае, когда объект 100 % записан (т.е. после транзакции). Например, вывод в форме некоторой дополнительной информации, связанной с данными объекта. Или выполнение каких-либо действий, которые должны быть выполнены только в том случае, когда объект гарантированно записан.

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

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

Доступны ПараметрыЗаписи, данные которых «приехали» в этом параметре из других обработчиков.

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

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

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

Доступны ПараметрыЗаписи, данные которых «приехали» в этом параметре из других обработчиков.

_____________________________________________________________________________________________________________________________

Дополнение о подписках на события и их месте в этой последовательности вызова обработчиков. 

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

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

Обработчики событий объекта на которые можно сделать подписку на события: 
- ПриУстановкеНовогоНомера / ПриУстановкеНовогоКода 
- ПриКопировании 
- ОбработкаЗаполнения 
- ПередЗаписью 
- ПриЗаписи 
- ПередУдалением 
- ОбработкаПроведения 
- ОбработкаУдаленияПроведения
- ОбработкаПроверкиЗаполнения

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

Т.е., если для какого-то документа в конфигурации есть две подписки на событие ПриЗаписи, то в начале выполнится та, которая расположена выше.

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

Дополнение 3: подписки с источником общего типа (ДокументОбъект, СправочникОбъект) выполняются позже, чем с источником конкретного типа, даже если он составной.

А что делать, если в типовой конфигурации есть подписка на Источник ДокументОбъект и нужно сделать подписку для документа определенного типа позже типовой подписки?

Как вариант указывать в своей подписке источник ДокументОбъект и ставить ее ниже по списку, а в самом обработчике проверять тип документа: 
Если ТипЗнч(Источник) <> Тип("ДокументОбъект.МойДокумент") Тогда 
Возврат; 
КонецЕсли;

 

Если статья оказалась вам интересной и полезной, то сохраняйте, чтоб не потерять и иметь под рукой- просто нажимайте +  и получите от меня + в свою карму :))

 

 

 

запись документа справочника призаписи передзаписью послезаписи

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1753    stopa85    12    

33

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4415    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7454    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7852    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4444    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8832    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    7797    dusha0020    8    

70
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. s22 19 25.07.19 19:26 Сейчас в теме
+
Kastello; serverstar; DrAku1a; avmironov; user692332_tomskih_nl; ivangrant; any__uta; Marina_Sh; AlbinaAAA; +9 Ответить
2. Xershi 1474 25.07.19 20:40 Сейчас в теме
На ИС уже есть такая статья.
Так мало того про подписки на события ни слова!
3. AlbinaAAA 1413 25.07.19 20:50 Сейчас в теме
(2) То была моя статья, написанная в 2012-м году. Меня радует, что вы её помните (если речь о ней). Но по новым правилам на старые публикации не начисляются стартмани. Мне порекомендовали в техподдержке ту удалить и создать новую. Чтобы не быть голословной прикрепляю скрин с личного кабинета, где видно ту статью неактивной, и скрин с ответом с техподдержки. Я статью значительно доработала, а про подписки допишу. Спасибо за отклик!
Прикрепленные файлы:
EvgeniyOlxovskiy; starik-2005; Kastello; marku; svbel85; 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; +29 Ответить
4. Xershi 1474 25.07.19 21:21 Сейчас в теме
(3) прикол! Да, будет кстати!
5. rusmil 262 26.07.19 05:21 Сейчас в теме
(3) А сколько должно пройти времени для статьи, по прошествии которого перестают начисляться стартмани?
7. AlbinaAAA 1413 26.07.19 06:30 Сейчас в теме
(5) зависит от даты публикации. Если статья опубликована раньше 2013 года, то не начисляются. Почему, не знаю.
Kastello; Jimbo; +2 Ответить
8. rusmil 262 26.07.19 06:40 Сейчас в теме
(3) Я правильно понимаю, что удалив старую статью, у вас уменьшился общий рейтинг как автора?
Может стоило просто в старой статье задать ссылку на новую статью?
user1044557; avmironov; user1126770; RustIG; AlbinaAAA; +5 Ответить
9. AlbinaAAA 1413 26.07.19 08:19 Сейчас в теме
(8) Спасибо большое за подсказку, сама не догадалась так сделать :)) Отправила на модерацию, посмотрим пропустят ли..
12. AlbinaAAA 1413 26.07.19 12:13 Сейчас в теме
(8) модератор не пропускает такую публикацию :(
13. rusmil 262 26.07.19 12:55 Сейчас в теме
(12) Интересно, как это модератор мотивирует.? В Вашем случае получается пишем новую статью и теряем рейтинг? Мне кажется это как-то несправедливо.
Мах; avmironov; user847462; RustIG; +4 Ответить
14. AlbinaAAA 1413 26.07.19 13:03 Сейчас в теме
(13) дословно "вас обсмеют в комментариях и меня тоже", два раза отправляла и два раза отказ с непонятным ответом..
15. rusmil 262 26.07.19 13:21 Сейчас в теме
(14) Ну тогда может они смогут рейтинг накопленный на старой статье перекинуть в новую статью, ведь он накоплен заслуженно, а новая статья это замена старой, чем такой вариант им не подходит?
Мах; avmironov; user847462; RustIG; +4 Ответить
16. AlbinaAAA 1413 26.07.19 13:27 Сейчас в теме
(15) Напишу в техподдержку с такой просьбой. Спасибо вам за участие!
18. AlbinaAAA 1413 29.07.19 20:18 Сейчас в теме
(8) получилось :)) ещё раз благодарю!
avmironov; +1 Ответить
24. alexey-simf 13 25.11.19 13:50 Сейчас в теме
(3) Для более полного комплекта можно и расширения упомянуть.
26. user970589 10 13.06.20 10:24 Сейчас в теме
(3)подскажите, есть ли возможность сделать подписку на обращение к реквизиту справочника? на чтение. Просто РЛС ковырять долго по правам. Если бы можно было выдернуть при обращении.. понимаю, что скорее всего нет, если вы полно изложили информацию в статье.
А, вижу, что нет, извините.
10. w.r. 643 26.07.19 08:28 Сейчас в теме
(2)

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


Вот это самая интересная тема. Так как большинство типовых конфигураций на поддержке удобно менять именно через подписки
6. sam441 214 26.07.19 06:07 Сейчас в теме
11. Hatson 528 26.07.19 09:34 Сейчас в теме
Дополнение к материалу из книги
"Разработка управляемого интерфейса"
Глава 3.9. Последовательность событий при записи объекта из формы.
EvgeniyOlxovskiy; avmironov; METAL; AlbinaAAA; +4 Ответить
17. vikhrov53 84 29.07.19 13:30 Сейчас в теме
Спасибо за хорошо структурированный материал. Коротко и ясно и с пояснениями где и как применять. Возможно стоит стилистически доработать раздел "В модуле формы или в модуле объекта ?", а то при первом прочтении я не все понял.
avmironov; +1 Ответить
19. FreeArcher 158 06.08.19 10:07 Сейчас в теме
Отличная статья.
Но хорошо бы рассмотреть обратный процесс т.е. отмену проведения. Там последовательность событий иногда сбивает столку, когда забываешь порядок.
avmironov; +1 Ответить
20. kuzyara 1900 15.08.19 10:30 Сейчас в теме
Прикрепленные файлы:
mikl79; EvgeniyOlxovskiy; starik-2005; voneska7; Tjodmar; CodeNull; shiaju; bgazobeton; Divedition; avmironov; METAL; user847462; pal; Дмитрий74Чел; Kamik; MarinaLed; Dnki; FreeArcher; +18 Ответить
21. u_n_k_n_o_w_n 34 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 90 09.07.20 18:59 Сейчас в теме
Я бы добавил такой нюанс про подписки на события. Допустим у нас есть несколько подписок на событие документа "ПриЗаписи".
Если Отказ установить в обработчике объекта "ПриЗаписи", то ни одна подписка вызываться уже не будет.
А вот, если Отказ установить в одной из подписок "ПриЗаписи", то последующие подписки всё равно будут вызваны, хоть и с флагом Отказ = Истина.
Не знаю уж баг это или фишка, но на сколько я знаю это до сих пор так.
avmironov; AlbinaAAA; +2 Ответить
28. maxdmt 28 06.08.20 14:05 Сейчас в теме
Интересное дело.
Если в форме вызвать запись/провдение/отмену проведения - обработчики в форме вызываются.
Если в форме вызвать пометку на удаление - обработчики в форме не вызываются.
29. YuruSar 08.12.20 12:02 Сейчас в теме
Недоумкам, типа я,
Очень нужная статья...
По Вашему гвайду я
Пройду путём создателя.
avmironov; AlbinaAAA; +2 Ответить
30. AlbinaAAA 1413 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 1413 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 1413 24.08.21 17:47 Сейчас в теме
(40) Согласна. Вы поняли правильно, как написано. Мне правильнее было бы написать так "Если нужно изменить записанные дополнительные данные на основании данных формы и данных объекта, то необходимо использовать в данном обработчике при обращении к данным объекта ТекущийОбъект, а при обращении к реквизитам формы Объект".

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

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

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

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

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


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

&НаКлиенте
&После("Подключаемый_ОбработатьЗаписьОбъекта")
Процедура Расширение_Подключаемый_ОбработатьЗаписьОбъекта()
// Вставить содержимое метода.
КонецПроцедуры
49. CratosX 112 18.11.21 15:37 Сейчас в теме
можно ещё добавить, что перед ОбработкаУдаленияПроведения() отрабатывает процедура ПередЗаписью()
AlbinaAAA; avmironov; METAL; +3 Ответить
50. Sergey_is 02.02.22 17:46 Сейчас в теме
За "Для документов, имеющих возможность проведения, эти события проверки заполнения вызываются только при проведении!" отдельное спасибо.
avmironov; METAL; +2 Ответить
52. пользователь 31.07.23 14:22
Сообщение было скрыто модератором.
...
53. mqlochink 7 15.11.23 12:52 Сейчас в теме
Как можно дозаписать в Справочник данные используя его Код у которого автонумерация если ПередЗаписью Номера ещё нет, а ПослеЗаписи Номер есть, но уже произошла запись объекта? Получается записывать повторно?
54. starik-2005 3033 15.11.23 13:48 Сейчас в теме
(53) Так есть же ПриУстановкеНовогоКода.
55. mqlochink 7 15.11.23 14:03 Сейчас в теме
(54) Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
Описание:
Возникает в момент, когда выполняется установка нового кода элемента справочника.

не очень понимаю что делать дальше, в ЭтотОбъект.Код пока пустой
56. user1011891 22.11.23 18:09 Сейчас в теме
Очень полезная статья,спасибо большое!
57. gtrr34 6 09.01.24 17:26 Сейчас в теме
Спасибо! Не понимал, почему не сохраняется измененный реквизит, а оказалось
"...И тут внимание!!! ТекущийОбъект...""
58. Seeker 24.01.24 07:00 Сейчас в теме
(53) ЭтотОбъект.УстановитьНовыйНомер();
Оставьте свое сообщение