Добавление своего поля в штатный механизм "Связей".

Попытка разобраться с штатной деталью "Связи" чтобы добавить туда новое, собственное поле, например в Активностях.
Расследование работы этой детали:
1) Было определено, что данная деталь работает со специализированными объектами (таблицами):
EntityConnection
в ней непосредственно содержатся записи, которые вкратце, описывают связь сущности c ее зависимостями представленными в виде реплики на некий ColumnUId
который в свою очередь представлен так же в SysEntitySchemaReference
более сложном объекте который в сути и описывает предположительно связи объектов через справочные поля, в частности:
ColumnUId - собственно поле для связи с EntityConnection, хотя в EntityConnection колонка не является ссылкой (FK) что весьма странно, в любом случае других упоминаний ColumnUId найти не удалось.
ColumnName - видимо имя колонки в целевом объекте с которым устанавливается связь
ColumnCaption - видимо заголовок который будет указан для связи в детали
ReferenceSchemaId - это Id из SysSchema, и судя из названия мы как раз тут указываем идентификатор схемы из которой брать поле указанное в ColumnName
SysSchemaId - это тоже Id из SysSchema, и судя по всему оно отражает всё таки к какой сущности принадлежит связь, в нашем случае - то же самое содержится и в самом EntityConnection, но данная таблица судя по всему используется в нескольких механизмах, в т.ч. по-моему и при "сложной настройке колонок" через связи.

2) Изучен исходный код детали и ее зависимостей в частности нас интересует схема EntityConnectionLinksUtilities, а именно вот этот фрагмент:
в котором esq-запросом получаются данные из вышеописанного объекта EntityConnection с некоторыми присоединениями, это так сказать "отправная точка", т.к. вся дальнейшая логика развивается на основе полученных данных.
Вот...
Устанавливаем 2 точки останова, собственно на сам вызов ESQ, чтобы посмотреть что он из себя представляет. Изучаем его и собственно вот его краткая полетная характеристика:

rootSchema: EntityConnection

В запрос добавлено 5-ть колонок:
  • Id
  • SysEntitySchemaUId
  • SysSchemaName, присоединяемая ESQ-query "[VwSysSchemaInWorkspace:UId:SysEntitySchemaUId].Name"
  • ColumnUId
  • Position

А так же мы имеем 2 фильтра:

  • this.Terrasoft.createColumnFilterWithParameter(
            this.Terrasoft.ComparisonType.EQUAL,
            "[VwSysSchemaInWorkspace:UId:SysEntitySchemaUId].Name",
            entitySchemaName
    );

    где например в случае с Активностями, entitySchemaName = "Activity"
  • this.Terrasoft.createColumnFilterWithParameter(
            this.Terrasoft.ComparisonType.EQUAL,
            "[VwSysSchemaInWorkspace:UId:SysEntitySchemaUId].SysWorkspace",
            this.Terrasoft.SysValue.CURRENT_WORKSPACE.value
    );

    не требует дополнительных пояснений

Встал вопрос:
В результирующем объекта такого вот ESQ-запроса, мы наблюдаем результаты вот с такой занимательной структурой

в которой однозначно содержатся данные, которые не запрашивались, по крайней мере явным образом через ESQ
Происхождение объекта ReferenceSchema
было обнаружено в некоем обработчике "createviewmodel"
(я так понимаю это механизм предварительной работы с выборкой до возвращения ее в коллбэк ESQ-запроса)

esq.on("createviewmodel", this.createEntityConnectionViewModel, this);

и вот здесь собственно дальнейшее изучение механизма работы обламывается, т.к. вызовы методов используемые здесь ведут преимущественно в all-combined.js который даже в Pretty print читается очень сложно.

в конечном итоге становится понятно что каким-то "волшебством"
мы получаем массив полей целевой схемы, и уникальными идентификаторами колонок в ней
скорее всего эти ColumnUId и определяются в SysEntitySchemaReference, как часть жизненного цикла формирования объекта и справочных полей в ней создается запись для каждого поля.

В конечном итоге, чтобы расширить "Связи" своим объектом необходимо:
1) В таблице SysEntitySchemaReference обнаружить целевое справочное поле, т.е. поле в объекте с которым устанавливается связь, и там подглядеть его ColumUId.
[проще всего дать полю какое ни будь заведомо уникальное имя, найти, потом переименовать, но можно и отталкиваться в описках и от значения в колонке SysSchemaId это уникальный идентификатор объекта из SysSchema]
1) Добавить Вашу запись в EntityConnection (или у существующей подменить ColumUId, например для подменя связи Лидов(встроенных) на Лиды(кастомные))
для новой записи:
SysEntitySchemaUId - значение колонки UId из SysSchema для объекта для которого вы планируете установить связь.
ColumUId - значение из SysEntitySchemaReference полученное ранее, фактически это реплика на справочное поле в объекте.

Итоговый результат, в детали "Связи" выведенную на карточку схемы объекта указанного в SysEntitySchemaUId будет выведено соответствующее справочное поле этого объекта. А так же со "Связью" начинают работать все встроенные в типовую конфигурацию "механизмы", н/а виджеты "Связи" в миникарточках

PS:
1) Чтобы отключить "стоковую связь" - удаляем соответствующую запись из EntityConnection

Нравится

1 комментарий

Есть ответы у меня :)

1. Добавить новую запись в таблицу EntityConnection
2. [SysEntitySchemaUId] = C449D832-A4CC-4B01-B9D5-8A12C42A9F89 - Uid схемы объекта ссылочного поля в SysSchema
3. [ColumnUId] - UID ссылочного поля данного объекта в метаданных активности

В личке готов подробно ответить

Показать все комментарии