Доброго времени суток , необходимо к стандартной детали "файлы и ссылки" добавить поля сумма и тд, пробовал создать деталь унаследованной от объекта файлы и ссылки , добавил CSS файл к данному модулю , но при загрузке изображения выдает ошибку "Ошибка загрузки файла"

Нравится

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

Кирилл Паксюдкин,

Если для всех то заместить объект File или же если вам например только для файлы и ссылки активностей то 

ActivityFile

Не понял вас какое отношение имеет добавление CSS файла к добавлению полей к детали.

Вам нужно для начала расширить базовый объект Файлы и ссылки (если добавлять для всех деталей) Или расширить например Файлы и ссылки в Активности если доп поля нужны только для детали в Активностях

2 Разблокировать мастер настройки колонок для детали Файлы и ссылки. Подробнее тут

3 Настроить деталь

Григорий Чех,  т.е добавить замещающий объект с родилельским объектом FileDetailV2 и добавить к нему необходимые мне поля ? (с разблокировкой разобрался)

Кирилл Паксюдкин,

Если для всех то заместить объект File или же если вам например только для файлы и ссылки активностей то 

ActivityFile

Григорий Чех,

я заместил деталь добавил необходимые мне дополнительные поля и  сзвязал с разделом, далее  настроил колонки чтобы показывались мои доп поля , но при добавлении не выскакивают мои поля не смотря на то что в "карточка схемы" я полям добавил свойство "enabled": true   Как видите только стандартные поля видны.... Заранее спасибо)

Свойство «enabled» отвечает за доступность для редактирования, за видимость отвечает свойство «visible». Ограничения работы с ним описаны тут.

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

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

Нравится

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

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

{
	"operation": "insert",
	"parentName": "ResultInfoContainer",
	"propertyName": "items",
	"name": "ResultInfo",
	"values": {
		"labelConfig": {
			"caption": {
				"bindTo": "ResultsCaption"
			}
		},
		"value": {"bindTo": "ResultInfo"},
		"classes": {
			"labelClass": ["activity-result"]
		},
		"isMiniPageModelItem": true
	}
},
 

 

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

{
	"operation": "insert",
	"parentName": "ResultInfoContainer",
	"propertyName": "items",
	"name": "ResultInfo",
	"values": {
		"labelConfig": {
			"caption": {
				"bindTo": "ResultsCaption"
			}
		},
		"value": {"bindTo": "ResultInfo"},
		"classes": {
			"labelClass": ["activity-result"]
		},
		"isMiniPageModelItem": true
	}
},
 

 

Григорий Чех, Отлично

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

Добрый день. 

 

Подскажите, пожалуйста, действует ли описанная схема на текущей версии системы. 

https://community.terrasoft.ru/questions/maska-telefona-na-detali-sredstva-svazi

Есть ли в текущей версии простой способ настроить маску ввода для телефона (не только на детали средства связи), но и в строке, созданной в разделе.

 

Спасибо.

 

Нравится

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

Да подход описаный выше вполне работоспособный

В принципе вам достаточно добавить в зависимости  модуль MultiMaskEdit и описать в diff формат маски чтото типа:

{
       "operation": "merge",
       "name": "Phone",
       "values": {
             "controlConfig": {
                   "className": "Terrasoft.controls.MultiMaskEdit",
                    "mask": {
                            "formats": ["(99)999-99-99"]
                    }
               }
       }
}

 

Да подход описаный выше вполне работоспособный

В принципе вам достаточно добавить в зависимости  модуль MultiMaskEdit и описать в diff формат маски чтото типа:

{
       "operation": "merge",
       "name": "Phone",
       "values": {
             "controlConfig": {
                   "className": "Terrasoft.controls.MultiMaskEdit",
                    "mask": {
                            "formats": ["(99)999-99-99"]
                    }
               }
       }
}

 

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

Добрый день, Коллеги!

