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

 

Надеюсь на скорый ответ.

Нравится

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

Добрый день.

 

По дефолту поиск выполняется по первому уровню вложенности(иерархии) и это корректно, так реализована базовая логика. 

Аналогичный вопрос рассматривался в статье

 

Переопределить логику LookupPageViewModelGenerator  нет возможности.

Однако в будущих релизах планируется перевод иерархических реестров на Angular, где этот подход поменяется.

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

Как можно переделать к примеру раздел Договора из обычного реестра в древовидный?
Версия 7.7

Нравится

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

Здравствуйте. Попробуйте выполнить по инструкции во вложении.

Хорошего дня!
ierarhicheskiy_razdel.docx

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

Здравствуйте. Мне нужно создать древовидный реестр (как структура в проектах). Пробовал сделать по примеру структуры в проектах, но не получилось. Объект я наследовал от базового иерархического справочника, далее я добавил поле типа справочник Parent, которое ссылается на этот же объект. В свойстве "Родитель в иерархии" объекта указал поле Parent. Создал новый справочник, в нем иерархия работает. Далее создал страницу реестра и сделал ее по примеру страницы детали Структуры. В итоге у меня данная деталь отображается, в ней есть данные (не пишет "Нет данных", а отображаются названия колонок), но эти данные не отображаются.
Опишите, пожалуйста, поэтапно процесс созданий детали такого типа. Может я что-то упускаю.

Нравится

2 комментария

Добрый день!

В данный момент формируем для Вас инструкцию. Предоставим в ближайшее время.

Здравствуйте!

Минимально необходимый код для иерархической детали (основано на детали «Структура проекта» из XRM):

define("HierarchyDeatilV2", [],
       function () {
             return {
                    entitySchemaName: "Project",
                    attributes: {
                           /**
                           * Отвечает за загруженные уровни иерархии
                           */
                           "expandedElements": {
                                  dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT,
                                  type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
                           },
                           /**
                           * Отвечает за список развернутых элементов,
                           * хранит массив уникальных идентификаторов записей
                           */
                           "expandHierarchyLevels": {
                                  dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT,
                                  type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
                           },
 
                           /**
                           * Отвечает за хранение разворачиваемого элемента иерархии
                           */
                           "ExpandItemId": {
                                  dataValueType: Terrasoft.DataValueType.GUID,
                                  type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
                           }
                    },
                    methods: {
                           /**
                           * @overridden
                           */
                           disableGridSorting: Ext.emptyFn,
 
                           /**
                           * @overridden
                           */
                           sortColumn: Ext.emptyFn,
 
                           /**
                           * Инициализирует параметры детали
                           * @protected
                           * @overridden
                           */
                           initData: function () {
                                  this.callParent(arguments);
                                  this.set("expandedElements", {});
                                  this.set("expandHierarchyLevels", []);
                           },
 
                           /**
                           * Очищает информацию о загруженных и развернутых уровнях
                           * @protected
                           * @virtual
                           */
                           clearExpandHierarchyLevels: function () {
                                  this.set("expandedElements", {});
                                  this.set("expandHierarchyLevels", []);
                           },
 
                           /**
                           * Убирает информацию о том, что элемент развернут из системных параметров
                           * @protected
                           * @virtual
                           * @param {String} itemId Уникальный идентификатор записи
                           */
                           removeExpandHierarchyLevel: function (itemId) {
                                  var expandHierarchyLevels = this.get("expandHierarchyLevels");
                                  this.set("expandHierarchyLevels", Terrasoft.without(expandHierarchyLevels, itemId));
                           },
 
                           /**
                           * Добавляет в экземпляр запроса колонки:
                           * Родительский проект, Позиция, вычисляемую колонку количества дочерних элементов
                           * @protected
                           * @overridden
                           * @param {Terrasoft.EntitySchemaQuery} esq Запрос, в который будут добавлены колонки по умолчанию
                           */
                           addGridDataColumns: function (esq) {
                                  this.callParent(arguments);
                                  this.putParentColumn(esq);
                                  this.putNestingColumn(esq);
                           },
 
                           /**
                           * Добавляет колонку родительского проекта, если идет иерархический запрос
                           * @protected
                           * @virtual
                           * @param {Terrasoft.EntitySchemaQuery} esq Запрос,
                           * в который будет добавлена колонка родительского проекта
                           */
                           putParentColumn: function (esq) {
                                  var parentItem = this.get("ExpandItemId");
                                  if (parentItem && !esq.columns.contains("ParentId")) {
                                        esq.addColumn("ParentProject.Id", "ParentId");
                                  }
                           },
 
                           /**
                           * Добавляет агрегирующую колонку количества дочерних элементов для записи
                           * @protected
                           * @virtual
                           * @param {Terrasoft.EntitySchemaQuery} esq Запрос,
                           * в который будет добавлена агрегирующая колонка
                           */
                           putNestingColumn: function (esq) {
                                  var aggregationColumn = this.Ext.create("Terrasoft.AggregationQueryColumn", {
                                        aggregationType: Terrasoft.AggregationType.COUNT,
                                        columnPath: "[Project:ParentProject].Id"
                                  });
                                  if (!esq.columns.contains("HasNesting")) {
                                        esq.addColumn(aggregationColumn, "HasNesting");
                                  }
                           },
 
                           /**
                           * Возвращает объект со списком загруженных уровней
                           * @protected
                           * @virtual
                           * @return {Object} Возвращает объект со списком загруженных уровней
                           */
                           getExpandedItems: function () {
                                  return this.get("expandedElements");
                           },
 
                           /**
                           * Вносит информацию о новом загруженном уровне
                           * @protected
                           * @virtual
                           * @param primaryColumnValue Уникальный идентификатор записи
                           */
                           setExpandedItem: function (primaryColumnValue) {
                                  (this.getExpandedItems()[primaryColumnValue]) = { "page": 0 };
                           },
 
                           /**
                           * Проверяет, были ли загружены дочерние элементы выбранной записи
                           * @protected
                           * @virtual
                           * @param primaryColumnValue Уникальный идентификатор записи
                           * @return {boolean}
                           */
                           isItemExpanded: function (primaryColumnValue) {
                                  return !!(this.getExpandedItems()[primaryColumnValue]);
                           },
 
                           /**
                           * Обрабатывает загрузку данных в коллекцию, добавляя загрузку новых уровней в иерархию списка
                           * @protected
                           * @overridden
                           * @param {Terrasoft.Collection} dataCollection коллекция новых элементов
                           * @param {Object} options Объект конфигурации загрузки данных
                           */
                           addItemsToGridData: function (dataCollection, options) {
                                  if (dataCollection.isEmpty()) {
                                        return;
                                  }
                                  var firstItem = dataCollection.getByIndex(0);
                                  var parentId = firstItem.get("ParentId");
                                  if (parentId) {
                                        options = {
                                               mode: "child",
                                               target: parentId
                                        };
                                        var gridData = this.getGridData();
                                        var parentObj = gridData.get(parentId);
                                        if (parentObj) {
                                               parentObj.set("HasNesting", 1);
                                        }
                                        if (!this.isItemExpanded(parentId)) {
                                               return;
                                        }
                                  } else {
                                        this.set("LastRecord", dataCollection.getByIndex(dataCollection.getCount() - 1));
                                  }
                                  this.callParent([dataCollection, options]);
                                  if (options && (options.mode === "child" || options.mode === "top")) {
                                        var gridDataChild = this.getGridData();
                                        var tempCollection = this.Ext.create("Terrasoft.Collection");
                                        tempCollection.loadAll(gridDataChild);
                                        gridDataChild.clear();
                                        gridDataChild.loadAll(tempCollection);
                                  }
                                  this.set("ExpandItemId", null);
                           },
 
                           /**
                           * Обработчик загрузки дочерних элементов. Осуществляет проверку загружености
                           * дочерних элементов выбранной записи. Запускает загрузку нового уровня.
                           * @protected
                           * @virtual
                           * @param {String} primaryColumnValue Уникальный идентификатор записи
                           * @param {Boolean} isExpanded Признак того, разворачивает или сворачивает пользователь дочерние элементы
                           * true - если разворачивает, false в обратном случае
                           */
                           onExpandHierarchyLevels: function (primaryColumnValue, isExpanded) {
                                  if (!isExpanded || this.isItemExpanded(primaryColumnValue)) {
                                        return;
                                  }
                                  this.setExpandedItem(primaryColumnValue);
                                  this.set("ExpandItemId", primaryColumnValue);
                                  this.loadGridData();
                           },
 
                           /**
                           * Удаляет логику постраничности если загружаются дочерние объекты
                           * @protected
                           * @overridden
                           */
                           initQueryOptions: function () {
                                  var parentItem = this.get("ExpandItemId");
                                  if (!parentItem) {
                                        var isClearGridData = this.get("IsClearGridData");
                                        if (isClearGridData) {
                                               this.clearExpandHierarchyLevels();
                                        }
                                        this.callParent(arguments);
                                  }
                           },
 
                           /**
                           * Удаляет логику постраничности если загружаются дочерние объекты
                           * @protected
                           * @overridden
                           */
                           initCanLoadMoreData: function () {
                                  var parentItem = this.get("ExpandItemId");
                                  if (!parentItem) {
                                        this.callParent(arguments);
                                  }
                           },
 
                           /**
                           * Обновляет фильтры в зависимости от того, загружается ли записи в корень или в новый уровень
                           * @protected
                           * @overridden
                           * @return {Terrasoft.FilterGroup} Примененные в данной схеме фильтры
                           */
                           getFilters: function () {
                                  var parentItem = this.get("ExpandItemId");
                                  if (parentItem) {
                                        var parentProjectFilterGroup = this.Terrasoft.createFilterGroup();
                                         parentProjectFilterGroup.addItem(this.Terrasoft.createColumnFilterWithParameter(
                                               this.Terrasoft.ComparisonType.EQUAL,
                                               "ParentProject",
                                               parentItem,
                                               Terrasoft.DataValueType.GUID
                                        ));
                                        return parentProjectFilterGroup;
                                  } else {
                                        var filters = this.callParent(arguments);
                                        if (this.get("DetailColumnName") !== "ParentProject") {
                                               var group = this.Terrasoft.createFilterGroup();
                                               group.addItem(filters);
                                               group.addItem(
 
                           Terrasoft.createColumnIsNullFilter(this.entitySchema.hierarchicalColumnName)
                                               );
                                               filters = group;
                                        }
                                        return filters;
                                  }
                           }
                    },
                    diff: /**SCHEMA_DIFF*/[
                           {
                                  "operation": "merge",
                                  "name": "DataGrid",
                                  "values": {
                                        "type": "listed",
                                        "hierarchical": true,
                                        "sortColumnDirection": { "bindTo": "disableGridSorting" },
                                        "hierarchicalColumnName": "ParentId",
                                        "updateExpandHierarchyLevels": {
                                               "bindTo": "onExpandHierarchyLevels"
                                        },
                                        "expandHierarchyLevels": {
                                               "bindTo": "expandHierarchyLevels"
                                        }
                                  }
                           }
                    ]/**SCHEMA_DIFF*/
             };
       }
);
Показать все комментарии

