Атрибут типа «Запись». Объединение и фильтрация коллекций с помощью N3


Введение

Атрибут типа «Запись» хранит ID записей в связанном шаблоне (ссылки на них).

Бизнесу может потребоваться собрать коллекцию записей из нескольких шаблонов и фильтровать их по определённым условиям.

Например, пользователю необходимо предоставить для выбора в раскрывающемся списке только организации, с которыми он работает, когда перечень организаций формируется из нескольких источников.

Здесь представлен пример объединения и фильтрации списков записей по данным, связанным с текущим пользователем.

Прикладная задача

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

Список возможных грузополучателей должен формироваться из двух справочников: Клиенты и Партнёры.

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

Исходные данные

Имеются шаблоны: Контрагенты, Контакты, Сотрудники, Отправления.

В шаблоне записи «Контрагенты» хранятся сведения о компаниях и ссылки на контактные лица.

Атрибут в шаблоне:

  • Контакты Описание: Коллекция записей контактных лиц контрагента
    • Тип данных: запись
    • Связанный шаблон: Контакты
    • Хранить несколько значений: флажок установлен

В шаблоне записи «Контакты» хранятся сведения о связях сотрудников с организациями.

Атрибуты в шаблоне:

  • Сотрудник
    • Описание: Ссылка на аккаунт сотрудника
    • Тип данных: аккаунт
    • Связанный шаблон: Сотрудники
    • Хранить несколько значений: флажок снят
  • Ответственный
    • Описание: True, если сотрудник является ответственным менеджером для контрагента
    • Тип данных: логический

В шаблоне «Отправления» хранятся сведения о возможных и фактических получателях грузов.

Атрибуты в шаблоне:

  • Клиенты и Партнёры
    • Описание: Отдельные коллекции организаций партнёров и клиентов
    • Тип данных: запись
    • Связанный шаблон: Контрагенты
    • Хранить несколько значений: флажок установлен
  • Грузополучатель
    • Описание: Организация, которой предназначено отправление
    • Тип данных: запись
    • Связанный шаблон: Контрагенты
    • Хранить несколько значений: флажок снят

Настройка вычислений

  1. Откройте для редактирования форму шаблона «Отправления».
  2. Поместите на форму атрибут «Грузополучатель».
  3. Настройте свойства поля «Грузополучатель»:

    • Представление: раскрывающийся список
    • Доступ: разрешить ввод
    • Фильтр: N3
    # Импортируем префиксы для работы 
    # со списками, объектами и системными данными.
    @prefix list: <http://www.w3.org/2000/10/swap/list#>.
    @prefix cmw: <http://comindware.com/logics#>.
    @prefix object: <http://comindware.com/ontology/object#>.
    {
    # Получаем идентификатор текущего пользователя.
    cmw:securityContext cmw:currentUser ?user.

    # Получаем атрибуты, по которым будем определять связи сущностей.
    # Убедитесь, что системные имена соответствуют именам в вашем приложении.
    ("Отправления" "Клиенты") object:findProperty ?clientsAttribute.
    ("Отправления" "Партнёры") object:findProperty ?partnersAttribute.
    ("Контрагенты" "Контакты") object:findProperty ?contactsAttribute.
    ("Контакты" "Ответственный") object:findProperty ?responsibleAttribute.
    ("Контакты" "Сотрудник") object:findProperty ?employeeAttribute.

    # Получаем списки клиентов и партнёров из текущей записи.
    ?item ?clientsAttribute ?clientsList.
    ?item ?partnersAttribute ?partnersList.

    # Объединяем два списка организаций в один.
    (?clientsList ?partnersList) list:append ?organizations.

    # Отбираем из объединенного списка только организации,
    # где текущий пользователь является активным контактным лицом.
    ?organizations list:member ?userOrgs.
    ?userOrgs ?contactsAttribute ?orgContacts.
    ?orgContacts ?responsibleAttribute true.
    ?orgContacts ?employeeAttribute ?user.

    # Возвращаем итоговый список
    ?userOrgs -> ?value.
    }
  4. Поместите на форму атрибуты «Клиенты» и «Партнёры» и настройте их:

    • выберите представление «Таблица»;
    • добавьте кнопки «Создать», «Добавить», «Исключить», «Удалить».
  5. На форму шаблона «Контрагенты» поместите атрибут «Контакты» и настройте его:

    • выберите представление «Таблица»;
    • добавьте столбцы «Ответственный» и «Сотрудник»;
    • добавьте кнопки «Создать», «Добавить», «Исключить», «Удалить».

Тестирование

  1. Создайте несколько тестовых аккаунтов.
  2. Создайте записи в шаблоне «Контрагенты»:

    • заполните таблицу «Контакты»:
      • укажите различные аккаунты, в том числе свой аккаунт;
      • для части контактов установите флажок «Ответственный»;
  3. Создайте запись в шаблоне «Отправления».

  4. Добавьте в таблицы «Клиенты» и «Партнёры» разных контрагентов.
  5. Откройте раскрывающийся список «Грузополучатель». В нём должны отображаться только клиенты и партнёры, в которых вы (текущий пользователь) указаны как ответственный менеджер.
К началу


Номер Статьи: 5109
Размещено: Thu, Jun 26, 2025
Последнее обновление: Thu, Jun 26, 2025

Online URL: https://kb.comindware.ru/article/atribut-tipa-zapis-obedinenie-i-filtraciya-kollekcij-s-pomoshyu-n3-5109.html