Нам в суппорт ответили, что у нас возникает ошибка  из-за того что не выполняется отписка от сообщения. "Вам нужно либо выполнять отписку самостоятельно либо попробовать использовать ClientMessageBridge https://academy.terrasoft.ua/documents/technic-sdk/7-14/clientmessagebridge-obrabotchik-websocket-soobshcheniya-na-storone-klienta

"


У нас на клиенте подписка на сообщение с сервера. Как нам отписываться от него?

Вот подписка на клиенте:

init: function() {

    this.callParent(arguments);

    this.subscriptionFunction();

},

subscriptionFunction: function() {

    Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE,

        this.bpListenerMessage, this);

},

bpListenerMessage: function(scope, message) {

    if (!message || message.Header.Sender !== "MessageForDetail") {

        return;

    }

    var message2 = message.Body;

    if (!this.Ext.isEmpty(message2) && message2 === "UpdateDetail") {

        this.reloadEntity();

        this.showInformationDialog("Актуализация дат окончена");

    }

    else if (!this.Ext.isEmpty(message2) && message2 === "UpdateDetailFix") {

        //Здесь в какой-то момент возникает ошибка

        this.reloadEntity();

    }

}

 

а вот отправка сообщения на сервере (кусок кода)

 

Terrasoft.Configuration.MsgChannelUtilities.PostMessage(uc, "MessageForDetail", "UpdateDetailFix");

Нравится

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

Добрый день.

Решение подобного вопроса обсуждается в этом посте.

Алла Савельева,

Это нам подходит? У нас не Sendbox.

А так будет работать?:

    bpListenerMessage: function(scope, message) {

                            if (!message || message.Header.Sender !== "MessageForDetail") {

                                return;

                            }

                            var message2 = message.Body;

                            if (!this.Ext.isEmpty(message2) && message2 === "UpdateDetail") {

                                this.reloadEntity();

                                this.showInformationDialog("Актуализация дат окончена");

                            }

                            else if (!this.Ext.isEmpty(message2) && message2 === "UpdateDetailFix") {

                                this.reloadEntity();

                            }

            },

            destroy: function() {

                this.Terrasoft.ServerChannel.un(Terrasoft.EventName.ON_MESSAGE, this.bpListenerMessage, this);

                this.callParent(arguments);

            },

 

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

Добрый день! Для удобства уведомления пользователей в ленте хотелось бы изменить знак @ на другой. Найден метод trackingStartChars в модуле ESNHtmlEditModule, однако замещение модулей невозможно. Можно ли как-то решить эту проблему?  

Нравится

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

Было бы удобно, если бы была такая системная настройка, которую возможно было бы изменить без внесения изменения в программный код!

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

Override Ext.js class

Example override class SummaryModule

SummaryModuleV2.js

define("UsrSummaryModuleV2", ["SummaryModuleV2"],
    function() {
        Ext.define("Terrasoft.SummaryModuleOverrided", {
            override: "Terrasoft.SummaryModule",
 
           /*
            * @override
            */
            getESQ: function() {
                var esq = this.callParent(arguments);
                esq.queryKind = Terrasoft.QueryKind.LIMITED;
                return esq;
            }
        });
    }
);

On the page, which use base class you need to add dependency to overridden class:

 

BaseSectionV2

define("BaseSectionV2", ["UsrSummaryModuleV2"], function() {
    return {
        methods: {},
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
    };
});

 

Если, конечно, часть логики по обработке этого символа не зашита в ядре. 

Не понимаю необходимости этой возможности! 

Во многих программах работает @ (скайп вайбер и тд) зачем плодить головную боль юзерам?

Зверев Александр,

Спасибо за ответ! Подскажите, пожалуйста, эти 5 мест упоминания 

ESNHtmlEditModule. Я работаю в облачной crm через конфигурацию и не имею возможности глобального поиска.

Григорий Чех,

Дело в том, что в bpm'online поиск идет по ФИО, которые в системе хранятся на русском языке. Чтобы уведомить нескольких пользователей через запятую, нужно без конца переключать язык (так как @ находится в английской раскладке). Возможно ли для упрощения работы менеджеров, которые постоянно пользуются этим кейсом, реализовать через @ упоминание какой-то функциональной роли?

