Работа со ссылками

Ссылка — это специальный тип поля, которое ссылается на другую карточку (тип RefCardID) или на строку другой секции (RefID).

Ссылка на карточку может быть одного из четырёх типов: простая, слабая, сильная и автоматическая. Тип ссылки задаётся в описании карточки и, следовательно, устанавливается один раз для всех экземпляров карточки такого типа. Управлять поведением ссылки во время исполнения нельзя.

Тип ссылки влияет на поведение сервера в следующих случаях:
  • При изменении значения ссылочного поля.

  • При удалении карточки, на которую существуют ссылки.

Рассмотрим поведение различных типов ссылок подробнее.

Простая ссылка

Простая ссылка позволяет просто сохранить в поле идентификатор связанной карточки и определить ссылочные поля. Сервер не выполняет никаких дополнительных действий при записи или удалении значения в этом поле, а также при удалении связанной карточки. В этом смысле, простая ссылка аналогична полю типа uniqueid(System.Guid). Контроль ссылочной целостности в этом случае полностью остается за разработчиком.

Слабая ссылка

Слабая ссылка имеет отличие от простой — при удалении связанной карточки соответствующее поле ссылки будет автоматически обнулено (установлено в значение NULL). Это позволит разработчику не заботиться о проблеме "зависших" ссылок на несуществующие карточки.

Дополнительно появляется возможность узнать, какие карточки ссылаются на данную и на какие карточки ссылается она сама. Для этого предназначены методы GetLinksToCard и GetLinksFromCard класса CardManager.

Сильная ссылка

Сильная ссылка выражает отношения владения — если карточка держит сильную ссылку на другую карточку, то можно сказать, что она ею владеет или является родительской по отношению к ней.

Характеристики сильных ссылок:
  • Сильных ссылок на карточку может быть несколько, то есть несколько карточек могут "владеть" одной карточкой.

  • При создании сильной ссылки на карточку на неё распространяются (наследуются) права из карточки-владельца.

  • Если на карточку владельца назначаются права, то при распространении прав вниз по иерархии они распространяются и на подчинённую карточку.

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

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

Если возникает необходимость очистить значение сильной ссылки, но при этом сохранить карточку, то надо воспользоваться методом ClearLink. Сильные ссылки нужны для реализации владения, контроля области видимости и срока жизни карточек.

Автоматическая ссылка

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

Например, в стандартных карточках документов "Делопроизводства" есть секция Файлы и ссылки, содержащая ссылки на другие карточки. Все ссылки там имеют тип Авто. Таким образом, при удалении карточки из системы все существующие ссылки на неё из карточек документов автоматически удаляются.

Ссылки на строки

Ссылка на строку (RefID), в отличие от ссылки на карточки, не имеет типа и поэтому не обладает возможностями контроля целостности. Единственным способом управлять поведением связанного объекта для такого рода полей является признак Удалять связанную строку при изменении значения (Delete linked row on value change), который должен быть установлен при создании схемы карточки в программе "CardManager", входящей в Resource Kit. Если этот признак установлен, то любое изменение значения заполненного ссылочного поля (установка нового значения или сброс в null) приведёт к тому, что связанная строка (другой карточки) будет удалена.

Это поведение имеет смысл, если связанная строка расположена в коллекционной или иерархической секции.

Типичным сценарием применения этого поведения является, например, работа с номерами в карточках "Делопроизводства". Если карточка занимает какой-то номер (ей соответствует строка в секции занятых номеров карточки нумератора), то при удалении карточки занятый ею номер автоматически освобождается (строка в карточке нумератора удаляется).