иерархия
древовидный реестр
фильтр
фильтрация
быстрый фильтр
7.17

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

 

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

Нравится

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

Добрый день.

 

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

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

 

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

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

Показать все комментарии
7.7
древовидный реестр
иерархический реестр
Партнеру

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

Нравится

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

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

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

Показать все комментарии
древовидный реестр
иерархия
Технические вопросы
7.x

Здравствуйте. Мне нужно создать древовидный реестр (как структура в проектах). Пробовал сделать по примеру структуры в проектах, но не получилось. Объект я наследовал от базового иерархического справочника, далее я добавил поле типа справочник 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*/
             };
       }
);
Показать все комментарии
древовидный реестр
Технические вопросы
5.x

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

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

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

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

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

Нравится

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

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

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

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

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

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

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

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

Добрый день.

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

Добрый день!

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

Показать все комментарии
TreeArea
древовидный реестр
Сортировка
Скрипты
Разработка

Добрый день! Ситуация такая:
В древовидном реестре отображаются группы статей и статьи бюджета с названием, содержащим номер (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
древовидный реестр
сортировка Excel
экспорт
Интеграция и импорт данных
Разработка

Доброго времени суток.
Задача: Корректно сохранять в 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).
На текущий момент экспорт древовидного реестра не реализован.

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

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

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