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

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    3154    stopa85    12    

38

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

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

19.10.2023    7541    user1959478    51    

36

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

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3101    maksa2005    8    

26

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

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

1 стартмани

09.06.2023    10893    7    SpaceOfMyHead    18    

61

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

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4353    RustIG    9    

25

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

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

23.11.2022    3517    gzharkoj    14    

25

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

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

1 стартмани

21.03.2022    9038    7    kalyaka    11    

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

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


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

Спасибо за ваш труд.
matvey_boom; user1098876; avmironov; user1485340; +4 Ответить
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 1483 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 1483 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 1483 24.08.21 17:47 Сейчас в теме
(40) Согласна. Вы поняли правильно, как написано. Мне правильнее было бы написать так "Если нужно изменить записанные дополнительные данные на основании данных формы и данных объекта, то необходимо использовать в данном обработчике при обращении к данным объекта ТекущийОбъект, а при обращении к реквизитам формы Объект".

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

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

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

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

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


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

&НаКлиенте
&После("Подключаемый_ОбработатьЗаписьОбъекта")
Процедура Расширение_Подключаемый_ОбработатьЗаписьОбъекта()
// Вставить содержимое метода.
КонецПроцедуры
49. CratosX 114 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 3087 15.11.23 13:48 Сейчас в теме
(53) Так есть же ПриУстановкеНовогоКода.
55. mqlochink 7 15.11.23 14:03 Сейчас в теме
(54) Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
Описание:
Возникает в момент, когда выполняется установка нового кода элемента справочника.

не очень понимаю что делать дальше, в ЭтотОбъект.Код пока пустой
56. user1011891 22.11.23 18:09 Сейчас в теме
Очень полезная статья,спасибо большое!
57. gtrr34 7 09.01.24 17:26 Сейчас в теме
Спасибо! Не понимал, почему не сохраняется измененный реквизит, а оказалось
"...И тут внимание!!! ТекущийОбъект...""
58. Seeker 24.01.24 07:00 Сейчас в теме
(53) ЭтотОбъект.УстановитьНовыйНомер();
59. user1118625 12 11.04.24 10:51 Сейчас в теме
Подскажите пожалуйста в чем не прав и как реализовать задуманное.
Нужно при отказе пользователя отказаться от записи изменений справочника.
Моя последовательность:
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
 
	
	СписокКнопок = Новый СписокЗначений;
	СписокКнопок.Добавить(КодВозвратаДиалога.Да,"Да пересчитать");		
	СписокКнопок.Добавить(КодВозвратаДиалога.Нет, "Нет, оставить");	
	
	
	ПоказатьВопрос(Новый ОписаниеОповещения("Оповещение_ОтветНаВопросПересчетПланирования", ЭтаФорма, ПараметрыЗаписи), 
	"Пересчитать планирование?", СписокКнопок);
КонецПроцедуры
Показать

Дальше идём в оповещение
&НаКлиенте
Процедура Оповещение_ОтветНаВопросПересчетПланирования (Результат, ДопПараметры) Экспорт
	Если Результат=КодВозвратаДиалога.Нет Тогда
		ДопПараметры.Вставить("ОтказОтЗаписи",Истина);
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

Показать


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

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

Показать
60. user1118625 12 11.04.24 13:47 Сейчас в теме
(59) ну в общем, сам задал вопрос сам на него и отвечу...
задачу решил с помощью добавление на форму реквизита типа "булево"
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ОтказОтЗаписи = Истина;
КонецПроцедуры


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

	 
	 Если ОтказОтЗаписи Тогда
			 
		 ПоказатьВопрос(Новый ОписаниеОповещения("Оповещение_ОтветНаВопросПересчетПланирования", ЭтаФорма, ПараметрыЗаписи), 
		 "Пересчитать планирование?", СписокКнопок);
	 КонецЕсли;
КонецПроцедуры

Показать

