Версия для печати Поиск
Главная Заметки из Зазеркалья

18.02.2014 Редактирование данных во внешних источниках

Реализовано в версии 8.3.5.1068.

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

Вы можете редактировать данные как программно, так и интерактивно. В большинстве случаев программировать ничего не нужно. Всё будет работать интерактивно, автоматически, так же, как, например, при добавлении, удалении или изменении справочников и документов.

Если же посмотреть «внутрь», то для того, чтобы запись во внешние источники стала возможной, мы добавили новые свойства таблицам данных и полям внешних источников:

  • Для всей таблицы - свойство ТолькоЧтение. ТолькоЧтение = Истина означает, что изменение данных в этой таблице невозможно;
  • Для отдельных полей таблицы - свойства ТолькоЧтение, РазрешитьNull и ЗначениеЗаполнения:
    • ТолькоЧтение = Истина означает, что изменение данных в этом поле невозможно;
    • РазрешитьNull = Истина означает, что в данное поле может быть записано значение NULL;
    • ЗначениеЗаполнения содержит стандартное значение этого поля (если такое существует).

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

  • ТолькоЧтение = Истина устанавливать, например, для представлений (view), таблиц, получаемых на основе выражения (результат функции) и подобных. Данные в таких таблицах изменять нельзя;
  • ТолькоЧтение = Истина указывать для полей, устанавливаемых автоматически (AUTOINCREMENT), вычисляемых полей и подобных. Данные в таких полях изменять нельзя;
  • РазрешитьNull = Истина устанавливать для всех полей, кроме ключевых, и тех, которые во внешнем источнике описаны как NOT NULL;
  • ЗначениеЗаполнения поля устанавливать в том случае, когда во внешнем источнике указано стандартное значение этого поля (значение DEFAULT).

Добавлять, изменять и удалять данные во внешних источниках можно с помощью встроенного языка или интерактивно. Во встроенном языке для этого используются следующие методы менеджера таблицы:

  • СоздатьНаборЗаписей() - для необъектных таблиц;
  • Новый метод СоздатьОбъект() - для объектных таблиц.

Соответственно у объектов ВнешнийИсточникДанныхТаблицаНаборЗаписей и ВнешнийИсточникДанныхТаблицаОбъект появились новые методы Записать() и Удалить().

Добавление данных

При добавлении данных во внешний источник вы создаёте объект (или набор записей), устанавливаете значения полей и записываете. При этом есть некоторые особенности, о которых полезно знать.

Например, при попытке установить значение поля, у которого ТолькоЧтение = Истина, будет выдана ошибка. А при непосредственной записи в базу данных в выражении INSERT такие поля будут пропущены. В остальные поля записываются те значения, которые вы им присвоили. Поэтому значения Null и значения по умолчанию нужно присваивать полям в явном виде.

Далее представлен небольшой пример. В нём данные добавляются в объектную таблицу ExtTable, у которой существует три поля:

  • col1 (ТолькоЧтение = Истина);
  • col2 (РазрешитьNull = Истина);
  • col3 (РазрешитьNull = Истина).

Выполнение оператора Записать() приведёт к тому, что сначала будет вызван обработчик события ПередЗаписью, затем выполнена физическая запись в таблицу внешнего источника (INSERT), затем будет вызван обработчик события ПриЗаписи.

С ключевым полем таблицы внешнего источника вы можете поступать следующим образом. Если ключевое поле доступно для изменения, то тогда вы «вручную» задаёте его значение перед записью. Если изменение ключевого поля запрещено, то платформа самостоятельно получит ключ в INSERT или непосредственно после. Вы можете вмешаться в этот процесс с помощью метода УстановитьСсылкуНового() до физической записи (в обработчике события ПередЗаписью) или непосредственно после физической записи (в обработчике события ПриЗаписи).

Изменение данных

При изменении данных обновляются значения всех полей таблицы, у которых ТолькоЧтение = Ложь.

Если же необходимо записать только некоторые поля, вы можете указать их перечень прямо из встроенного языка с помощью методов УстановитьЗаписываемыеПоля() и ПолучитьЗаписываемыеПоля().

Удаление данных

При удалении данных выполняется непосредственное удаление строки из таблицы базы данных. При этом поиск ссылок на удаляемый объект не выполняется. Если такая функциональность нужна, вы можете запрограммировать её самостоятельно в обработчике события ПередУдалением().

Интерактивное изменение данных

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

Если у таблицы внешнего источника есть поле, содержащее версию данных, то платформа выполняет оптимистическую блокировку так же, как и при работе с «родными» данными. Перед записью проверяется, что версия данных, содержащаяся в оперативной памяти, равна версии данных, содержащейся во внешнем источнике. Если это не так - выдаётся ошибка. Если версии совпадают - данные записываются.

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

При открытии формы данные считывается полностью, и сохраняются на сервере. При записи данные считываются из внешнего источника заново, и сравниваются с тем, что сохранено на сервере. Если есть различия - выдаётся ошибка. Если различий нет, данные формы (то, что изменил пользователь) объединяются с данными, сохранёнными на сервере, и записываются во внешний источник.

Транзакции

Чтение данных внешних источников, как и ранее, выполняется вне транзакции, а при записи платформа открывает неявную транзакцию. При этом и чтение, и запись вы можете выполнять и в явных транзакциях с помощью методов объекта ВнешнийИсточникДанныхМенеджер:

  • НачатьТранзакцию();
  • ЗафиксироватьТранзакцию();
  • ОтменитьТранзакцию().

Блокировки

Для управления блокировками мы рекомендуем использовать свойство внешнего источника РежимУправленияБлокировкойДанных:

  • Автоматический;
  • Управляемый;
  • Автоматический и управляемый.

а также свойство таблицы внешнего источника УровеньИзоляцииТранзакций:

Кроме этого, конечно же, вы можете самостоятельно задать уровень блокировок в методе НачатьТранзакцию().