Добрый день.
Подскажите пожалуйста по древовидному реестру.
Создал: раздел, реестр, карточку редактирования и объект.
Все наследуются от базовых объектов.
В объекте добавил поле родитель(справочник сам на себя) и название (строка), и Родитель в иерархии=поле родитель.

В карточку редактирования добавил название и родитель.

В реестре отображается иерархия, можно добавлять/удалять элементы, но редактировать можно только записи 1-го уровня.

Также в реестре не отображается значения поля родитель, в подчиненных записях.

Впорос: Как редактировать подчиненные записи? и как отображать поле родитель

Нравится

9 комментариев

С редактированием разобрался. Неоходимо выставить "Количество загружаемых уровней данных = -1"
у DataSource карточки редактирования. Но с отображением поля "Родитель" до сих пор проблема

Илья, а в странице реестра для колонки "Родитель" в источнике данных, галочка "Всегда загружать данные" отмечена?

Дмитрий, отмечена.

Илья, а доступ к Вашему сайту из-вне присутствует? Можете сообщить логин(пароль) в личном сообщении для анализа проблемы?

Дмитрий. выложил тестовый раздел. testtree.zip

Дмитрий, идеи не появилось?

Похоже что идей нет. Такое поведение наблюдается у всех древовидных объектах.

Добрый день.

