Коллеги добрый день, прошу помочь с реализацией задачи. Необходимо сохранить сформированный 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

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

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

Есть необходимость настроить сортировку в выпадающем списке редактируемого реестра. 

 

На обычной странице мы решаем эту проблему через атрибут:

"State": {
              lookupListConfig: {
                orders: [{columnPath: "SortCode"}]
              }
            },

 

однако очевидно на детали это не отрабатывает.

 

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

Нравится

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

Если нужно сортировать список в колонке MyColumn по полю справочника SortCode, нужно описать такой метод в схеме детали

getGridRowViewModelConfig: function(config) {
                var result = this.callParent(arguments);
                if (result && result.rowConfig && result.rowConfig.MyColumn) {
                    result.rowConfig.MyColumn.lookupListConfig = {
                        orders: [{columnPath: "SortCode", direction: Terrasoft.OrderDirection.DESC}]
                    };
                }
                return result;
            },

 

 

 

Если нужно сортировать список в колонке MyColumn по полю справочника SortCode, нужно описать такой метод в схеме детали

getGridRowViewModelConfig: function(config) {
                var result = this.callParent(arguments);
                if (result && result.rowConfig && result.rowConfig.MyColumn) {
                    result.rowConfig.MyColumn.lookupListConfig = {
                        orders: [{columnPath: "SortCode", direction: Terrasoft.OrderDirection.DESC}]
                    };
                }
                return result;
            },

 

 

 

Вадим Курунов,

Спасибо!

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

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

Нравится

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

Добрый день!
Можно проверить делать по названию в "Управлении конфигурации"


Или попробовать добавить ее через мастер раздела на страницу.


 

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

 

Самый надёжный способ - это сделать запрос в БД следующего вида:

 

select count(*) from "SysDetail" d
join "SysSchema" s on d."EntitySchemaUId" = s."UId"
where s."Name" = 'Код_объекта';

где вместо Код_объекта укажите Ваш актуальный код объекта.

Если вернётся значение 0 - детали отсутствуют.

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