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

Нравится

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

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

 

Проверять наличие записи на детали через бизнес правило не получится. Как вариант можно реализовать постановку задачи с указанием заполнить деталь и привязкой к статусу на панели DCM. Такая задача может быть обязательной для выполнения менеджером который работет с записью.

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

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

Добрый день!

Пытаюсь по инструкции https://community.terrasoft.ua/articles/kak-sozdat-polzovatelskii-eleme… добавить кастомный элемент управления (задача - сделать поле textEdit, которое будет парсить введенную строку и возвращать число)
Столкнулась с проблемой: не получается привязать логику к событию сhange.

Как привязываю:

Ext.define("Terrasoft.controls.ITdsDataControl", {
	/*extend: "Terrasoft.Component",*/
	extend: "Terrasoft.controls.TextEdit",
init: function() {
		this.callParent(arguments);
		this.addEvents(
			"myMethod",
			"onChange" //пытаюсь привязать стандартный метод к событиям
		);
	},
onChange: function(event){
        var value = this.getTypedValue();
        value = value+"ttt";
        this.setValue(value); //пытаюсь увидеть изменилось ли значение
        this.setReadonly = true;//или хотя бы изменилась ли редактируемость поля
        this.setTimeString(value);
        this.reRender();
        this.callParent(arguments);
        };

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

 

Можете подсказать, из каких элементов должна состоять данная логика? Что должно быть в коде компонента чтобы была возможность написать кастомную логику парсинга в момент, когда введено значение?

Нравится

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

Добрый день, Александра!

Из вашей бизнес задачи могу предположить, что вам достаточно будет в схеме страницы написать атрибут, примером:

attributes: {
			"UsrText": {
                dataValueType: Terrasoft.DataValueType.TEXT,
                dependencies: [
                    {
						columns: ["UsrText"],
                        methodName: "calculateNumber"
                    }
                ]
            }
		},

При изменении поля UsrText будет запускаться метод calculateNumber и уже в нём вы можете сделать всё, что вам необходимо.

Дима Вовченко,

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

 

 

В статье-примере события wrap-элемента отслеживались, насколько я поняла, после привязки их в функции:

initDomEvents: function() {
        this.callParent(arguments);
        var wrapEl = this.getWrapEl();
        if (wrapEl) {
            wrapEl.on("click", this.onClick, this);
        }
    },

У меня (если я правильно поняла логику) нужно событие change самого textEdit а не wrap-элемента. Но может быть мне нужно его включить для отслеживания таким же способом?

 

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

Добрый День, как устранить данную ошибку?

Скриншот прилагается.

Нравится

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

Содержимое окна сообщения не видно.

 

Текст сообщения об ошибке не виден.

UnauthorizedAccessException. Отказано в доступе по пути "C:\bpmonline\Terrasoft.WebApp\conf\content\_FileContentDescriptors.js". Остальные ошибки могут быть найдены в логе приложения

Здравствуйте, рекомендую проверить и при необходимости раздать права уровня Full control для пользователя, под которым запущен пул в iis, на \Terrasoft.WebApp и рекурсивно выдать права на все подпапки и файлы.

Добрый День, помогло выдача полных прав для пользователя, под которым запущен пул в iis, на \Terrasoft.WebApp и на все подпапки/ файлы.

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

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

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

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

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

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

Добрый день,

Есть ли возможность один Контакт ассоциировать с несколькими Контрагентами?
Работаем с некоторыми фирмами в которых один и тот же директор. Создавать несколько одинаковых контактов неудобно, точно так же неудобно искать все это через диаграмму связей. Хочется нативного решения. 

 

Нравится

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

Возможно подойдет деталь "Карьера контакта" ? Объект ContactCareer.  В коробке она в только на карточке контакта видна, но с доработками можно и в контрагенте отображать. Там есть должность, основное не основное место и т.п.

Трефилов Павел Сергеевич пишет:

Так данные из неё отображаются в детали Контакты на странице Контрагента 

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

Нет, это разные детали. Деталь контакты смотрит на раздел контакты (связь 1 к n), а у карьеры как раз связь n к n. т.е в первом случае одного контакта засунуть в разные контрагенты не получится.

Трефилов Павел Сергеевич пишет:
Деталь контакты смотрит на раздел контакты (связь 1 к n)

Так было в старых версиях, но начиная с некоторой эту деталь расширили. Так что, она объединяет и контакты контрагента, и карьеру контакта

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

Ого, интересно, значит мы делали доработку, когда такой логики еще не было.

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

Добрый день, столкнулся с ситуацией, нужно сохранить настройку колонок детали для портальной страницы.
Если страница обычная, тут понятно, настраиваем колонки - сохраняем настройку для всех пользователей, привязываем данные SysProfileData фильтруя по ключу.
А как правильно сохранить настройку на портальной странице, у портального пользователя нету кнопки сохранить настройку колонок для всех.
Подменой названия страницы в URL адресе, тогда под супервизором можно попасть на страницу портала, единственное ли это решение?

Нравится

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

Смотреть в таблицу SysProfileData, твой настройке нужно поставить в поле ContactId значение null

 

Приведу пример как я скриптом делал "настройки колонок" для всех, скопировав настройки у супервизора. Возможно еще что потребуется, сейчас не помню.

--удалял все настройки кроме тех, которые не пустые и не под пользователем супервизор. В вашем примере в key нужно подставить настройку этой самой детали. А id пользователя твоего пользователя, от которого копировать на всех
	/*	
		delete from SysProfileData where "Key" in (
		select "Key" from SysProfileData
		where ("Key" like 'Usr%GridDataView' or "Key" like '%Detail%') and SysCultureId = '1A778E3F-0A8E-E111-84A3-00155D054C03'
		and (ContactId = '410006E1-CA4E-4502-A9EC-E54D922D2C00' or ContactId is null)
		group by "Key"
		having count(*) >=2
		) and ContactId is null
	*/
--	в тут обновляем contactId на null (для системы если стоит null, то это считается настройкой по умолчанию.
 /*	
	update SysProfileData set ContactId = null
	where "Key" like 'Usr%GridDataView' or "Key" like '%Detail%' and SysCultureId = '1A778E3F-0A8E-E111-84A3-00155D054C03' and ContactId = '410006E1-CA4E-4502-A9EC-E54D922D2C00'
  */

 

Смотреть в таблицу SysProfileData, твой настройке нужно поставить в поле ContactId значение null

 

Приведу пример как я скриптом делал "настройки колонок" для всех, скопировав настройки у супервизора. Возможно еще что потребуется, сейчас не помню.

--удалял все настройки кроме тех, которые не пустые и не под пользователем супервизор. В вашем примере в key нужно подставить настройку этой самой детали. А id пользователя твоего пользователя, от которого копировать на всех
	/*	
		delete from SysProfileData where "Key" in (
		select "Key" from SysProfileData
		where ("Key" like 'Usr%GridDataView' or "Key" like '%Detail%') and SysCultureId = '1A778E3F-0A8E-E111-84A3-00155D054C03'
		and (ContactId = '410006E1-CA4E-4502-A9EC-E54D922D2C00' or ContactId is null)
		group by "Key"
		having count(*) >=2
		) and ContactId is null
	*/
--	в тут обновляем contactId на null (для системы если стоит null, то это считается настройкой по умолчанию.
 /*	
	update SysProfileData set ContactId = null
	where "Key" like 'Usr%GridDataView' or "Key" like '%Detail%' and SysCultureId = '1A778E3F-0A8E-E111-84A3-00155D054C03' and ContactId = '410006E1-CA4E-4502-A9EC-E54D922D2C00'
  */

 

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

Большое спасибо!

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

Коллеги, приветствую.

Нужно реализовать уведомление пользователю, что через 2 часа срок разрешения обращения закончится.

 

2 часа (120 минут) буду зашивать в системную настройку (чтобы можно было варьировать админу)

 

Хочу реализовать с помощью БП по таймеру, который раз в час будет отбирать обращения по определенным критериям. 
далее, из записи вычитаю поле "время разрешения" (тип поля - дата/время) и тут главная загвозка.... как мне высчитать, что обращение должно разрешиться через 2 часа (120 минут)?

 

если должно решиться больше 2 часов - пропустить запись

если меньше, то по идее, должно было уже отправиться уведомление.

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

из идей:

  1. пробовать преобразовать поле с помощью формул .TotalHours/.TotalMinutes в часы/минуты и сравнивать..
  2. попробовать с помощью формул .AddMinutes(), .AddHours() добавить настройке "текущее время и дата" значение системной настройки и сравнить...

в общем, буду рада советом, а сама пошла пока пробовать :) 

Нравится

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

Aleksei Efimenko, 

я прибегла к другому решению:

  • сделала системную настройку, которая хранит значение за сколько нужно уведомление (в минутах)
  • сделала 2 параметра: 

Параметр 1: [#Системная переменная.Текущее значение времени#]. AddMinutes([число из системной настройки])

Параметр 2: параметр 1. AddMinutes(59) - чтобы получился час

 

  • и развела условными потоками:

1. если время разрешение больше моих параметров или меньше - проскакиваю

2. если время разрешение попадает в промежуток параметров - высылаю уведомление

Создаю новое поле - Reminding time. И его сравниваю.

 

Ещё процессы, которые его заполняют. И поле с временем, когда уведомление было отправлено. Это позволит избежать ситуации, когда таймер не сработает, например. Надо всего лишь выбирать те, у которых время уведомления прошло, но уведомление не было отправлено

Александра Дубс, подскажите, решило ли вашу задачу предоставленное решение от Владимира?

Aleksei Efimenko, 

я прибегла к другому решению:

  • сделала системную настройку, которая хранит значение за сколько нужно уведомление (в минутах)
  • сделала 2 параметра: 

Параметр 1: [#Системная переменная.Текущее значение времени#]. AddMinutes([число из системной настройки])

Параметр 2: параметр 1. AddMinutes(59) - чтобы получился час

 

  • и развела условными потоками:

1. если время разрешение больше моих параметров или меньше - проскакиваю

2. если время разрешение попадает в промежуток параметров - высылаю уведомление

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

Версия Creatio 7.18.5.1500
В чем может быть проблема?

Нравится

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

Если установлено, то удалите приложение Custom filter constructor for Creatio. Если нет и доработки делала Banza, то пишите им чтобы они устранили эти ошибки

Как по мне, если не обращать внимания на ошибки партнёрского кода, можно сделать вывод, что при открытии страницы редактирования приложению неясно, какую схему вытащить, или она была удалена. Нужно проверить в БД привязки, инфо о них есть ниже. Эталоном можно взять какой-нибудь базовый раздел.

 

При создании раздела мастером происходит его автоматическая регистрация в системных таблицах SysModuleEntity, SysModuleEdit и SysModule.
При переносе на другой сайт записи в указанных таблицах не переносятся.
Необходимо:

  • Создать запись в таблице SysModuleEntity (таблица, где хранится информация объектах разделов):

SysModuleEntity

insert into SysModuleEntity (SysEntitySchemaUId) values ('AF6DD4AD-1398-4FCE-8837-78DC65AE0F9E')

где  [SysEntitySchemaUId] - колонка Uid объекта раздела (например, "UsrTest") в таблице SysSchema;
 

  • II Этап. Создать запись в таблице SysModuleEdit (страница редактирования "Page"):

SysModuleEdit

insert into SysModuleEdit (SysModuleEntityId
,UseModuleDetails
,CardSchemaUId
,ActionKindCaption
,ActionKindName
,PageCaption)
values ('8ED522AF-00E1-4595-AC13-643944B005B7'
,1
,'8B22D9BE-4BBC-4B50-80EA-AB6FBB604B7E'
,'Добавить'
,'UsrTest1Page'
,'Card schema: "Test"')

где  [SysModuleEntityId] - колонка Id записи таблицы SysModuleEntity из первого этапа (проверка Select Id from SysModuleEntity Where SysEntitySchemaUId='AF6DD4AD-1398-4FCE-8837-78DC65AE0F9E')

[CardSchemaUId]  - колонка Uid страницы редактирования объекта (например, "UsrTest1Page") в таблице SysSchema (проверка Select Uid,Name from SysSchema where name like '%UsrTest%'). Нам необходима схема, которая называется "Название объекта + 1Page"

[ActionKindCaption] - Название кнопки в реестре раздела;

[ActionKindName] - Название схемы страницы редактирования;

[PageCaption] - Заголовок схемы страницы редактирования в таблице SysSchema (проверка Select Uid,Name,Caption from SysSchema where name like '%UsrTest1Page%')

  • III Этап. Создать запись в таблице SysModule (страница раздела "Section"):

SysModule

insert into SysModule (Caption
,SysModuleEntityId
,FolderModeId
,GlobalSearchAvailable
,Code
,SectionModuleSchemaUId
,SectionSchemaUId
,Image32Id) values (N'Test'
,'8ED522AF-00E1-4595-AC13-643944B005B7'
,'B659D704-3955-E011-981F-00155D043204'
,1
,'UsrTest'
,'DF58589E-26A6-44D1-B8D4-EDF1734D02B4'
,'B3D153C0-92EF-4A53-B868-9395C3E43516'
,'026742D9-390C-4778-BC46-9FA85C42677A')

где  [Caption] - Название раздела (можно брать caption объекта раздела - 

[SysModuleEntityId]  - колонка Id записи таблицы SysModuleEntity из первого этапа (проверка Select Id from SysModuleEntity Where SysEntitySchemaUId='AF6DD4AD-1398-4FCE-8837-78DC65AE0F9E')

[Code] - Название объекта раздела;

[SectionModuleSchemaUId] - UId модуля SectionModuleV2 с помощью которой открывается схему раздела;

[SectionSchemaUId] - колонка Uid страницы раздела объекта (например, "UsrTest1Section") в таблице SysSchema (проверка Select Uid,Name,Caption from SysSchema where name like '%UsrTest%'). Нам необходима схема, которая называется "Название объекта + 1Section"

 

Роман Казекин,

У меня уже была точно такая же ситуация из-за этого приложения. Решилось только удалением. Ответ от команды разработки - пока несовместимо с версией 7.18. К тому же здесь пытаются редактировать базовый объект - обращения. Но в то же время соглашусь с вами. Есть еще вариант что сделана кастомизация как минимум в двух пакетах. А настройка CurrentPackage стоит на пакете который ниже по иерархии, т.е. не видит всех изменений. Такое у меня было когда я пытался редактировать страницу с полями, настроенными с приложением Single file control for Creatio. Решается просто указанием правильного пакета в настройке.
 

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

Добрый день! 

Не запускается БП по таймеру. В планировщике нет соответствущей записи с БП. Что могло случиться?

Нравится

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

Добрый день, Руслан.

Точную причину выяснить будет проблематично, триггер могли удалить вручную, либо произошёл какой-то сбой при активации/деактивации процесса. Также может быть такое, что БП переносили пакетом, а триггер вместе с процессом в этом случае не был перенесён.

 

Рекомендую удалить элемент стартового таймера, и создать его заново, после чего сохранить процесс. Это должно инициировать создание триггера в планировщике.

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