Difference between revisions of "DB.Save"
1>Admin |
m (1 revision imported) |
(No difference)
|
Revision as of 19:03, 20 November 2021
Save (Сохранение объекта) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Функция выполняет сохранение текущего измененного объекта или/и его строчных частей. Функция последовательно выполняет следующие действия:
- Если объект открыт для визуального редактирования, будет произведен вызов события метаданных OnSave (см. Конфигурация данных проекта). Событие может отменить попытку записи.
- Если объект открыт для визуального редактирования и он имеет обязательные для заполнения реквизиты, эти реквизиты будут проверены на заполненность, если хотя бы один из них не заполнен, будет вызвано исключение.
- Измененные строчные части или/и совокупность сохраняемых реквизитов (если реквизиты самого объекта были изменены) формируют набор данных, и отправляются на сервер.
- Сервер производит временную блокировку, если объект уже не заблокирован. Если блокировка неудачна, сервер останавливает попытку записи и возвращает ошибку.
- Если объект новый, ему присваивается новый внутренний код базы данных
- Всем незаполненным реквизитам-нумераторам объекта присваиваются новые номера в соответствии с префиксами, заданными этим реквизитам. Заполненные реквизиты-нумераторы с флагом уникальности проверяются на уникальность,если проверка неудачна (какой-либо из реквизитов не уникален), сервер останавливает попытку записи и возвращает ошибку.
- Производится сохранение объекта в базу данных и обновление информации в журналах, в которые входит объект. Для новых объектов, имеющих реквизиты-нумераторы, заполняемые при создании объекта (а не при записи), хранящиеся в таблице временных нумераторов на сервере, будут удалены из этой таблицы.
- Если предусмотрено установками, создается соответствующая запись в таблице журнала регистрации событий.
- Если объект был заблокирован до записи, блокировка сохраняется. Если новый объект открыт для визуального редактирования или новый или существовавший объект имеет опцию заблокировать объект после сохранения, блокировка сохраняется. В иных случаях, временная блокировка снимается.
- Сервер возвращает клиенту информацию по внутреннему коду объекта (для новых объектов) и номерам незаполненных реквизитов-нумераторов, эта информация принимается клиентом, который обновляет ей содержимое реквизитов и строчных частей объекта, если объект открыт для визуального редактирования, также обновляются визуальные поля реквизитов-нумераторов.
- С объекта снимается признак изменен и, если он был открыт для редактирования в визуальной форме, с последней также снимается признак были изменения.
Синтаксис
DB.Save(<Режим сохранения периодических реквизитов (INT)>,<Заблокировать объект после сохранения (INT)>=0)
Аргументы
<Режим сохранения периодических реквизитов (INT)>
- (необязательный аргумент) Режим определяет, будут ли загруженные периодические реквизиты сохранены при сохранении самого объекта. Если объект является визуальным объектом открытым в режиме изменения, этот параметр всегда будет равен 1, иначе по умолчанию этот параметр равен 0.<Заблокировать объект после сохранения (INT)>
- (необязательный аргумент) Параметр определяет будет ли сохранена временная блокировка объекта после удачной записи. Если объект был заблокирован до записи, при любом значении этого аргумента, блокировка не будет снята. Так как в момент записи, объект, если он не был заблокирован, блокируется временной блокировкой, сохранение блокировки после записи имеет гарантированный успех. Параметр удобно использовать для блокировки новых объектов после записи, чтобы продолжать работать с ними, так как новый несохраненный объект еще не имеет внутренного кода базы данных и поэтому не может быть заблокирован.
Примеры
//Пример производит блокировку и изменение документа аДок аПольз:="";аМаш:="";аВремя:=""; If аДок.Lock(аПольз,аМаш,аВремя)=0 Then Message("Невозможно заблокировать документ "+аДок+", так как в данный момент с ним работает пользователь "+аПольз+" на "+аМаш+" в "+аВремя+"!","!"); Exit; EndIf; Try //Перечитать аДок из базы данных, чтобы убедиться, что мы работаем со свежими данными и наше изменение не запишет устаревшие данные в базу данных аДок.Reload(); //Изменим реквизит и сохраним объект аДок.Реквизит:=1; аДок.Save(); Finally аДок.Unlock(); EndTry;