Это схемы: PortalCasePage,SocialMessagePublisherPage, CasePage, SocialFeed, CaseRatingFeedbackPage.

Чтобы не переключать, может, лучше на уровне раскладки клавиатуры что-то подкрутить? Повесить «собаку» на какую-то неиспользуемую клавишу или комбинацию. Заодно и в других программах удобнее станет.

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

Всем доброго времени суток!

Столкнулся со следующей проблемой, развернул систему локально, при входе в систему выдает ошибки - http://prntscr.com/ohdrrs

Ранее такого не наблюдал.

Версия: 7.14.2.881 

Нравится

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

Пробую использовать createInFilter. При дебаге четко вижу, что filteredAgreementsKeys это массив из двух Id. Однако фильтр не отрабатывает и ошибок в консоль не сыпется. Кто нибудь использовал in-Filter в конфигурационных схемах при открытии справочника?

openAgreementsLookup: function (filteredAgreementsKeys, scope) {
					debugger;
					var filterCollection = Terrasoft.createFilterGroup();
					var filter = Terrasoft.createInFilter("Id", filteredAgreementsKeys);
					filter.Name = "filter";
					filterCollection.add("filter", filter);
					var config = {
						entitySchemaName: "IDSBAgreement",
						multiSelect: true,
						columns: ["IDSBName", "IDSBPartnerCode"],
						filters: filterCollection
					};
 
					scope.openLookup(config, function (args) {
						scope.addCallBack(args, scope);
					}, scope);
				}

 

Нравится

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

Включил в объекте деактивацию записей, но в справочнике ничего не поменялось - соответствующий пункт не появился. У меня версия 7.11.2, на этой версии этот функционал работает? Потому что в документации я вижу версию 7.12 только

Нравится

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

Алексей-Карягин,

На версии 7.11.2 100% можно запустить - у меня была такая же проблема на этой версии, но мне данную функциональность подключала служба поддержки, так как сайт в облаке.

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

Если всё правильно настроено, то в таблице появится колонка 'RecordInactive', но это можно увидеть только в SQL Server Management Studio, в конфигурации в схеме объекта Вы этого не увидите.

Функциональность деактивации записей объектов доступна для всех объектов, но автоматическая фильтрация записей работает только в выпадающих списках, на странице выбора из справочника и в быстрых фильтрах. На страницах с содержимым справочников, в расширенных фильтрах и разделах автоматический фильтр не применяется.

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

На версии 7.11.2 функциональность деактивации записей работает.

Для настройки нужно внести изменения в Web.config - установить значение true для настройки UseRecordDeactivation.

Также проверьте, чтобы в объекте, в котором Вы хотите использовать данный функционал, включен признак деактивации (его можно включить только в замещенном объекте - если это наследник базового или в не базовом объекте). После установки признака "Allow record deactivation" в объекте необходимо опубликовать объект, а затем скомпилировать приложение.

Я не нашел ключ UseRecordDeactivation ни в одном *.config файле. В каком месте он должен быть?

Судя по обзору пакета обновлений, деактивацию добавили в 7.11.3.

Алексей-Карягин,

В файл Web.config, который находится в папкке 

Terrasoft.WebApp, в секцию <appSettings> нужно добавить строчку:

 <add key="UseRecordDeactivation" value="true" />

Алла Савельева,не работает. Да и ладно

Значит, произведите обновление до тех версий, где оно есть.

Алексей-Карягин,

На версии 7.11.2 100% можно запустить - у меня была такая же проблема на этой версии, но мне данную функциональность подключала служба поддержки, так как сайт в облаке.

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

Если всё правильно настроено, то в таблице появится колонка 'RecordInactive', но это можно увидеть только в SQL Server Management Studio, в конфигурации в схеме объекта Вы этого не увидите.