Потом переходим в оповещение
&НаКлиенте
Процедура Оповещение_ОтветНаВопросПересчетПланирования (Результат, ДопПараметры) Экспорт
	Если Результат=КодВозвратаДиалога.Да Тогда
		Если ОтказОтЗаписи Тогда
			ОтказОтЗаписи = Ложь;
			
			ЭтаФорма.Записать();
		КонецЕсли;
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

Показать

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

Показать

и "финалим", если пользователь несколько раз решит записывать не закрывая окно
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
	СЮ_ОбработкаДокументов.ПересчитатьПланировование(ПараметрыЗаписи);
	ЭтаФорма.ОтказОтЗаписи = Истина;
КонецПроцедуры
61. пользователь 26.06.24 08:57
Сообщение было скрыто модератором.
...
62. frqhero 01.07.24 09:49 Сейчас в теме
Подскажите пожалуйста по итогу если я хочу валидировать объект создавая программно какой бест практис?
Создать ОбработкаПроверкиЗаполнения из в ПередЗаписью() вызывать ПроверитьЗаполнение() ?
63. AlbinaAAA 1483 01.07.24 14:05 Сейчас в теме
1) Создать ОбработкаПроверкиЗаполнения в модуле объекта создаваемого нужно только, если у вас какой-то свой хитрый алгоритм проверки (см статью, там описано).

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

Если этого модуля обработчика нет, то Проверитьзаполнение() будет работать только для реквизитов, у которых при конфигурировании свойство "Проверка заполнения" установлено в значение "Показывать ошибку" и, если, реквизит не заполнен, будет возвращено Истина если ошибок не обнаружено, Ложь - в противном случае.

2) Вызывать ПроверитьЗаполнение() надо в модуле, где создаете объект ваш программно, перед его записью.

Например: создали объект (под переменной ДокОбъект)

				
				Если ДокОбъект.ПроверитьЗаполнение() Тогда 	
					
					ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
					
				Иначе 
					ДокОбъект.Записать(РежимЗаписиДокумента.Запись); 
					
				КонецЕсли
Показать


(62)
вызывать ПроверитьЗаполнение()
64. frqhero 04.07.24 15:44 Сейчас в теме
(63) спасибо за ответ.
я не знаю это считается хитрым или нет -- есть документ ПТУ и при его проведении нужно не дать этого сделать если в номенклатурах в тч в определенных полях не заполнены данные, например есть цвет не заполнен у номенклатуры.
И вот получается я думаю как по правильному сделать в соответствии со всеми 1С фэншуями.
Вообще этот документ обычно из формы проводят. Я сделал в модуле объекта процедуру ОбработкаПроверкиЗаполнения и она сама срабатывает, далее вытаскиваю товары из ТЧ и делаю запрос по ним и далее в результате проверяю что нужные поля заполнены...

Хотя на самом деле был вопрос про другую задачу)
Там я полностью программно заполняю документ.
Там суть то что json прилетает по http и раньше я сделал промежуточное звено в виде xdto пакета и туда засовывая джейсон происходила валидация, а теперь я подумал, а зачем мне лишнее звено и решил сразу джейсон записывать в объект документа и в связи с этим важно, чтобы при проведении все проверить что все необходимое заполнено. И вот думал как лучше это организовать. Пока соображение, что нужно сделать ОбработкаПроверкиЗаполнения, там проверки, а вызывать это событие путем ПроверитьЗаполнение(), только пока не знаю где, в ПередЗаписью() или в ОбработкаПроведения(). Потому что у нашего вендора они делают подобное в ОбработкаПроведения(), а мне по логике кажется надо в ПередЗаписью(), хотя еще есть соображение, что может это зависит от того, хотим ли мы давать записать документ без проведения в случае если он неправильно заполнен...
65. VickWood 26.09.24 17:45 Сейчас в теме
Очень информативно! спасибо!
Оставьте свое сообщение