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