Сделал редактируемый реест с позицией.
Добавил кнопки вверх и вниз

init: function() {
                                this.callParent(arguments);
                        },
...

onActiveRowAction: function(buttonTag) {
                                var activeRow = this.getActiveRow();
                                var position;
                                switch (buttonTag) {
                                        case "Up":
                                                position = activeRow.get("Position");
                                                if (position > 0) {
                                                        position--;
                                                        this.setPosition(activeRow.get("Id"), position, this.reloadGridData, this);
                                                }
                                                break;
                                        case "Down":
                                                position = activeRow.get("Position");
                                                position++;
                                                this.setPosition(activeRow.get("Id"), position, this.reloadGridData, this);
                                                break;
                                        default:
                                                break;
                                }
                        },

соответственно кнопки удаления теперь не работают.
Как мне сделать чтобы работали?

Нравится

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

в методе onActiveRowAction скорее всего забыли:

this.callParent(arguments);

т.е. Ваша логика затерла "родительскую", а подразумевалось ее дополнение.

Игорь то что у меня вначале стоит.

init: function() {
				this.callParent(arguments);
			},

не работает?

это для метода init
я же вам говорю про метод onActiveRowAction
у каждого метода своя само собой цепочка.

вставьте

this.callParent(arguments);

в начале или в конце вашего описания метода onActiveRowAction

Может я не правильно описал сами кнопки

diff: /**SCHEMA_DIFF*/[
			{
				"operation": "merge",
				"name": "DataGrid",
				"values": {
					"className": "Terrasoft.ConfigurationGrid",
					"generator": "ConfigurationGridGenerator.generatePartial",
					"generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
					"changeRow": {"bindTo": "changeRow"},
					"unSelectRow": {"bindTo": "unSelectRow"},
					"onGridClick": {"bindTo": "onGridClick"},
					"activeRowActions": [
						{
							"className": "Terrasoft.Button",
							"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
							"tag": "save",
							"markerValue": "save",
							"imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
						},
						{
							"className": "Terrasoft.Button",
							"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
							"tag": "cancel",
							"markerValue": "cancel",
							"imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
						},
						{
							"className": "Terrasoft.Button",
							"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
							"tag": "remove",
							"markerValue": "remove",
							"imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
						}
					],
					"initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
					"activeRowAction": {"bindTo": "onActiveRowAction"},
					"multiSelect": false
				}
			},
			{
				"operation": "insert",
				"name": "DataGridActiveRowUpButton",
				"parentName": "DataGrid",
				"propertyName": "activeRowActions",
				"values": {
					"className": "Terrasoft.Button",
					"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
					"imageConfig": LocalizableHelper.localizableImages.Up,
					"tag": "Up"
				}
			},
			{
				"operation": "insert",
				"name": "DataGridActiveRowDownButton",
				"parentName": "DataGrid",
				"propertyName": "activeRowActions",
				"values": {
					"className": "Terrasoft.Button",
					"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
					"imageConfig": LocalizableHelper.localizableImages.Down,
					"tag": "Down"
				}
			}
		]/**SCHEMA_DIFF*/,
	methods: {
			init: function() {
				this.callParent(arguments);
			},
onActiveRowAction: function(buttonTag) {
				var activeRow = this.getActiveRow();
				var position;
				//this.callParent(arguments);
				switch (buttonTag) {
					case "Up":
						position = activeRow.get("Position");
						if (position > 0) {
							position--;
							this.setPosition(activeRow.get("Id"), position, this.reloadGridData, this);
						}
						break;
					case "Down":
						position = activeRow.get("Position");
						position++;
						this.setPosition(activeRow.get("Id"), position, this.reloadGridData, this);
						break;
					default:
						break;
				}
			},

а зачем закомментировали

//this.callParent(arguments);

не помогло ?

Не помогло.
Вообще все кнопки перестали работать.
Делаю так.
Из базового BaseSectionV2 из метода onActiveRowAction
Копирую и вставляю код

case "delete":
this.deleteRecords();
break;

Только пока не нашел где для cancel и save

в вашем switch case поместите

this.callParent(arguments)

в условие default:

Увы не помогло.

Но ведь метод onActiveRowAction в детали с ред. реестром вызывается из схемы ConfigurationGridUtyilities. Вам не нужно вызывать радителя. Достаточно скопировать весь код замещаемого метода и добавить свою логику в switch.

"Мотков Илья" написал:с ред. реестром вызывается из схемы ConfigurationGridUtyilities.

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

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

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

Нравится

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

Здравствуйте, Алла!

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

Данная проблема и обходные пути решения обсуждались тут:
http://www.community.terrasoft.ru/forum/topic/25239

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

В нашей конфигурации есть редактируемый реестр (он уже содержит некоторый набор записей), в котором реализована возможность добавления информации в некоторое поле путем считывания штрих-кода сканером. Сейчас для того, чтобы выполнить переход на новую строку мне нужно брать мышку и устанавливать фокус на новой строке.
Каким образом можно сделать так, чтобы переход на новую строку выполнялся либо автоматически при заполнении нужно поля, либо по нажатию на некоторую кнопку на клавиатуре, например, на Enter?
И можно ли вообще такое реализовать в версии 7.10?

Нравится

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

"Алла Савельева" написал: выполнялся либо автоматически

Можно поковыряться в ConfigurationGrid, метод onUpdateItem. Вызывается при каждом изменении яйчеек ряда. Но там гемор, ибо функция вызывается по 3-4 раза + надо брать из item.changedValues нужную колонку, смотреть не изменена ли она, накладывать кучу фильтров + сложно будет изменить запись вручную(при каждом изменении выбранного поля будет создавать новый элемент) и т.п.

"Алла Савельева" написал:либо по нажатию на некоторую кнопку на клавиатуре, например, на Enter

Вот тут можно. Тестил на детали Продукты в карточке заказа. Добавляем свой листенер и обработчик в ConfigurationGrid и биндим свою функцию в детали. Итого если изменим какую-то яйчейку в ряде, нажмём ENTER, создаётся новая запись. Схемы прикладываю.

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

К сожалению, сейчас способа реализовать данный функционал в системе нет. Только если писать свои "костыли". Однако в поддержке мне отвечали, что разработка такого функционала уже ведется.

Илья)

