рубрики: Документы | Дата: 3 февраля, 2018
При проведении документа выполняется множество предопределенных функций как в модуле формы, так и в модуле объекта. Часть из них выполняется в единой транзакции. В каждую из этих функций разработчик может добавить свой код.
Но чтобы правильно выбрать ту или иную функцию для своего кода, необходимо представлять в какой последовательности выполняются эти функции и где они выполняются — на клиенте или на сервере.
Как всегда я призываю не принимать на веру любую теорию, а опробовать все самостоятельно на практике. Эксперименты будем проводить на платформе 8.3 с использованием управляемой формы документа. Для начала создадим любой документ с возможностью проведения и добавим в него форму. Далее откроем модуль формы и добавим в него все предопределенные процедуры связанные с записью документа. А чтобы в момент записи и проведения документ мог сам нам рассказать в какой последовательности выполняются предопределенные процедуры, в каждую из них вставим вызов сообщения с указанием имени процедуры.
В итоге получим вот такой код:
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Сообщить("МодульФормы.ПередЗаписью");
КонецПроцедуры
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
Сообщить("МодульФормы.ОбработкаПроверкиЗаполненияНаСервере");
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Сообщить("МодульФормы.ПередЗаписьюНаСервере");
КонецПроцедуры
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Сообщить("МодульФормы.ПриЗаписиНаСервере");
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
Сообщить("МодульФормы.ПослеЗаписиНаСервере");
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Сообщить("МодульФормы.ПослеЗаписи");
КонецПроцедуры
И такую же процедуру проделаем с модулем объекта:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Сообщить("МодульОбъекта.ОбработкаПроверкиЗаполнения");
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Сообщить("МодульОбъекта.ПередЗаписью");
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Сообщить("МодульОбъекта.ПриЗаписи");
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Сообщить("МодульОбъекта.ОбработкаПроведения");
КонецПроцедуры
А теперь посмотрим в какой последовательности отработают все вышеперечисленные события. Для этого откроем документ и нажмем кнопку Провести, т.е. выполним проведение документа из его формы. В итоге в окне сообщений получим следующую последовательность событий:
Для наглядности представим информацию в графическом виде:
Как видим все процедуры модуля документа за исключением проверки заполнения выполняются в единой транзакции. Также в этой транзакции выполнятся и процедура модуля формы ПриЗаписиНаСервере(). В этой процедуре у нас есть последний шанс отказаться от проведения документа. Стоит также отметить, что после выполнения процедуры модуля документа ПередЗаписью() у нас документ уже записан в базу данных. То есть в процедуре ПриЗаписи() у нас уже есть возможность использовать ссылку на документ.
Тем кто еще не сталкивался плотно с доработкой процедур участвующих в записи и проведении документа, советую самим поэкспериментировать с вышеперечисленными процедурами. Посмотреть какие из них выполняются при записи без проведения, при отмене проведения, во время программного проведения. Можно к примеру провести документ не из формы, а из списка документов.
Добавить комментарий