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

Пример: Есть 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 комментарий

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

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

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

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

Всем привет! Кто-нибудь делал горизонтальную прокрутку в продуктах(детали)? Саму прокрутку сделала через css(overflow-x: scroll; и width), но теперь возникла проблема если много продуктов, не видно полосу прокрутки для самых первых(так как полоса находится в самом низу).  Возможно есть идеи как зафиксировать полосу прокрутки что она всегда была видна внизу  или  что-то другое? Заранее спасибо!

Нравится

2 комментария
Лучший ответ

Добрый день

Анастасия, scroll будет отображаться внизу контейнера, который "скролит свой контент". В данном случае деталь расширяет свою высоту, поэтому горизонтальный скролл уходит вниз. Вам нужно зафиксировать высоту контейнера детали, чтобы сам контейнер не менял высоту при отображении новых продуктов. Также, через css

Добрый день

Анастасия, scroll будет отображаться внизу контейнера, который "скролит свой контент". В данном случае деталь расширяет свою высоту, поэтому горизонтальный скролл уходит вниз. Вам нужно зафиксировать высоту контейнера детали, чтобы сам контейнер не менял высоту при отображении новых продуктов. Также, через css

спасибо, работает!

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