Вопрос

Хочу сделать сабж. Окошко выводится, но список пустой. Что я делаю не так?

Метод onPreparePaymentsList не вызывается, кстати. Ошибок в консоли нет.

define("UsrFlip1Page", ["ServiceHelper", "jQuery", "css!UsrFlip1PageCSS"], function(ServiceHelper, jQuery) {
	return {
		entitySchemaName: "UsrFlip",
		attributes: {
			"PaymentVList": {
				dataValueType: Terrasoft.DataValueType.COLLECTION,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				caption: "Платежи",
				name: "PaymentVList",
				isCollection: true
			}
		},
		details: /**SCHEMA_DETAILS*/{
		},
		diff: /**SCHEMA_DIFF*/[
		]/**SCHEMA_DIFF*/,
		methods: {
			init: function() {
				this.callParent(arguments);
				this.set("PaymentVList", this.Ext.create(Terrasoft.Collection));
			},
 
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.set("ActivePayments", null);
				var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "UsrPayment" });
				esq.addColumn("Id");
				esq.addColumn("UsrBillNumber");
				esq.addColumn("UsrPpNumber");
				esq.addColumn("UsrSum");
				esq.addColumn("UsrType.Name");
				esq.filters.add("filterAuto", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.EQUAL, "UsrAuto", this.get("UsrAutoId").value));
				esq.filters.add("filterStatus", this.Terrasoft.createColumnInFilterWithParameters("UsrStatus.Name",
					["Активный", "Не подтвержден"]));
 
				esq.getEntityCollection(function(result) {
					if (result.success) {
						var PaymentItems = {};
						result.collection.each(function(item) {
							PaymentItems[item.get("Id")] = {
								"value": item.get("Id"),
								"displayValue": item.get("UsrBillNumber") + " / " + item.get("UsrPpNumber") +
									" / " + item.get("UsrSum") + " / " + item.get("UsrType.Name")
							};
						}, this);
 
						var list = this.get("PaymentVList");
						list.loadAll(PaymentItems);
					}
				}, this);
			},
 
			getActions: function() {
				var actionMenuItems = this.callParent(arguments);
				actionMenuItems.addItem(this.getActionsMenuItem(
					{
						"Caption": "Уточнение назначения платежа",
						"Tag": "runPaymentCorrection"
					}
				));
				return actionMenuItems;
			},
 
			onPreparePaymentsList: function() {
				debugger;
			},
 
			runPaymentCorrection: function() {
				if (this.get("PaymentVList").getCount() === 0) {
					Terrasoft.showInformation("По данному авто нет активной оплаты!");
					return;
				}
				debugger;
				Terrasoft.showInputBox("Выберите п/п для уточнения", function(button) {
						Terrasoft.showInformation(button);
					}, ["ok", "cancel"], this, {
					name : {
						caption: "Платежи",
						dataValueType: Terrasoft.DataValueType.ENUM,
						className: "Terrasoft.ComboBoxEdit",
						list: {
							bindTo: "PaymentVList"
						},
						prepareList: {
							bindTo: "onPreparePaymentsList"
						},
						isRequired: true
					}
				},
				{
					defaultButton: 0
				});
			}
		},
		rules: {}
	};
});

 

У меня такой же вопрос

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Здравствуйте.
BPM sales 7.11.3
Возможно ли создать следующий виджет:

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

3. Виджет не был бы прикреплен к определенной схеме и отображался повсюду.

Как такое, или что-то похожее, можно сделать? 
Приветствуется любая помощь!

 

У меня такой же вопрос

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

Информация о разработке своего виджета есть тут. Но это — для панели итогов. 

В Вашем случае, скорее сего, вместо виджета стоит модифицировать код боковой (LeftPanelTopMenuModule) или верхней (MainHeaderModule) панели и добавить туда вывод нужной информации. 

Или же, если значение числовое, делать ещё одну иконку правой коммуникационной панели (CommunicationPanel) и выводить на неё цифру, подобно количеству писем или звонков.

Зверев Александр, Спасибо! Могли бы вы уточнить где именно стоит делать модификацию, что бы вывести нужную мне информацию?

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

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

Есть примеры кода или мануал создание подобного?

Например, так в коммуникационную панель добавляется кнопка.

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

Спасибо за помощь. :)

P.S. Проверьте ЛС.

В версии 7.13 в верхнюю панель добавили надпись с номером версии. Эта логика реализована в схеме MainHeaderSchema, см. упоминания функции _initConfigurationVersion и атрибута ConfigurationVersion.

На init запускается функция, заполняет атрибут. А у надписей caption привязан к его значению.

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

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

Есть потребность текстовое поле с типом RICH_TEXT сделать автоматически расширяемым с помощью InlineTextEditViewGenerator.generate. Но в данной конфигурации у поля пропадает заголовок, а он нужен

{
	"operation": "merge",
	"name": "Description",
	"values": {
		"contentType": this.Terrasoft.ContentType.RICH_TEXT,
		"generator": "InlineTextEditViewGenerator.generate",
		"labelConfig": {
			"visible": true
		}
	}
}

 

В чем может быть проблема? Или есть другое решение?

У меня такой же вопрос

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

Добрый день!

Генератор InlineTextEditViewGenerator не рассчитан на использование со свойством labelConfig. Вы можете реализовать собственный генератор на его основе, либо использовать стандарную панель форматирования для RICH_TEXT.

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

В начале сентября наша команда успешно завершила проект внедрения новой CRM системы в строительной компании «Интерстрой». Основной поставленной задачей была оптимизация работы отдела продаж и выход на новый уровень качества обслуживания клиентов.

Компания «ИнтерСтрой» на протяжении 14 лет является лидирующим застройщиком в Крыму и г. Севастополе. За это время в эксплуатацию было успешно введено более 40 многоэтажных жилых домов и многоквартирных комплексов в семи городах. Тысячи семей стали счастливыми обладателями надежного жилья и высокодоходных активов. Застройщик полного цикла «ИнтерСтрой» занимает одну из лидирующих позиций среди застройщиков Крыма не случайно. Ведь это надежная компания, целью которой является создание качественных объектов недвижимости, отвечающих самым передовым требованиям и стандартам качества застройки, создавая будущие дома для жителей полуострова Крым и города Севастополь.

Реализация проекта заняла 8 месяцев, начиная со стадии предпроектного обследования до обучения и запуска системы в опытную эксплуатацию.

Итогом совместной работы с командой «ИнтерСтрой» - является увеличение скорости закрытия сделки. Сокращение времени подготовки документов, аналитические инструменты раскрывающие полную картину процессов в департаменте продаж.

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

Компания «ИнтерСтрой» получила новые точки роста, снижение издержек и повышение лояльности клиентов.

Подробности по ссылке на сайте 

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!

 

Необходимо для окна справочного поля переопределить логику кнопки Добавить. Для этого я создала замещающий клиентский модуль LookupPageViewModelGenerator и изменила метод defaultModeActionButtonClick. Но возникла проблема в получении Id текущей записи (из которой происходит открытие справочного поля). Как можно получить Id?

У меня такой же вопрос

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

this.getSelectedRecords();

Id ТЕКУЩЕЙ карточки (из которой был открыт lookup)

С замещением модуля не всё просто.

Возможно, как-то можно получать Id записи из стека прошлых открытых страниц системы, с которым работают при помощи GetHistoryState, ReplaceHistoryState и PushHistoryState.

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

Как на базовую кнопку "СОХРАНИТЬ" повесить доп функции (выполнение пользовательских методов).
Что бы после нажатия на кнопку "СОХРАНИТЬ", в нужных нам полях сначала сгенерировались значения(если эти поля еще не заполнены), и только после этого уже выполнилось сохранение значений карточки.
 

У меня такой же вопрос

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

Вам нужно в карточке редактирования переопределить метод save. Например:

            save: function() {
              // Здесь будет вызов нужных Вам методов  

              this.callParent(arguments);
            }

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

Автоматическое заполнение можно реализовать либо в бизнес-правиле фильтрации, либо через свойства атрибута dependencies.

Более подробно определить нужный способ реализации можно, если Вы опишите, какую точно задачу хотите решить.

Можно сделать всю логику во встроенном БП объекта, на событии Saving (до момента сохранения) или на Saved (после). Например, вторым способом формируют номер по порядку в некоторых разделах.

А в чем тогда отличие save от onSaved ?

Это разные вещи, функция на клиенте на JS и на сервере на C#.

То что это разные вещи и так понятно. Вопрос в чем конкретно отличие?!

Соломонов Алексей Михайлович,

save - это метод, который вызывает обработчик onSaved события save.

Вот кусок кода из BasePage:

            /**
             * @inheritdoc Terrasoft.BaseEntityPage#save
             * @override
             */
            save: function(config) {
                this.callParent([function() {
                    this.Terrasoft.chain(this.saveDetailsInChain, function() {
                        this.onSaved(this.cardSaveResponse, config);
                        this.cardSaveResponse = null;
                        delete this.cardSaveResponse;
                    }, this);
                }, this]);
            },

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

Помогите разобраться: имею список названий колонок схемы, нужно на уровне Entity их очистить, чтобы гарантировать, что они не будут видны не только в конкретной форме, но и нигде. Предположил, что можно пройтись по GetColumnValueNames(), но для колонок-справочников имена отличаются, типа <имя>Id (Я так понимаю, как в БД), <имя>Value (lookup value из связанной таблицы). Подскажите, как гарантировано и эффективно очистить колонки по имени? Насколько быстрым будет вариант через Entity - Schema - EntitySchemaColumn? Может ли помочь знание не только ColumnName, но и UId?

У меня такой же вопрос

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

Нужно просто настроить запрещающий доступ по колонкам.

Так же вы на уровне можете скрыть поле на уроне Entity (будет существовать в БД, невозможно будет создать колонку с таким же именем и тд), но тогда обращение к нему стандартными методами будет затруднено. Для этого необходимо изменить режим использования 

Запрещающий доступ не подходит, поскольку администрировать нужно по каждой записи отдельно. Сценарий - индивидуальный менеджер видит все по своему контрагенту, любой менеджер - только часть. Может, есть где-то нормальная документация по sdk с комментариями чуть полнее, чем Overloaded :) ?

Вопрос комбинации доступа по записям и полям обсуждался неоднократно, простого решения нет, только доработка.

 

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

Так доработку мы и ведем, сейчас наткнулись на то, что вычитать "запрещенные" колонки можем, но скрыть их - нет, поскольку в схеме и сущности разные нотации, а гарантированно сопоставить одни с другими не можем.

Наличие и отсутствие Id для всех справочных колонок работает одинаково. Посмотрите у одной и для остальных сделайте так же.

Так мы пока и сделали, но это явный костыль, не ясно, как отработает колонка, у которой Id уже присутствует в названии. Поэтому и ищем более чистое решение.

Если у справочной колонки уже есть «Id» как часть названия, то в базе будет, соответственно, «IdId». Но лучше таких названий избегать.

Исправить первый пост не могу, там не <имя>Value, а <имя>Name, что впрочем не принципиально. Принципиально, что о гглупости, или незнанию, или умышленно созданная колонка ContactName не будет отличаться от Contact.Name, а потом такую ошибку черта лысого найдешь.

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

Спасибо, мы все это смотрели, но мы делаем более-менее generic решение, с тем, чтобы оно работало без дополнительных ограничений и не только в момент сдачи, поэтому варианты посмотреть, перечислить явно и т.п. никак не подходят. Нужна или аутентичная процедура получения одного из другого (или хотя бы документированное API, по которому не приходится догадываться, что имеется в виду), или официальній документ о требованиях к именованию, или (что хуже всего) авторитетное утверждение, что єти колонки каждій именует как Бог на душу положит и задача не решается в принципе.

Требования к именованию публиковались ещё во времена 3.Х.

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

Мы так и делаем, правда там хранятся не Id, а UId, и я пытаюсь от имеющихся UId перейти к columnName, которые можно передать в Entity.SetColumnValue. Думал, что нашел, но см. первый пост этой ветки.

Поскольку на https://community.terrasoft.ru/questions/spisok-ne-administriruemyh-kol… никто не отвечает по сути вопроса, я просто пробую другой подход, основная часть задачи решена, а то, что казалось очевидным при беглом взгляде на имеющийся API, оказалось проблемой.

Обычно имена в базе и схеме совпадают, отличие только для справочных. Можно проверять, справочник ли это и затем добавлять или удалять «Id».

Также можно получить в виде JSON метаданные объекта и анализировать их: для каждой  справочной колонки там в соответствующих полях есть тройка названий: для поля-объекта, поля с Guid и поля для отображения. Например, "Type", "TypeId" и "TypeName".

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

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

Можно ли как-то унаследовать правила? Ибо, копи-паста - это как-то не хорошо...

У меня такой же вопрос

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

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

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

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

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

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

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

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

вот, да, но копипастить не хочется. Может кто из разрабов ответит?

Если стандартными средствами настроить правила не получится, можно делать кодом, привязав им всем «isRequired» к логике какой-либо функции. Например, такой код есть в EmailTemplateUserTaskPropertiesPage.

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

Сущности в системе идентифицируются Guid. который, будучи преобразованным в строку, имеет вид типа "846d8d33-004b-4a3e-b778-10cfd163f3bb" (буквы строчные, в таком виде он фигурирует, например, в параметрах запросов http)

С другой стороны в БД сущности хранятся с первичным ключем, построенным на id varchar2(38), но содержиное там заключено в фигурные скобки и буквы заглавные.

Есть ли стандартная функция преобразования одного в другое? В запрос нужно передать Id текущего контакта, но "{"+UserConnection.CurrentUser.ContactId.ToUpper()+"}" выглядит достаточно неуклюже.

У меня такой же вопрос

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

Могу предложить "элегантный костыль":
string contact = "846d8d33-004b-4a3e-b778-10cfd163f3bb";
string result = String.Join(String.Empty, "{", contact.ToUpper(), "}");

Если используете механизмы EntityShchemaQuery или Select/Insert/Update/Delete, то ничего преобразовывать не нужно, в функции передаётся переменная типа Guid и при генерации SQL в нужном формате подставится само. Если же самостоятельно создаёте SQL, воспользуйтесь своим кодом или советом выше.

Эелегантность костыля в виде сокращения записи обращения к переменной иррелевантна задаче :)

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

Причина в том, что основная поддерживаемая база  — MS SQL, где есть тип «uniqueidentifier» и база поймёт вставку в любом формате. А поддержка Oracle добавлена опционально.

В этом и была суть вопроса: если в Oracle используется просто текст, какая разница, что туда писать? Зачем эти скобочки? Чтобы что-то в базе посмотреть, скопировать Id из URL не получится, это минус. Как и при склеивании ESQ и Select. А плюсы вообще есть?

Этот текст, хоть и не является отдельным типом «uniqueidentifier», но служит в качестве первичного или внешнего ключа. Соответственно, если писать в двух полях один GUID разным способом, связи между ними не получится.

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

В каких 2-х полях??? Почему не писать ОДНИМ способом, в нижнем регистре и без скобок? Везде.

В версии для MS SQL пишите как вам нужно, а в Oracle — именно требуемым способом.

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

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

Дмитрий, оно и приведено к единому знаменателю — с фигурными скобками в верхнем регистре. Нет смысла в версиях с 3.0 по 7.13 использовать один формат, а потом внезапно менять просто потому, что не нравятся скобки.

Я написал, что не нравится: дело не в скобках, а в отсутствии целостности восприятия. Я понял, что это чье-то давнишнее головотяпство, последствия которого сейчас уже сложно ликвидировать, а негативное влияние считается минимальным. При этом корпоративная этика не позволяет это признать на людях. В принципе, лучше было вообще не реагировать на мой вопрос, но в любом случае спасибо.

При обычной работе с форматом написания не сталкиваются никак, все C#-классы принимают значения типа Guid и преобразуют в нужный формат при генерации SQL автоматически. В чём именно негативное влияние фигурных скобок, Вы так и не объяснили. 

Вероятно, первоисточник именно такого написания — стандартная функция CreateGuid в Delphi, на котором была написана система Terrasoft 3.X. Она генерирует именно в таком формате. И в таблицу базы Firebird и Oracle, где нет встроенных типов для хранения GUID, так и записывали.

В Microsoft для C# рекомендуют для получения нужного формата использовать для переменной типа Guid метод ToString("N") в сочетании с String.ToUpper.

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

Хочу отловить двойной клик по записи в разделе.

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

Вопрос как?

У меня такой же вопрос

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

Добрый день. В 7.13 или 7.13.1 это есть уже в коробке. Можете посмотреть, как реализовано там. Работает и в разделах, и в деталях.

 

Проверьте метод onGridDoubleClick, возможно это то, что вам нужно

Пример работы с этим методом есть на детали «Пользователи» раздела «Организационные роли». По двойному клику открывается карточка пользователя. Логика реализована в схеме UsersDetailV2.

Добрый день. В 7.13 или 7.13.1 это есть уже в коробке. Можете посмотреть, как реализовано там. Работает и в разделах, и в деталях.

 

Войдите или зарегистрируйтесь, чтобы комментировать