Страницы: 1
RSS
Запись в базу при отмене транзакции
 

Всем здравствуйте. Какие могут быть варианты обхода при такой ситуации: есть подписка на событие для справочников, процедура перед записью. Подписка проверяет корректность записываемых в справочник данных, и если обнаружена ошибка, то Отказ устанавливается в значение Истина и данные об ошибке должны писаться в регистр сведений. Но поскольку перед записью начинается транзакция, то при Отказ = Истина эта транзакция отменяется, объект не записывается, но и запись в регистр сведений тоже не делается.

Что можно сделать в такой ситуации? Запись через фоновые задания в РС (ФоновыеЗаданияВыполнить) также не происходит.

 
Цитата
Виктория написал:
Всем здравствуйте. Какие могут быть варианты обхода при такой ситуации: есть подписка на событие для справочников, процедура перед записью. Подписка проверяет корректность записываемых в справочник данных, и если обнаружена ошибка, то Отказ устанавливается в значение Истина и данные об ошибке должны писаться в регистр сведений. Но поскольку перед записью начинается транзакция, то при Отказ = Истина эта транзакция отменяется, объект не записывается, но и запись в регистр сведений тоже не делается.  Что можно сделать в такой ситуации? Запись через фоновые задания в РС (ФоновыеЗаданияВыполнить) также не происходит.
Ну, смотрите — в общем виде транзакция управляет только изменениями, вносимыми в базу данных, и не влияет на изменение значений в памяти. То есть, если после начала транзакции в модуле выполнялась запись информации в базу данных, и изменялись какие-либо переменные или свойства объектов, то при отмене транзакции изменения в базе данных будут отменены, а изменения в переменных модулей и свойствах объектов расположенных в памяти отменены не будут.

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

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

Перем Ссылка;

НачатьТранзакцию();

НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();

НоменклатураОбъект.Записать();

Ссылка = НоменклатураОбъект.Ссылка;

ОтменитьТранзакцию();

Сообщить(НоменклатураОбъект.Ссылка = Справочники.Номенклатура.ПустаяСсылка()); //истина

Сообщить(Ссылка); // <Объект не найден> (1:9e4b00055d4c7bcf11d934028f79e857)

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

 

Особенностью работы документов в транзакциях является восстановление при отмене транзакции признака проведенности документа, например,

Перем Проведен;

НачатьТранзакцию();

ПриходнаяНакладнаяОбъект = Документы.ПриходнаяНакладная.СоздатьДокумент();

ПриходнаяНакладнаяОбъект.Дата = ТекущаяДата();

ПриходнаяНакладнаяОбъект.Записать(РежимЗаписиДокумента.Проведение);

Проведен = ПриходнаяНакладнаяОбъект.Проведен;

ОтменитьТранзакцию();

Сообщить(ПриходнаяНакладнаяОбъект.Проведен); //ложь

Сообщить(Проведен); //истина

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

 

Послушайте, а СП у вас отобрали? Может вот тут капнете?

Выполнить(<ИмяМетода>, <Параметры>, <Ключ>, <Наименование>)

Параметры:

<ИмяМетода> (обязательный)

Тип: Строка.

Имя экспортируемой процедуры или функции неглобального общего модуля, который может быть выполнен на сервере, в форме ИмяМодуля.ИмяМетода.

<Параметры> (необязательный)

Тип: Массив.

Массив параметров, передаваемых в метод. Количество и типы параметров должны соответствовать параметрам метода.

Все передаваемые параметры должны поддерживать сериализацию. В противном случае будет выдано исключение и фоновое задание не будет запущено.

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

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

 
Цитата
Светлана написал:
Послушайте, а СП у вас отобрали? Может вот тут капнете?  Выполнить(<ИмяМетода>, <Параметры>, <Ключ>, <Наименование>)  Параметры:  <ИмяМетода> (обязательный)  Тип: Строка.  Имя экспортируемой процедуры или функции неглобального общего модуля, который может быть выполнен на сервере, в форме ИмяМодуля.ИмяМетода.  <Параметры> (необязательный)  Тип: Массив.  Массив параметров, передаваемых в метод. Количество и типы параметров должны соответствовать параметрам метода.  Все передаваемые параметры должны поддерживать сериализацию. В противном случае будет выдано исключение и фоновое задание не будет запущено.  Если последние параметры метода имеют значения по-умолчанию, то их можно не задавать в массиве.  Если все параметры метода имеют значение по-умолчанию, то массив можно не передавать вообще.
Вообще при отмене транзакций базы данных разработчик (если в этом есть необходимость) должен самостоятельно обеспечивать адекватное изменение данных соответствующих программных объектов. Это можно выполнять путем повторного чтения всех данных объекта или путем изменения некоторых реквизитов программного объекта.
 

Всем спасибо большое!

Страницы: 1