Функциональность деактивации записей объектов доступна для всех объектов, но автоматическая фильтрация записей работает только в выпадающих списках, на странице выбора из справочника и в быстрых фильтрах. На страницах с содержимым справочников, в расширенных фильтрах и разделах автоматический фильтр не применяется.

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

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

Коллеги, добрый день!

У клиента в системе иногда наблюдается такое поведение: например открыт раздел Заказы , пользователь ничего не делает, абсолютно ничего. На экране появляется надпись Загрузка и пока не обновить страницу не исчезнет. 

.

В консоле такое:

Изображение удалено.

Изображение удалено.

На мой комментарий, что Ошибка выпадает в схеме EntityProductCountMixin и она не замещена, Террасофт выслал эти скрины и ответил:

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

Изображение удалено.Изображение удалено.

Помоги разобраться, что не так делаем, наша ли тут ошибка?

Нравится

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

В EntityProductCountMixin есть функция:

getEntityProductSchemaName: function() {
	var schemaName = this.getDependentEntitySchemaName();
	return schemaName + "Product";
},

И далее со схемой с этим сгенерированным названием пытаются работать, а она оказывается null вместо объекта. Возможно, у Вас в доработанной конфигурации логику EntityProductCountMixin ошибочно применили для схемы, у которой нет соответствующей схемы ...Product.

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

Здравствуйте, коллеги!

Сделал велосипед - перебор результирующей коллекции > элемента БП "Чтение данных" и решил поделиться для "будущих поколений".

Тестовый БП:

Изображение удалено.

читаем счета

Изображение удалено.

 

в Методах БП объявляем переменную, в которой будем хранить коллекцию, в данном случае invoices и методы доступа к колонкам объекта GetCompositeObjectColumnValue и перехода на следующую запись коллекции CompositeObjectListMoveNext

Изображение удалено.

инициализируем переменную коллекции

Изображение удалено.

Перебираем коллекцию и читаем поля текущей записи коллекции

Изображение удалено.

Готово!

Нравится

Поделиться

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

Какие тэги поставить, что бы в топе выдачи поиска по теме было?

Борис Леонов,

а как обойти это ограничение?

Миннекаев Айдар,

я не знаю, пробовал 5000 - позволяет

Для статей при создании поста можно выбрать тип «Публикация» вместо «Вопрос».

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

Зверев Александр,

Точно! Поменял на публикацию. А теги какие добавить? Идея то востребованная, куча вопросов на эту тему...

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

Как на Хабре, тег #никто_не_читает_теги.cheeky

Можно читать первые N штук, а потом каждую обрабатывать, чтобы не попадали под условия выборки, затем читать очередные N штук. А если записи не меняются, то непонятно, зачем так много читать, а не фильтровать ещё на уровне запроса в базу.

 

Борис, Спасибо!

Очень помогли.

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

 

 Это же каким извращенцем нужно быть, чтоб кусок кода давать в виде скриншота) что ж вы за люди))))))

Stradivarius,

я посчитал, что он читается лучше, потому что вставленное как <код> тут выглядит ужасно

 Methods

private IEnumerator&lt;ICompositeObject&gt; entities;
 
private T GetCompositeObjectColumnValue&lt;T&gt;(IEnumerator&lt;ICompositeObject&gt; objectList, string columnName) {
		ICompositeObject currentObject = objectList.Current;
		if(currentObject != null) {
			currentObject.TryGetValue&lt;T&gt;(columnName, out T value);
			return value;
		} else {
			return default(T);
		}
 
}
 
private bool CompositeObjectListMoveNext(IEnumerator&lt;ICompositeObject&gt; objectList) {
	return objectList.MoveNext();
}

Init

entities = Get&lt;ICompositeObjectList&lt;ICompositeObject&gt;&gt;("ReadDataUserTask1.ResultCompositeObjectList").GetEnumerator();
return true;

Processing

Set("MoveNext", CompositeObjectListMoveNext(entities));
string name = GetCompositeObjectColumnValue&lt;string&gt;(entities, "Name");
// Работает с Name
return true;

 

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