Обращение сейчас в департаменте разработки. В ближайшее время постараемся предоставить рекомендации по решению проблемы.
Спасибо за терпение.

Добрый день!

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

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

Добрый день! Ситуация такая:
В древовидном реестре отображаются группы статей и статьи бюджета с названием, содержащим номер (1., 1.01., 1.01.01 и т.д.). Сортировка установлена по названию в запросе. Так вот в гриде сортируются по возрастанию либо корневые группы, либо все подчиненные (при нажатии на название колонки). Есть необходимость, чтобы все статьи и группы шли по возрастанию. В версии 3.4. такой проблемы не возникало!
Версия CRM 3.2.0.10
Буду признателен за помощь!

Нравится

3 комментария

Здравствуйте!

Проверьте, в запросе-выборке данных сортировка по названию установлена для всех select'ов union all'a?

К сожалению у меня только 1 select, union не пользую...

Иван, Вам нужно переписать запрос добавив туда union, в котором будут выбираться подчиненные элементы (по аналогии с разделом "Проекты" - sq_Project), а в этом запросе добавить сортировку по названию.

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

Доброго времени суток!
Задача состоит вот в чем. Есть древовидный реестр, который строится запросом с UNION. Нужно реализовать пользовательский фильтр для динамических групп. Стандартными методами это реализовать не удается, так как у родительских записей это поле всегда пустое, а у дочерних - заполнено. Соответственно, если положиться на галочку "Поле фильтрации" в Dataset'e, - получаем пустую гриду, так как дочерние хоть и фильтруются верно, родительские записи не одна не попадает в результат, так как мы по факту сравниваем ноль с параметром. Я так понимаю нужно воспользоваться пользовательским фильтром, но появляется проблема - так как WHERE есть и для родительской и для дочерней записи, то получаем в конечном итоге 2 фильтра с одинаковым названием в построителе фильтров. Как можно обойти это, и собственно где можно посмотреть правильную реализацию пользовательских фильтров, либо почитать мануал?

Нравится

2 комментария

Предлагаю вам мой вариант решения, описан от тут

Константин, Если Вам необходимо фильтровать именно все корневые записи, тогда имеет смысл реализовать фильтры рабочей области, пример можно посмотреть в разделе Проекты.

В случае, если необходимо отфильтровать запись с конкретным идентификатором-родителем, с этим проблем не возникнет.

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

Доброго времени суток.
Задача: Корректно сохранять в Excel древовидный реестр.
В моем реестре есть поле Номер, вид следующий 000001.
Подчиненные к нему записи имеют вид 000001-1, 000001-2, 000001-3 ....
При выгрузке в Excel (кнопка с дискеткой в гриде), сначала выгружаются все корневые записи (вида 000001) после чего все подчиненные (000001-1, 000001-2, 000001-3 ....) т.е в файле Excel имеем следующую картину

000001
000002
000003
...
000001-1
000001-2
000001-3
000002-1
000002-2
000002-3

что есть не хорошо. Я понимаю что кнопка сохранения в Excel заложена в бин. файлах. Меня интересует возможность при сохранении сортировать колонки по убыванию, так как это поможет получить вид

000001
000001-1
000001-2
000001-3
000002
000002-1
000002-2
000002-3
000003
...

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

Кофигурация: Terrasoft 3.3.2.157
Бин. файлы: Terrasoft 3.3.2.268

Нравится

6 комментариев

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

Добрый день!

Решение в создании окна с гридом, которое будет отображать данные Memory Dataset'a. Сам набор данных необходимо заполнять так, как Вы хотите его видеть при экспорте. Экспорт производить уже в созданном реестре.

Добрый день Игорь,
У меня уже есть древовидный грид который отображает корректно данные с таблицы, проблема в том что в Terrasoft не корректно реализован экспорт в Excel при работе с древовидным реестре.

Зададим вопрос команде разработки :) Возможно ли это в принципе..

Команда разработки знает об этой проблеме, задача будет проанализирована при построении списка работ на следующую версию (3.4.2 или 3.5.0).
На текущий момент экспорт древовидного реестра не реализован.

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

Ситуация понятна, спасибо Игорь.

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