Такая возможность просто необходима для максимального использования возможностей bpm'online и, думаю, что не только в нашей компании.

Данила,

спасибо, что поделились своими наработками - будем пробовать!:wink:

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

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

К примеру. У детали "продукт в заказе" можно добавить поле "тип продукта". Которое будет информационным.

Как только мы делаем деталь с редактируемым реестром, мы уже не можем так сделать, у нас есть только те поля которые мы имеем.

Как быть? Чтобы отображать в редактируемом реестре связанные таблицы?

Нравится

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

1) Осуществлять запросы в БД (ESQ запрос), например если Вам необходимо получить какое либо значение из текущей карточки (в которой деталь находиться), то в коде выполняемом в окружении детали всегда доступно значение

this.get("MasterRecordId")

Которое возвращает Вам то поле по которому деталь связана с карточкой (как правило это ее Id).
По нему - ESQ запросом можно получить уже любые данные из карточки (сохраненные на данный момент в БД)
2) Публикация события-запроса, подписка на событие-ответ, публикация события-ответа происходит в подписке на событие-запрос в необходимых вам схемах других объектов (н/п карточки, других деталях)
в событие-ответ передаются необходимые данные. (в виде JS-объекта вторым аргументом в вызове метода this.sundbox.publish)

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

Добрый день!
Есть задача добавить представление в разделе, в котором будет редактируемый реестр другого объекта с собственными фильтрами (фильтры аналогичны с фильтрами раздела).
Подскажите, пожалуйста, как реализовать данный функционал?

Нравится

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

Здравствуйте, Александр!

Правильно ли я понимаю, что Вы хотите создать еще одно представление раздела, выведя в реестр детали, и добавив в созданное представление "Фильтр", который будет фильтровать записи на деталях?

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

