Добрый день.
Версия 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
			}
Показать все комментарии

Добрый день!
Подскажите пожалуйста как добавить действие в карточку контакта, так чтоб оно не сыпало при вызове из combined mode и не было доступно в разделе?
Сейчас есть замещающая страница ContactPage и переопределен метод getActions, в который добавлено действие: actionMenuItems.addItem(this.getButtonMenuItem({
"Caption": { "bindTo": "Resources.Strings.UsrSetToSaleCaption" },
"Tag": { bindTo: "setToSaleProcess" }
}));
при вызове из карточки работает нормально, но из совмещенного режима падает с ошибкой, что метод не найден.
Версия 7.7.0.2293

Нравится

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

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

Создали объект-представление

Заполнили представление скриптом

Представление заполнено корректно

Но почему-то фильтры по нему не работают (какую бы ни пробовали комбинацию - например, такие)

Подскажите, пожалуйста, с чем это может быть связано?

Нравится

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

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

Пользователь-Администратор.
Все права есть.
Где можно проанализировать запрос к БД, скажите, пожалуйста

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

Ошибка такая в консоли

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

Добрый день!
Унаследовали обращение от базового объекта
и переписали скрипт заполнения представления, чтобы в нем участвовала колонка Id

Заработало

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

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

Ситуация такая. В системе есть пользователь, права системного администратора у него есть.
В IIS создала новое приложение "1". Затем новую конфигурацию (копия Default). Выполнила "Компилировать все". Т.е. сделала все как в документации.

Проблема в невозможности авторизоваться в системе использую созданную конфигурацию.
Ошибки разные:

"
Exception Message: StartIndex cannot be less than zero.
Parameter name: startIndex
Exception Type: System.ArgumentOutOfRangeException
Exception Source: mscorlib

Exception Stack Trace:
at System.Text.StringBuilder.Remove(Int32 startIndex, Int32 length)
at Terrasoft.Configuration.ConfigurationSectionHelper.GetModuleStructure(UserConnection userConnection)
at Terrasoft.Configuration.ConfigurationSectionHelper.GetConfigurationScript(UserConnection userConnection)
at Terrasoft.WebApp.Nui.ViewModuleHelper.CreateModulesConfigScript(UserConnection userConnection, HttpResponse response)
at Terrasoft.WebApp.Nui.ViewModule.Page_Load(Object sender, EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

SessionID: k41gkhyvkbr0ex25um33kktk
Request URL: /1/Nui/ViewModule.aspx
Request Path: /1/Nui/ViewModule.aspx
"

Еще такая:

"
Exception Message: Код зависимых схем пуст или null
Exception Type: Terrasoft.Common.NullOrEmptyException
Exception Source: Terrasoft.Core

Exception Stack Trace:
at Terrasoft.Core.IncludeDependencySourcesManager.GetSchemaHash(Guid schemaUId, String cultureName)
at Terrasoft.Core.CoreClientUnitSchemaDecorator.GetClientUnitSchemaHash(ISchemaManagerItem item)
at Terrasoft.Core.CoreClientUnitSchemaDecorator.GetCommonSchemaHash(ISchemaManagerItem item)
at Terrasoft.Core.CoreClientUnitSchemaDecorator.GetClientUnitSchemaHash(ISchemaManagerItem item)
at Terrasoft.Core.CoreClientUnitSchemaDecorator.GetCommonSchemaHash(ISchemaManagerItem item)
at Terrasoft.Core.CoreClientUnitSchemaDecorator.GetClientUnitSchemaHash(ISchemaManagerItem item)
at Terrasoft.Core.CoreClientUnitSchemaDecorator.GetCommonSchemaHash(ISchemaManagerItem item)
at Terrasoft.Core.CoreClientUnitSchemaDecorator.GetClientUnitSchemaHash(ISchemaManagerItem item)
at Terrasoft.Core.CoreClientUnitSchemaDecorator.GetCommonSchemaHash(ISchemaManagerItem item)
at Terrasoft.Core.CoreClientUnitSchemaDecorator.GetSchemaPath(ISchemaManagerItem item)
at Terrasoft.Core.CoreClientUnitSchemaDecorator.GetSchemaDescriptor(ISchemaManagerItem item, String identifiersQuote)
at Terrasoft.Configuration.ConfigurationSectionHelper.CombineSchemaDescriptors(UserConnection userConnection)
at Terrasoft.Configuration.ConfigurationSectionHelper.GetClientUnitSchemaDescriptors(UserConnection userConnection)
at Terrasoft.Configuration.ConfigurationSectionHelper.GetConfigurationScript(UserConnection userConnection)
at Terrasoft.WebApp.Nui.ViewModuleHelper.CreateModulesConfigScript(UserConnection userConnection, HttpResponse response)
at Terrasoft.WebApp.Nui.ViewModule.Page_Load(Object sender, EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
"

Нравится

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

Добрый день!

После получения сообщения об ошибке в адресной строке браузера допишите:
https://адрес_сайта/1/workspaceexplorermodule.aspx ( где /1/* - номер рабочего пространства).
войдите в конфигурацию, создайте любую клиентскую схему, затем удалите её. После этого можете входить в новую конфигурацию.

Сергей, спасибо, помогло!

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

Айгуль, при компиляции не перегенерировались бандл-схемы. В последних версиях ошибка устранена.

Сергей, спасибо

Добрый день!
Возникла такая же ошибка (Код зависимых схем пуст или null)
Создание и удаление схемы в новой конфигурации не помогает.

В чем еще может быть дело?

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

Вероятно, вы создаете объект или что-то другое, необходимо создать модуль, затем сохранить его:
[IMG]http://s018.radikal.ru/i526/1604/69/56413664354b.jpg[/IMG]
[IMG]http://s017.radikal.ru/i430/1604/b2/54231bd5201b.jpg[/IMG]

Спасибо! Создание/удаление модуля решило проблему.

Следующее рабочее пространство успешно создалось при создании/удалении модуля перед выполнением "Компилировать все"

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

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

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

Версия 7.7.0.2325

Нравится

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

Добрый день!

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

Пример Вы сможете найти в хранимых процедурах FindAccountDuplicate(для контрагента) и FindContactDuplicate(для контакта)).

В случае возникновения дополнительных вопросов прошу обращаться на support@terrasoft.ru

Хотелось бы узнать, что нужно переопределить на клиентской части, что бы стандартный поиск дублей работал в разделе продукты.
Насколько я понял "главной" является схема DuplicatesPageV2, можно ли кратко описать принцип работы, чтобы я знал что искать. И есть ли еще схемы требующие переопределения? или достаточно будет разобраться с работой DuplicatesPageV2 и добавить то что необходимо для работы с разделом продукты.

Добрый день!

Переопределить схемы на клиентской части нельзя. Можно только создать новое правило поиска дублей. Это возможно сделать только через БД приложения. Схему DuplicatesPageV2 изменять не нужно.

Необходимо:
1. Добавить новую запись в таблицу DuplicatesRule с названием нового правила поиска дублей.
2. Добавить новую хранимую процедуру по аналогии с FindAccountDuplicate(для контрагента) или FindContactDuplicate(для контакта), в которых можно посмотреть пример реализации поиска дублей.

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

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

Версия 7.7.0.2325

Реализована пользовательская деталь с двумя справочными полями и редактируемым реестром.
Подскажите как можно реализовать фильтрацию одного справочного поля по значению другого.
С помощью BusinessRuleModule не получилось.

Нравится

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

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

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

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

Не срабатывают бизнес правила (делал по примеру из академии), попробовал добавить фильтрацию справочного поля по аналогии с примером из академии:

attributes: {
"UsrProductParamValue": {
	dataValueType: Terrasoft.DataValueType.LOOKUP,
	lookupListConfig: {
		filters: [
			function() {
				debugger
				var filterGroup = Ext.create("Terrasoft.FilterGroup");
 
				return filterGroup;
			}
		]
	}
}
}				

но при открытии поля, debugger не срабатывает, т.е. функция не вызывается и ошибок нет. Бизнес правило тоже не срабатывает, выводиться вся таблица.

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

"Щиголь Максим" написал:

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

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

Посмотрите эту тему, там подобную задачу решили.
http://www.community.terrasoft.ru/forum/topic/13684

Илья спасибо. Проблема решилась добавлением страницы редактирование и созданием бизнес правила в ней.

Есть еще момент, на детали при повторном создание нового значения по полю UsrProductParamValue, через функционал быстрого создания(в поле вводиться значение и если его нет появляется "Создать ..."), возникает ошибка в функции SectionBundleModule.tryCreateEntityOrOpenCard
...
valuePairs.add(columnPath, {columnPath: columnPath, columnValue: columnValue});
Текст ошибки: Элемент с ключём "UsrProductParam" Уже существует.
Если обновить страницу и повторить действия то значение добавляется без ошибок, но если выбрать другую запись и попытаться добавить новое значение UsrProductParamValue, то возникает ошибка.

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

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

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

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

Подписаться на данное событие невозможно. Данная логика описана в миксине LookupQuickAddMixin. В данном случае событие можно поймать в методе onLookupChange. Привязка данного метода к лукапному полю происходит в модуле ViewGeneratorV2, от которого наследуется ConfigurationGridGenerator, который в свою очередь и строит грид детали. Вы можете создать свой генератор по аналогии с ConfigurationGridGenerator где и заместить данный метод, в котором бросать событие, используя sandbox. Так же можно напрямую заместить LookupQuickAddMixin, переопределив нужный метод.

Илья, подскажите что вы подразумевали под "Как вариант, Вы можете обновлять грид детали после каждого добавления записи в справочник."?
После сохранения записи обновляю деталь:

activeRowSaved: function(row, callback, scope) {
	scope = scope || this;
	callback = callback || this.Terrasoft.emptyFn;
	callback.call(scope);
	debugger;
	this.updateDetail({
		reloadAll: true
	});
}

Но проблема повторяется, подскажите как нужно обновлять грид?

Также попробовал заместить LookupQuickAddMixin: создал замечающий клиентский модуль, указал LookupQuickAddMixin и скопировал код из LookupQuickAddMixin в замещающий модуль. Но после этого перестал работать функционал быстрого добавления, подскажите как правильно заместить LookupQuickAddMixin.

Для замещения LookupQuickAddMixin, необходимо создать новый миксин, унаследовавшись от LookupQuickAddMixin. Примеров такого замещения достаточно в конфигурации, к примеру, CtiPanelCommunicationHistoryUtilities. Затем добавляете созданный миксин в нужное Вам место. Добившись вызова методов созданного миксина, достаточно будет установить дополнительную проверку перед вызовом строки valuePairs.add(columnPath, {columnPath: columnPath, columnValue: columnValue}); Данная строка и выдает ошибку.

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

Да, вы правильно поняли по поводу замещения миксинов. Как вариант, можете посмотреть в сторону ConfigurationGridGenerator и разобраться как он генерирует лукапы. Далее попробовать подменить методы. Данная задача будет не из простых. Так же посмотрите в сторону метода generateActiveRowControlsConfig из ConfigurationGridUtilites. Ошибка возникает после вызова строки:
BusinessRulesApplier.applyRules(rowClass, gridLayoutItems);

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

В разделе "Заказ" добавил новую деталь "Адреса доставки", в ней добавил поле-справочник "Адрес контакта". Нужно сделать фильтрацию этого поля, чтоб отображались только те адреса которые есть на детале "Адреса контакта". Этот контакт указан в поле "Клиент"(контакт) в карточке "Заказы".
Заранее спасибо

Нравится

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

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

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

Вот пример кода который я раньше написал:
rules: {
"Car": {
"FiltrationInvoiceByAccount": {
"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
"autocomplete": true,
"baseAttributePatch": "UsrAutoContact",
"comparisonType": Terrasoft.ComparisonType.EQUAL,
"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
"attribute": "Contact"
}
}
но здесь два поля на одной карточке, а мне нужно что то вроде "attribute": "Order.Contact"

Здравствуйте, Виталий Владимирович!

Предоставьте полный листинг страницы раздела и страницы детали для анализа.

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

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

В Террасофте 3.5.1 Грид Напоминаний сворачиваются в системный Трей.
Каким образом можно сделать, чтобы при напоминании разворачивался сам Грид Напоминаний, а не маленькое окошко из системного трея о напоминаниях.

Нравится

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

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

Для того, чтобы появлялось сразу окно напоминания, необходимо в сервисе scr_Main найти функцию UpdateRemindingNotification и закомментировать код, после чего в начало функции написать новый код:
var RemindingsForm = GetSingleItemByCode(Main.RemindingsWindowUSI);
RemindingsForm.Show();
У Вас должна получиться такая функция:

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

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

Нравится

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

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

Для решения подобной задачи Вам необходимо создать таблицу развязки и добавить в схему пользовательский фильтр (бизнес-правило).
Пример Вы можете посмотреть в базовом функционале - деталь «Команда» (раздел «Продажи»).

Также прикрепляю файл с примерным алгоритмом реализации.
ispolzovaniebazovyhshemdetaleysreestromsosvyazyuodinkomnogimmnogiekomnogim.doc

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

Добрый день
В карточке КЕ я создала новую Деталь (наз-ся учет выдачи КЕ). Подскажите, пожалуйста, как для этой детали добавить деталь Файлы и ссылки? В инструкции написано, как Файлы и ссылки добавлять для раздела, а мне нужно - для детали раздела. Я создала объект "Файлы и ссылки для детали учет выдачи КЕ", а дальше что делать?

Нравится

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

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

Как устроена деталь "Файлы и ссылки" для обычного раздела я изучила. Я не пойму, как зарегистрировать эту деталь в моей детали, если в инструкции указано только для разделов:

2. Регистрация детали [Файлы и ссылки] в разделе:
1. Перейдите в раздел [Рабочие места].
2. Выберите необходимый раздел и перейдите на деталь [Детали].
3. В меню кнопки [Добавить] выберите пункт [Новую деталь].
4. В открывшейся карточке заполните параметры регистрации детали. После
сохранения карточки укажите связи с разделом на детали [Связь с разделом].

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

Мне будет неудобно с деталью второго уровня. Т.е. делать либо так, либо делать новый раздел и связанную деталь в разделе КЕ?

Это зависит от того, что Вы в итоге хотите получить.
Можно и новый раздел «Учёт выдачи КЕ» со своими деталями. Аналогично, скажем, активностям по контакту.

Мне нужна новая деталь к разделе КЕ, чтобы в этой новой детали была деталь "Файлы и ссылки". Как я понимаю, чтобы была именно деталь "Файлы и ссылки" - лучше сделать новый раздел «Учёт выдачи КЕ» с деталью "Файлы и ссылки" (по инструкции), затем сделать связанную деталь "Учёт выдачи КЕ" в разделе КЕ. Правильно?

Можете и так.

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