Есть ли возможность сделать так чтобы деталь была обязательной к заполнению пользователем? Если в детали 0 записей на странице записи то пользователь не сможет сохранить или перейти на следующий статус в кейсе.

Нравится

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

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

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

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

Пример: Есть 100 контактов для импорта. Для них создалась деталь, где можно выбрать класс (А, Б, В....). Выбрать может быть множественным. Можно ли импортировать информацию, не для каждой детали отдельно, а для всей 100 контактов сразу?

Нравится

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

Добрый день,

 

Вы можете вывести деталь на страницу контакта.

Затем создать файл для импорта, где в одной колонке вывести имя контакта, в другой колонке - категорию, которая соответствует детали в системе.

 

Далее Вы можете перейти к импорту - следует связать кололнки из файла с соответствующими колонками из системы.

 

Когда файл будет загружен, существующие контакты будут обновлены относительно их категории. Контакты, которых не было в системе, будут загружены из файла.

 

С уважением,

Глеб.

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

Приветствую. Может ли у детали быть 2 страницы редактирования? 
На разделе "продажи" в странице редактирования используется деталь "А", которая имеет настроенную карточку редактирования. Деталь "А" построена на объекте "Object".  Моей задачей является создание нового раздела -> странице редактирования и размещение этой детали в ней. Суть в том, что при использовании новой детали , из-за связей обьекта и страницы, я перехожу на уже существующую страницу редактирования детали. Решить проблему через visible не удалось, так как рендерится только одно из полей в зависимости от порядка в диффе (старое либо новое). С рассположением полей не знаю как поиграть. Прошу подсказать решение. Буду благодарен за возможные предположения реализации. 

Визуализирую проблему:
Проваливаемся с продажи. В diff поле стоит первым в очереди.

Проваливаемся с Сетевой задачи:
Поле в diff стоит после продажи, продажа отрендерилась уже по такому рассположению. Opportunity.visible = false; NetworkTask.visible = true

Показываю на примере поля "Продажа" -> необходимо заменить на "Сетевая задача" в зависимости от автозаполненного значения одного из полей. Если проваливаемся с продажи - this.Opportunity != undefined. Если Сетевая задача : 
this.NetworkTask !=undefined
 

Нравится

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

Вот 2 поля, на которых я привел пример.
Может можно как-то опеределить 2 diff блока? Мне по сути нужны чуть ли не 2 разные вьюхи, но на одном объекте....

{
                    operation: "insert",
                    name: "TsOpportunity",
                    parentName: "Header",
                    propertyName: "items",
                    values: {
                        visible: { bindTo: "IsOpportunity" },
                        enabled: false,
                        layout: {
                            column: 0,
                            row: 0,
                            colSpan: 12
                        }
                    }
                },
                {
                    operation: "insert",
                    name: "NetworkTask",
                    parentName: "Header",
                    propertyName: "items",
                    values: {
                        visible: { bindTo: "IsNetworkTask" },
                        enabled: false,
                        layout: {
                            column: 0,
                            row: 0,
                            colSpan: 12
                        }
                    }
                },

Добрый день!

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

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

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

Для понимания примера работы, в печатной форме нет ничего кроме названия записи раздела. Версия 7.16 элемента в бп "обработать файл" нет. 

Нравится

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

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

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

define("UsrSchema042ca8fbDetail", ["ConfigurationEnums"], 
    function(configurationEnums) {
    return {
        entitySchemaName: "UsrCourierCertInOrder",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
            {
                    /* Тип операции — слияние. */
                    "operation": "merge",
                    /* Название элемента схемы, над которым производится действие. */
                    "name": "DataGrid",
                    /* Объект, свойства которого будут объединены со свойствами элемента схемы. */
                    "values": {
                        "rowDataItemMarkerColumnName": "UsrDocumentLookup"
                    }
                },
                {
                    /* Тип операции — слияние. */
                    "operation": "merge",
                    /* Название элемента схемы, над которым производится действие. */
                    "name": "AddRecordButton",
                    /* Объект, свойства которого будут объединены со свойствами элемента схемы. */
                    "values": {
                        "visible": {"bindTo": "getToolsVisible"}
                    }
                }]/**SCHEMA_DIFF*/,
        methods: {
                                //Возвращает колонки, которые выбираются запросом.
                                getGridDataColumns: function() {
                                        return {
                                                "Id": {path: "Id"},
                                                "Document": {path: "UsrDocument"},
                                                "Document.Number": {path: "UsrDocument.Number"}
                                        };
                                },

                                //Конфигурирует и отображает модальное окно справочника.
                                openDocumentLookup: function() {
                                        //Конфигурационный объект
                                        var config = {
                                                // Название схемы объекта, записи которого будут отображены в справочнике.
                                                entitySchemaName: "UsrDocumentLookup",
                                                // Возможность множественного выбора.
                                                multiSelect: true,
                                                // Колонки, которые будут использованы в справочнике, например, для сортировки.
                                                columns: []
                                        };
                                        var OrderId = this.get("MasterRecordId");
                                        if (this.Ext.isEmpty(OrderId)) {
                                                return;
                                        }
                                        // Экземпляр класса [EntitySchemaQuery].
                                        var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                                                // Установка корневой схемы.
                                                rootSchemaName: this.entitySchemaName
                                        });
                                        // Добавление колонки [Id].
                                        esq.addColumn("Id");
                                        // Добавление колонки [Id] из схемы [Document].
                                        esq.addColumn("Document.Id", "DocumentId");
                                        // Создание и добавление фильтров в коллекцию запроса.
                                        esq.filters.add("filterOrder", this.Terrasoft.createColumnFilterWithParameter(
                                                this.Terrasoft.ComparisonType.EQUAL, "UsrOrder", OrderId));
                                        // Получение всей коллекции записей и отображение ее в модальном окне справочника.
                                        esq.getEntityCollection(function(result) {
                                                var existsDocumentsCollection = [];
                                                if (result.success) {
                                                        result.collection.each(function(item) {
                                                                existsDocumentsCollection.push(item.get("DocumentId"));
                                                        });
                                                }
                                                // Добавление фильтра в конфигурационный объект.
                                                if (existsDocumentsCollection.length > 0) {
                                                        var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
                                                                existsDocumentsCollection);
                                                        existsFilter.comparisonType = this.Terrasoft.ComparisonType.NOT_EQUAL;
                                                        existsFilter.Name = "existsFilter";
                                                        config.filters = existsFilter;
                                                }
                                                // Вызов модального окна справочника
                                                this.openLookup(config, this.addCallBack, this);
                                        }, this);
                                },

                                // Обработчик события сохранения страницы редактирования.
                                onCardSaved: function() {
                                        this.openDocumentLookup();
                                },

                                //Открывает справочник документов в случае если страница редактирования заказа была ранее сохранена.
                                addRecord: function() {
                                        var masterCardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]);
                                        var isNewRecord = (masterCardState.state === configurationEnums.CardStateV2.ADD ||
                                        masterCardState.state === configurationEnums.CardStateV2.COPY);
                                        if (isNewRecord === true) {
                                                var args = {
                                                        isSilent: true,
                                                        messageTags: [this.sandbox.id]
                                                };
                                                this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
                                                return;
                                        }
                                        this.openDocumentLookup();
                                },

                                // Добавление выбранных продуктов.
                                addCallBack: function(args) {
                                        // Экземпляр класса пакетного запроса BatchQuery.
                                        var bq = this.Ext.create("Terrasoft.BatchQuery");
                                        var OrderId = this.get("MasterRecordId");
                                        // Коллекция выбранных в справочнике документов.
                                        this.selectedRows = args.selectedRows.getItems();
                                        // Коллекция, передаваемая в запрос.
                                        this.selectedItems = [];
                                        // Копирование необходимых данных.
                                        this.selectedRows.forEach(function(item) {
                                                item.OrderId = OrderId;
                                                item.DocumentId = item.value;
                                                bq.add(this.getDocumentInsertQuery(item));
                                                this.selectedItems.push(item.value);
                                        }, this);
                                        // Выполнение пакетного запроса, если он не пустой.
                                        if (bq.queries.length) {
                                                this.showBodyMask.call(this);
                                                bq.execute(this.onDocumentInsert, this);
                                        }
                                },

                                //Возвращает запрос на добавление текущего объекта.
                                getDocumentInsertQuery: function(item) {
                                        var insert = Ext.create("Terrasoft.InsertQuery", {
                                                rootSchemaName: this.entitySchemaName
                                        });
                                        insert.setParameterValue("UsrOrder", item.OrderId, this.Terrasoft.DataValueType.GUID);
                                        insert.setParameterValue("UsrDocument", item.DocumentId, this.Terrasoft.DataValueType.GUID);
                                        return insert;
                                },

                                //Метод, вызываемый при добавлении записей в реестр детали.
                                onDocumentInsert: function(response) {
                                        this.hideBodyMask.call(this);
                                        this.beforeLoadGridData();
                                        var filterCollection = [];
                                        response.queryResults.forEach(function(item) {
                                                filterCollection.push(item.id);
                                        });
                                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: this.entitySchemaName
                                        });
                                        this.initQueryColumns(esq);
                                        esq.filters.add("recordId", Terrasoft.createColumnInFilterWithParameters("Id", filterCollection));
                                        esq.getEntityCollection(function(response) {
                                                this.afterLoadGridData();
                                                if (response.success) {
                                                        var responseCollection = response.collection;
                                                        this.prepareResponseCollection(responseCollection);
                                                        this.getGridData().loadAll(responseCollection);
                                                }
                                        }, this);
                                },    

                                // Метод, вызываемый при удалении выбранных записей детали.
                                deleteRecords: function() {
                                        var selectedRows = this.getSelectedItems();
                                        if (selectedRows.length > 0) {
                                                this.set("SelectedRows", selectedRows);
                                                this.callParent(arguments);
                                        }
                                },

                                // Скрыть пункт меню [Копировать].
                                getCopyRecordMenuItem: Terrasoft.emptyFn,
                                 // Скрыть пункт меню [Изменить].
                                getEditRecordMenuItem: Terrasoft.emptyFn,
                                // Возвращает имя колонки по умолчанию для фильтра.
                                getFilterDefaultColumnName: function() {
                                        return "UsrDocument";
                                }
                        },
            
    };
});
 Добрый день, прошу помочь с деталью выборкой из справочника. Не сохраняет значения. Специально использовал все с примера в Академии чтоб понять суть.

 

 

 

Нравится

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

Добрый день, не совсем понятно что конкретно вы хотите реализовать, о каком примере вы говорите?

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

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

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

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

 message: Uncaught Terrasoft.ItemNotFoundException: Item with key  Does not exist 

Нет никакого Id, что искать.
Пробовали очистить всю схему страницы, но не помогло. Видимо, проблема где-то в регистрированных данных

Как с этой ситуацией справится?

Нравится

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

Здравствуйте, Владимир!

Попробуйте добавить пустой модуль, сохранить его и удалить. Это перегенерирует бандлы и решит ошибку.

Станислав Чернышев,

уточню:

добавил новый раздел, но ошибка осталась. Или я не так понял?

Владимир Соколов,

 

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

Тоже попробовал - тоже без результата. К тому же, насколько я понимаю, компиляция всего тоже перегенерирует статический контент?

Может, его можно удалить как-то на сервере?

Показать все комментарии
editRecord: function(record) {
				const activeRow = record || this.getActiveRow();
				if (!activeRow) {
					return;
				}
				if (!this.getIsCardValid()) {
					return;
				}
				const primaryColumnValue = activeRow.get("NrbPoint.NrbObject").value;
				this.openCardInChain({
					id: primaryColumnValue,
					sandbox: this.sandbox,
					schemaName: "NrbObjectPage",
					operation: ConfigurationEnums.CardStateV2.EDIT,
					moduleId: this.sandbox.id + "_" + "NrbObjectPage",
					renderTo: "centerPanel",
					historyState: this.sandbox.publish("GetHistoryState")
				});
			},

 

Нравится

Поделиться

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

Добрый день!

 

Реализовали функционал копирования деталей при копировании записи частично на примере существующего дополнения:

- в методе onSaved если режим  isCopy мы вызываем БП, в который отправляем конфиг с id старой\новой записи, название схемы и тд. Бизнес-процесс на основе заполненного справочника с колонками деталей создает новые связи с новой (скопированной записью).

 

К сожалению, создание новых связей не всегда происходит корректно -- иногда выпадает в ошибку внешнего ключа. Есть подозрение, что это связано с тем, что в момент работы БП еще может быть не создана новая запись (не скопирована).

Как лучше поступить в таком случае? Можно было бы реализовать это в событийном процессе базовой записи, но не очень понятно как в нем узнать, что сейчас происходит копирование, а не добавление. И почему вообще может возникать ошибка? Может быть в onSaved есть возможность доработки с ожиданием создания записи в бд? Заранее благодарю за ответы

Нравится

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

А данное дополнение не подошло под ваши задачи? https://marketplace.terrasoft.ru/app/copy-detail-records-creatio

Трефилов Павел Сергеевич,

частично оно удовлетворяет нашим требованиям, но не полностью. Поэтому я делал свой механизм, отчасти похожий на тот что используется в этом дополнении

Если это единичный случай, то я делал по другому:

Для страницы раздела переделать вызов метода copyRecord, в нем вызывать процесс, который делать поэтапно сначала делает копирование основной записи, а потом копирование записей деталей. К сожалению в БП нету элемента "сделать копию". Поэтому приходилось делать Читать данные - Добавить данные (режим одна запись) - Сохранить в id новой записи в переменную - Добавить данные в деталь (результат выборки) - открыть запись.

		methods: {
			copyRecord: function(primaryColumnValue) {
				this.runCustomCopyProcess(primaryColumnValue);
			},
 
			runCustomCopyProcess: function(primaryColumnValue){
				var args = {
					sysProcessName: "UsrCopySpecificationCustomer",
					parameters: {
						specificationsId: primaryColumnValue
					}
				};
				ProcessModuleUtilities.executeProcess(args);
			},
		}

Это все можно сделать и через isCopy, но там надо отловить момент, когда основная запись уже сохранилось и тогда запускать копирование детали, пример есть в InvoiceSection, правда код крайне замороченный, плюс там еще и вьюшки задействованы. По мне так проще через БП сделать, как у меня, пусть и не очень "красиво".

Трефилов Павел Сергеевич,

В плане копирования связей проблем нет -- сделали БП, там все работает. Проблема скорее в отлавливании момента, когда запись копии основной страницы уже создалась. Казалось бы, у нас для этого есть onSaved -- бери и делай. Но нет, не всегда в момент срабатывания onSaved запись уже создана в бд видимо...

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

Добрый день,

В базовом разделе Контрагенты создала новую деталь на основе того же раздела: клиенты этого контрагента.
Стоит задача в другом разделе фильтровать поле Клиенты после выбора контрагента, т.е. фильтровать по значениям этой новой детали.

Просто бизнес-правилом такой фильтр не добавить, а как можно сделать?

Нравится

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

Екатерина, здравствуйте.

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

В иных случаях, наиболее корректным выходом из Вашей ситуации будет создание корректной детали (Создать объект по аналогии с "Продукт в продаже" или "Продукт в заказе"), например, "Клиент в контрагенте" - и настраивать функционал средствами базовой логики или доработками.

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

Цель: нужно закрашивать ячейки в колонке (не строки) в детали, которые подходят по условию.

Вопрос: возможно ли это реализовать? Если да, то подскажите, пожалуйста, как? (желательно с примером)

Нравится

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

Евгений, добрый день!

На данный момент нет возможности выделить определённые ячейки по условия, можно только для всей записи.

Рекомендую ознакомится с этой публикацией о применении стилей.

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