Добрый день!
Вашу задачу нужно разделить на 2 этапа:
1. Создать представление
2. Создать свой модуль отображения реестра

По 1-му:
Начать нужно искать с BaseSection, в котором есть функция initDataViews(). Далее по аналогии с, например, представлением "Аналитика"

По 2-му:
Вам нужно создать свой модуль, который будет отображать что угодно (ваш реестр, графики...). После этого проследите как работает функция LoadView из BaseSection, на примере того же представления Аналитика

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

Добрый день.
Версия BPMOnline Sales Omnichannel 7.5.0.1328.
Есть деталь "Продукты Документа" с редактируемым реестром, при добавлении/изменении/удалении записи детали на сервере происходит перерасчёт сумм связанного документа (событие DocumentProductSaved и DocumentProductDeleted).
Для отображения обновлённых сумм в карточке документа использую метод subscribe:

"DocumentProduct": {
        "schemaName": "DocumentProductDetailV2",
        "entitySchemaName": "DocumentProduct",
        subscriber: function(){
            this.reloadEntity();
        }
        },

Проблема в том, что метод subscriber выполняется только при обновлении и удалении записи из редактируемого реестра, а при добавлении не выполняется.
Использование метода onActiveRowSave для вызова метода fireDetailChanged не помогло, т.к. карточка документа обновляется до того, как выполнилась логика по событиям DocumentProductSaved и DocumentProductDeleted.
Подскажите, как решит эту проблему.

Также ещё интересует, как сделать валидацию полей в редактируемом реестре?
Спасибо.

Нравится

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

Здравствуйте, Игорь.

Для вашей бизнес задачи нужно помимо метода subscriber использовать свои кастомные события через sandbox. И генерировать их еще и при изменении записи.

"Мартыненко Сергей" написал:

Здравствуйте, Игорь.

Для вашей бизнес задачи нужно помимо метода subscriber использовать свои кастомные события через sandbox. И генерировать их еще и при изменении записи.


Не могли бы вы подробнее описать ваш вариант

При инциализации схемы детали можно проверить добавляется ли сейчас новая запись следующим образом:

if(this.isAddMode()){
  здесь код публикации события через sandbox
}

Вот тут попытка в этом разобраться была :)

Спасибо.
А как быть с валидацией полей в редактируемом реестре?

"Коновалов Игорь" написал:

Спасибо.

А как быть с валидацией полей в редактируемом реестре?


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

Посмотрите статью на академии:
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/FieldsVali…

Подскажите как решилась разработка вызова метода без subscriber ?
Сейчас пытаемся аналогичный кейс решить.

Я в схеме детали <НазваниеОбъекта>DetailV2 при необходимости вызываю

this.updateDetail({reloadAll: true});

Я в схеме детали <НазваниеОбъекта>DetailV2 при необходимости вызываю

this.updateDetail({reloadAll: true});

Подскажите пож-та Игорь.
Догнать не могу.
Делаю так
*Detail

methods: {
			init: function() {
				this.callParent(arguments);
			},
			onSaved: function() {
				this.updateDetail({reloadAll: true});
			}
 
		}

и ничего. Вероятно я не туда это вставляю. Подскажите пож-та.

"Юсупов Марат" написал:

Подскажите пож-та Игорь.

Догнать не могу.

Делаю так

*Detail

methods: {

                        init: function() {

                                this.callParent(arguments);

                        },

                        onSaved: function() {

                                this.updateDetail({reloadAll: true});

                        }

                       

                }

и ничего. Вероятно я не туда это вставляю. Подскажите пож-та.

По идее да. А что debugger говорит?
И где вы вызываете метод onSaved?

Игорь, в детали *1Detail.
Или неправильный метод использую.
debugger туда не попадает.

В BaseGridDetailV2 Есть метод onCardSaved.
Может в вашем случае лучше использовать его.

Получилось так сделать в детали, которая вызывает песочницу.

saveRowChanges: function(row, callback, scope) {
				scope = scope || this;
				callback = callback || this.Terrasoft.emptyFn;
				if (row && this.getIsRowChanged(row)) {
					row.save({
						callback: callback,
						isSilent: true,
						scope: scope
					});
 
				} else {
					callback.call(scope);
				}
				scope.sandbox.publish("UpdateMyData", null, ["111"]);  // вызов песочницы в Page
			}
Показать все комментарии

На карточке раздела "Заявки на товары и услуги" есть деталь "Товары/услуги", которая работает с развязочной таблицей. Реестр в детали редактируемый.
Если открыть карточку, обновить страницу с очисткой кеша, и перейти в другой раздел, или просто по ссылке из справочного поля - карточки других разделов загружаются с пустыми полями. Выдает ошибку: "Элемент коллекции с именем SxProdDemand не найден". Если я правильно понимаю, в запрос почему-то добавляются колонки из детали.
Если обновить страницу с очисткой кеша в другом разделе - все разделы и ссылки работают.
Если отключить редактируемый реестр - все работает.
Деталь в базе зарегистрирована. Карточки редактирования у детали нет.
В чем дело и как это исправить?

Нравится

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

Добавил страницы редактирования - проблема исчезла. Есть ли возможность не добавлять страницы, т.к. они не будут использоваться?

Здравствуйте, Олег!

Рекомендую Вам обратиться в службу технической поддержки bpm'online.
Т.к. данный вопрос требует доступа к БД и Сайту для анализа вопроса.

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

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

 attributes: {
                "Order": {
                    lookupListConfig: {
                        columns: [
                            "Account.SxNAVCode", "SxShippingType.Code",
                            "Owner.SxNAVCode","SxContract.SxNAVCode",
                            "Date","Account.SxCFO.Code","Account.Id","Account.SxTradeChain.SxNAVCode", "Account.SxTradeChain.SxCFO.Code"
                            ,"Account.SxSalesOutletType","SxPaymentFormula","SxPaymentFormula.SxPaymentDelay","SxWarehouse.SxCode"
                        ]
                    }
                },

.........................................
//в секции rules
 "SxDesiredDiscount": {
                    "BindParameterEnabledToPaymentDelay": {
                        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                        "property": BusinessRuleModule.enums.Property.ENABLED,
                        "conditions": [
                            {
                                "leftExpression": {
                                    "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                    "attribute": "Order.SxPaymentFormula.SxPaymentDelay"
                                    attributePath:""
                                },
                                "comparisonType": Terrasoft.ComparisonType.LESS,
                                "rightExpression": {
                                    "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                    "value": 45
                                }
                            }
                        ]
                    }
                },

в детали также добавлены колонки

getGridDataColumns: function() {
                var config = this.callParent(arguments);
                config["Order.Account"]= { path: "Order.Account" };
                config["Order.Date"]= { path: "Order.Date" };
                config["Order.SxPaymentFormula"]= { path: "Order.SxPaymentFormula" };
                config["Order.SxPaymentFormula.SxPaymentDelay"]= { path: "Order.SxPaymentFormula.SxPaymentDelay" };
                config["Order.Account.SxSalesOutletType"]= { path: "Order.Account.SxSalesOutletType" };
                return config;
            }

Проблема в том, что при добавлении требуемое значение при добавлении можно получить как:
this.get("Order")["SxPaymentFormula.SxPaymentDelay"]
а при изменении:
this.get("Order.SxPaymentFormula.SxPaymentDelay"));

Следовательно есть разница в работе правил.

Подскажите пожалуйста, как решить данную проблему? Как верно сформировать конфиг, чтоб он всегда был одинаковым?

Нравится

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

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

Попробуйте в leftExpression указать параметры attribute и attributePath так:

"attribute": "Order",
"attributePath":"SxPaymentFormula.SxPaymentDelay"

Я таким образом сразу пробовал. Не помогло. Все равно работает или при добавлении или при изменении.

Александр, самый простой способ - устанавливать значение атрибута в методе initEntity карточки детали. Примерно так:

initEntity: function(callback, scope) {
	this.callParent([function() {
		if (!this.get("Order.SxPaymentFormula.SxPaymentDelay")) {
			this.set("Order.SxPaymentFormula.SxPaymentDelay",
				this.get("Order") && this.get("Order")["SxPaymentFormula.SxPaymentDelay"]);
		}
		callback.call(scope || this);
	}, this]);
}

В бизнес-правиле в этом случае необходимо использовать только "attribute": "Order.SxPaymentFormula.SxPaymentDelay".

Олег, работает.
Спасибо за помощь!

Подскажите пожалуйста, пытаюсь добавить фильтрацию, одного поля по значению другого, в редактируемом реестре. - http://www.community.terrasoft.ru/forum/topic/15497

Тут рассматриваеться BINDPARAMETER, возможна ли работа правила FILTRATION?

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

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

подскажите, пожалуйста, как фильтровать значение поля детали по значению поля объекта, в котором деталь. У меня в продажах есть деталь Доп.соглашения,в которой есть поле-ссылка на Договор. Мне нужно фильтровать договора по полю Контрагент - показывать только те договора, которые принадлежат контрагенту текущей продажи.
Я создала карточку редактирования, прописала в ней бизнес правило со ссылкой на атрибут AccountId. Но не могу определить, когда заполнять этот атрибут. в момент, когда срабатывает initEntity в самой сущности Доп.соглашение еще не заполнено поле Продажа. а методы init, onEntityInizialized не срабатывают
Есть какой-то вариант, как я могу получить id текущей сущности(продажи), в которой находится деталь, из карточки редактирования детали (не из схемы детали, а из карточки)?

Добрый день, Любовь.

Насколько я понял Ваш кейс, вы пытаетесь добавить деталь, объект которой - Договор. Достаточно будет связать данную деталь с карточкой следующим образом - объект детали AccountId = объекта карточки AccountId.
Если же Вы пытаетесь добавить деталь, объект которой кастомный, и в нем просто присутствует поле Договор, то реализовать такую логику не получится. Действительно, init/onEntityInizialized при загрузке детали не срабатывают, они отработают только если Вы откроете объект детали на редактирование.

"Мотков Илья" написал:Если же Вы пытаетесь добавить деталь, объект которой кастомный, и в нем просто присутствует поле Договор, то реализовать такую логику не получится. Действительно, init/onEntityInizialized при загрузке детали не срабатывают, они отработают только если Вы откроете объект детали на редактирование.

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

Нет, отрабатывает только БизнесПравила, следовательно если через БП нет возможности реализовать такую логику, то нет, у вас не получится сделать ее с помощью вычисляемых атрибутов для РР.

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

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

Здравствуйте, возможно ли реализовать редактируемый реестр для раздела в Bpm Online 7.4?
Также интересует вопрос - можно ли реализовать переключение между редактируемым реестром и плиточным представлением?

Нравится

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

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

Редактируемый реестр возможен в приложении начиная с версии 7.4.1
Для версии 7.4.0 данной возможности нет.

А насколько трудозатратно будет перенести такой реестр из более старших версий?

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

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

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

Добрый день!
В версии 7.5. появилась такая вещь как редактируемый реестр, но в редактируемый реестр нельзя вытаскивать связанные колонки.
Хотелось бы, чтобы такая возможность появилась (связанные колонки должны быть закрыты от редактирования).
Пример:
Раздел Документы, деталь Продукты.
Эту деталь можно сделать редактируемой, и это достаточно удобно.
Но после этого нельзя на данную деталь вытащить связанные колонки, например код продукта, артикул продукта и т.п.
Получаются вот такие пожелания
1) возможность добавления связанных колонок в редактируемый реестр (связанные колонки закрыты от редактирования
2) возможность редактировать не весь реестр, а только определенные колонки.
(например, на детали Продукты редактировать в реестре кол-во и цену, а сам продукт не редактировать)

Нравится

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