В некоторых случаях при записи объектов возникает необходимость проверки, какие данные объекта были изменены и какие были значения до изменения.
Допустим, при записи документа, может возникнуть потребность проверить, не изменилась ли дата документа, и если дата изменилась, то откорректировать движения документа, которые не обновляются при его проведении (например, вводятся вручную).
На первый взгляд видится возможность запомнить старое состояние реквизита в переменной модуля объекта, анализировать его при записи документа, и соответственно при записи запоминать новое значение для анализа в процессе следующей записи. Однако этот метод является неправильным. Дело в том, что запись объекта происходит в транзакции. Соответственно, тот факт, что данные записаны, еще не означает, что они действительно будут изменены в базе данных. Разработчик прикладного решения не имеет возможности обработать успешное или неуспешное завершение транзакции. Соответственно нет возможности и обеспечить хранение в модуле значения реквизита адекватно соответствующего тому значению, которое хранится в базе данных.
Правильным способом реализации такой проверки является считывание значений тех реквизитов, изменения которых нужно анализировать, непосредственно из базы данных.
Например, считывание может быть выполнено обращением через ссылку:
Однако следует учитывать, что при обращении к ссылке считывается весь объект целиком. То, что он ранее считывался и находится в кеше, здесь не поможет, так как при работе транзакции используется отдельный кеш. Соответственно, затраты на получение одного или двух реквизитов могут оказаться неоправданно большими. Поэтому можно рекомендовать для считывания отдельных реквизитов использовать запросы. Например:
В этом случае из базы данных будет считан ровно один реквизит, который требуется анализировать.
Заметим, что таким способом можно, например, определить, что объект помечается на удаление. Для этого достаточно проверить, изменение поля ПометкаУдаления .
Однако если нам нужно обработать изменение реквизита после записи документа, например, в обработчике ПриЗаписи , то, разумеется, считывание данных из базы данных не подходит, так как информация в базе данных уже изменена. В этом случае нужно само считывание выполнять в обработчике ПередЗаписью и запоминать считанные значения в переменных модуля. А уже анализ выполнять в обработчике ПриЗаписи .
ЭтоНовый в 8.3.
Функция использовавшаяся в обычных формах (этоНовый()) более не работает.
Теперь это можно проверить в функции ПриСозданииНаСервере используя Параметры.Ключ.Пустая()
Пример.
Цель: Требовалось запретить создание новых документов. Ранее созданные просматривать и изменять можно.
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
Если Параметры . Ключ . Пустая ( ) Тогда
    Сообщить ( "Документ более недоступен. Используйте типовой . " ) ;
    Отказ = Истина ;
КонецЕсли ;    
КонецПроцедуры
К сожалению, в управляемых формах нет аналога метода ЭтоНовый() для получения информации о том, есть ли ссылка у этого объекта, записан ли объект в информационную базу. В управляемых формах этот метод сделан немного иначе, рассмотрим, как получить информацию о том, новый ли объект в режиме управляемого приложения.
Аналог ЭтоНовый() в управляемом приложении
Чтобы выяснить новый объект или нет, необходимо использовать конструкцию вида:
Если объект записан в базу данных, он содержит ссылку на объект — Ключ. Если ключ пустой- объект новый.
Другие статьи по 1С:
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.