1с при изменении вернуть старое значение
Проверка изменения данных при записи объектов
В некоторых случаях при записи объектов возникает необходимость проверки, какие данные объекта были изменены и какие были значения до изменения.
Допустим, при записи документа, может возникнуть потребность проверить, не изменилась ли дата документа, и если дата изменилась, то откорректировать движения документа, которые не обновляются при его проведении (например, вводятся вручную).
На первый взгляд видится возможность запомнить старое состояние реквизита в переменной модуля объекта, анализировать его при записи документа, и соответственно при записи запоминать новое значение для анализа в процессе следующей записи. Однако этот метод является неправильным. Дело в том, что запись объекта происходит в транзакции. Соответственно, тот факт, что данные записаны, еще не означает, что они действительно будут изменены в базе данных. Разработчик прикладного решения не имеет возможности обработать успешное или неуспешное завершение транзакции. Соответственно нет возможности и обеспечить хранение в модуле значения реквизита адекватно соответствующего тому значению, которое хранится в базе данных.
Правильным способом реализации такой проверки является считывание значений тех реквизитов, изменения которых нужно анализировать, непосредственно из базы данных.
Например, считывание может быть выполнено обращением через ссылку:
Однако следует учитывать, что при обращении к ссылке считывается весь объект целиком. То, что он ранее считывался и находится в кеше, здесь не поможет, так как при работе транзакции используется отдельный кеш. Соответственно, затраты на получение одного или двух реквизитов могут оказаться неоправданно большими. Поэтому можно рекомендовать для считывания отдельных реквизитов использовать запросы. Например:
В этом случае из базы данных будет считан ровно один реквизит, который требуется анализировать.
Заметим, что таким способом можно, например, определить, что объект помечается на удаление. Для этого достаточно проверить, изменение поля ПометкаУдаления .
Однако если нам нужно обработать изменение реквизита после записи документа, например, в обработчике ПриЗаписи , то, разумеется, считывание данных из базы данных не подходит, так как информация в базе данных уже изменена. В этом случае нужно само считывание выполнять в обработчике ПередЗаписью и запоминать считанные значения в переменных модуля. А уже анализ выполнять в обработчике ПриЗаписи .
onsamuy --> onsamuyобычная форма, обычный елемент управления "поле ввода", тип число, без кнопок.
суть в том что при изменении проводится проверка, какая неважно, нужно если проверка не прошла, возвратить значение поля ввода до изменения.
Пробовал. Странно то, что "СтандартнаяОбработка = Ложь" очищает поле ввода, но не возвращает предыдущее значение.
logist --> logistТак не получится. Если окончен ввод в поле - его значение изменено, старое значение в поле затерто.
Если док не новый - то прежнее значение можно прочитать из БД, там оно изменится только после записи документа.
А можно все сделать в самой форме.
В модуль формы добавить переменную СтароеЗначениеХХХ.
К полю подцепить . НачалоВыбора() и в нем сохранять текущее значение в СтароеЗначениеХХХ.
Потом хоть в ПриИзменении() или еще где проверять значение, если не нравится - восстановить из переменной.
Так не получится. Если окончен ввод в поле - его значение изменено, старое значение в поле затерто.
И НачалоВыбора не сработает если вводить сразу в поле (в топике указано что поле без кнопок).
Zaval --> Zaval(1) Stella_K, а где этот код вызывается Вопрос("Реквизит изменен! Сохранить изменения?", РежимДиалогаВопрос.ДаНет, 0); в модуле формы или в общем модуле?
(1) в объекте - старое значение, в ссылке - текущее значение.
(39) тьфу ты .. наоборот :) в ссылке - предыдущее значение , в объекте - текущее
А какой тип данных? Если строка или число, то можно попробовать использовать обработчик "ОкончаниеВводаТекста", а если ссылочный тип, то обработка выбора.
(4) Stella_K, реквизит на форме к примеру "Реквизит1" код обращения к реквизиту формы:
Реквизит1 = "Та переменная с значением которое тебе необходимо оставить"
код обращения к реквизиту объекта:
Объект.Реквизит1 = "Та переменная с значением которое тебе необходимо оставить"
(12) Stella_K, а у вас реквизит, который вы меняете это реквизит объекта или реквизит формы?
Просто если это реквизит формы, тогда вариант:
13. krasavcheg2 13.11.13 12:00
(11) Stella_K, ок не вопрос событие ПриИзменении(Элемент)
код обращения к реквизиту формы:
Реквизит1 = "Та переменная с значением которое тебе необходимо оставить"
код обращения к реквизиту объекта:
Объект.Реквизит1 = "Та переменная с значением которое тебе необходимо оставить"
(12) Stella_K,
Ваш код можно проще сделать (смотрел только этот код!)
(12) Stella_K, как имя реквизита и где он объявлен на форме или в объекте?
(18) krasavcheg2, Имя реквизита - РаспределятьСумму, это реквизит объекта. И он выведен на форму.
(2) Alximikkk, Я так понимаю можно завязаться на событие "ОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка);" в зависимости от задачи сохранить старое значение в переменой и после твоей проверки присвоить либо старое либо новое значение для реквизита (формы/объекта)
(5) krasavcheg2, но я же меняю не текстовый реквизит, а булевый
(11) Stella_K, ок не вопрос событие ПриИзменении(Элемент)
код обращения к реквизиту формы:
Реквизит1 = "Та переменная с значением которое тебе необходимо оставить"
код обращения к реквизиту объекта:
Объект.Реквизит1 = "Та переменная с значением которое тебе необходимо оставить"
Скорее всего в модуле формы. Но в принципе может быть и отсылка на какой-то клиентский общий модуль. Я думал, что вы в обработчике его вызываете сами. В обработчике "ПриИзменение" в значение "Элемент" уже хранятся измененные данные.
(15) krasavcheg2, Упростите код. зачем эти лишние условия и проверки?!
Режим = РежимДиалогаВопрос.ДаНет;
(19) mrmasson, пока не вижу в этом смысла дабы не пудрить человеку мозги ps: не задумывался об этом)
Вообщем если реквизит объекта, тогда вариант krasavcheg2 подходит, а если это реквизит формы, тогда возможно(как один из вариантов) использовать еще один реквизит, который будет хранить старое значение нужного вам реквизита)
Элемент формы к которому привязано событие его имя мне нужно.
(33) Stella_K, ну тогда замените "Ложь" на "НЕ Объект.РаспределятьСумму" в этой строке "Объект.РаспределятьСумму = ложь;"
Особенности редактирования колонок табличного поля
Для уведомления о начале или окончании редактирования строки в табличном поле предназначены два события : ПередНачаломИзменения() и ПередОкончаниемРедактирования() .
Событие ПередНачаломИзменения() возникает перед началом интерактивного изменения строки табличного поля, т.е. при входе в редактирование при нажатии клавиши Enter или двойном щелчке левой кнопки мыши, а также при выполнении команды " Изменить " . Обработчик данного события имеет параметр Отказ , позволяющий отменить редактирование строки табличного поля. Важной особенностью данного события является то, что обработчик данного события вызывается только при начале редактирования существующей строки, а при добавлении новой строки не вызывается. Другой важной особенностью является то, что данное событие указывает именно на начало изменения строки табличного поля в целом, а не какого-либо значения в ячейке строки табличного поля. Поэтому при переходе с одной колонки табличного поля, находящегося в состоянии редактирования, на другую обработчик данного события не вызывается.
Событие ПередОкончаниемРедактирования () возникает перед окончанием редактирования строки, т.е. при нажатии клавиши Enter , выполнении команды " Закончить редактирование " или при щелчке мышью в другую строку табличного поля. Обработчик данного события имеет параметры НоваяСтрока , ОтменаРедактирования и Отказ . Параметр НоваяСтрока указывает, что заканчивается редактирование добавленной строки. Параметр ОтменаРедактирования указывает причину, по которой происходит окончание редактирования строки. Если значение данного параметра равно Истина , то происходит отмена редактирования в результате нажатия клавиши Esc . Наконец, параметр Отказ позволяет отменить окончание редактирования. Важной особенностью данного события является то, что обработчик данного события вызывается только при окончании редактирования строки и не вызывается при переходе от одной колонки табличного поля к другой.
Если же необходимо отслеживать изменение данных в ячейке строки табличного поля, находящегося в состоянии редактирования, то можно воспользоваться событием ПриИзменении() элемента управления, связанного с редактируемой ячейкой. Обработчик данного события вызывается после изменения значения в элементе управления при переходе от одной редактируемой ячейки табличного поля к другой.
Читайте также: