Добрый день.

Есть задача добавлять в продукт сопряженные продукты (нечто вроде матрицы). При этом есть требование, чтобы при добавлении сопряженных продуктов были доступны все способы фильтрации и поиска - как в разделе Продукты (в том числе, Группы и Каталог). В связи с этим было принято решение создать страницу CrossProductSectionV2, унаследованную от ProductSectionV2. Эта страница открывается при нажатии нужной копки на странице ProductPageV2. Пробовали два подхода к открытию, но оба сопряжены с определенными проблемами. 

1. Через this.sandbox.loadModule

			addProductsExtended: function() {
				/// <summary>Открывает раздел продуктов для выбора и добавления в матрицу.</summary>
				var parameters = {
					viewModelConfig: {
						NrbBaseProduct: this.getBaseProduct()
					}
				};
 
				var instanceConfig = {
					schemaName: "CrossProductSectionV2",
				    isSchemaConfigInitialized: true,
				    entitySchemaName: "Product",
				    useHistoryState: true,
				    isSeparateMode: true,
				    isInChain: true
				};
				var config = {
					renderTo: "centerPanel",
				    id: this.getCrossProductSectionModuleId(),
				    instanceConfig: instanceConfig,
				    parameters: parameters,
				    keepAlive: true
				};
 
				this.sandbox.loadModule("SectionModuleV2", config); 
 
			},
 
			getCrossProductSectionModuleId: function() {
				/// <summary>Формирует идентификатор модуля для добавления продуктов в матрицу.</summary>
				return this.sandbox.id + "_CrossProductSectionV2";
			},
 
			getBaseProduct: function() {
				/// <summary>Вовзращает идентиификатор базового продукта для матрицы.</summary>
				var value = this.get("Id") || this.get("PrimaryColumnValue");
				var displayValue = this.get(this.primaryDisplayColumnName);
				var baseProduct = {
					value: value,
					displayValue: displayValue
				};
				return baseProduct;
			}

В это случае инициализация базового продукта NrbBaseProduct (к которому привязываем сопряженные) в CrossProductSection происходит без проблем. Но есть ряд проблем с отображением и последующей выгрузкой модуля CrossProductSection.

Немного некорректно отображается содержимое GridUtilsContainer (съедена верхняя часть), также показан какой-то toggle при нажатии на который - чистый лист (хеш при этом сменяется на что-то невразумительное - без имени страницы ProductPageV2)

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

 

 

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

 

Ровно то же самое происходит и при нажатии кнопки Закрыть - разве что toggle также исчезает

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

На кнопку Закрыть в CrossProductSectionV2 повешен простой обработчик

			onCloseButtonCustomClick: function() {
				/// <summary>Обработчки нажатия на кнопку Закрыть.</summary>
 
				this.sandbox.publish("BackHistoryState");
			},

 

2. Другой способ открытия - через PushHistoryState

			addProductsExtended: function() {
				/// <summary>Открывает раздел продуктов для выбора и добавления в матрицу.</summary>
				var parameters = {
					viewModelConfig: {
						NrbBaseProduct: this.getBaseProduct()
					}
				};
				var stateObj;
				var requestUrl;
		  		var params = this.sandbox.publish("GetHistoryState");
				stateObj = {
					schemaName: "CrossProductSectionV2",
				    isSchemaConfigInitialized: true,
				    entitySchemaName: "Product",
				    useHistoryState: true,
				    isSeparateMode: true,
				    isInChain: true,
				    parameters: parameters,
				    id: this.getCrossProductSectionModuleId()
				};
				requestUrl = "SectionModuleV2/CrossProductSectionV2";
 
				this.sandbox.publish("PushHistoryState", {
					hash: requestUrl,
					stateObj: stateObj
				});
			},

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

Также Закрытие, в случае если, открывались и закрывались Группы и/или Расширенная фильтрация произойдет только после n-го нажатия на кнопку Закрыть, где n - число раз когда открывали Группы или Расширенную фильтрацию.

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

Нравится

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

Что в это время отображается в консоли и на панели Network? Все запросы корректны? Ошибок никаких нет?

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

Можно ещё третий подход: сделать в разделе продуктов действие «Сопрячь» с выбором нескольких записей. Выбираете два продукта, пользуясь группами, каталогом и прочим, затем запускаете действие, а оно создаёт запись в объекте детали связи многих ко многим одного продукта с другим.

Александр, спасибо за ответ. Эту задачу на текущий момент решили способом 2, устранив вот этот момент

Также Закрытие, в случае если, открывались и закрывались Группы и/или Расширенная фильтрация произойдет только после n-го нажатия на кнопку Закрыть, где n - число раз когда открывали Группы или Расширенную фильтрацию.

Устранили путем переопределения пары методов на пустые

			removeCardHistoryState: Terrasoft.emptyFn,
 
			setInitialHistoryState: Terrasoft.emptyFn,

Но дальше  - больше. Теперь хотят, чтобы во всех местах, где есть lookup поля Продукт - была возможность поиска по группам и Каталогу. А если пойти еще далее, то, пожалуй, во всех справочниках, по которым в системе зарегистрирован раздел, чтобы была возможность отображать группы с возможностью управления через lookupListConfig - по аналогии с действиями, которые можно скрыть, указав hideActions: true. Но это уже, пожалуй, идея для будущих улучшений продукта.

Орленко Андрей Николаевич пишет:

Теперь хотят, чтобы во всех местах, где есть lookup поля Продукт - была возможность поиска по группам и Каталогу. А если пойти еще далее, то, пожалуй, во всех справочниках, по которым в системе зарегистрирован раздел, чтобы была возможность отображать группы с возможностью управления через lookupListConfig - по аналогии с действиями, которые можно скрыть, указав hideActions: true. Но это уже, пожалуй, идея для будущих улучшений продукта.

В таком случае стоит завести на этом сайте идею. Просмотрел существующие, вроде бы никто такого не предлагал. 

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

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

пробовала так

subscribe:function(){

//функция

}

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

Нравится

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

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

Нравится

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

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

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

Можно использовать 2 стартовых сигнала, далее заданием-сценарием(scripttask) вносить необходимые изменения(используя substring, например - https://msdn.microsoft.com/en-us/library/aka44szs(v=vs.110).aspx). 

Можно так же добавить ещё одну деталь в которую будут вноситься изменения базовым элементом "добавить данные".

 

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

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

Нравится

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

Иван, здравствуйте!

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

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

Либо вариант, сделать действие "Чек-ин" обязательное (делается через справочник "Правила полевых продаж" - http://prntscr.com/jjhv8n.

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

 

День добрый!

На странице редактирования при переходе на вкладку не отображается деталь. Данная проблема происходит примерно в 1 из 5 случаев. Чтобы деталь отразилась на странице необходимо перезагрузить страницу с очисткой кэша.

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

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

Нравится

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

"мы террасофт и мы решили хранить ресурсы на hdd сервера" - вот где проблема :)  

1) Проверьте папку #папка_с_bpm#\Terrasoft.WebApp\conf\content. Поищите там файл ITProductReportDetailResources.js. 

2) Проверьте права на папку conf (должны стоять полные права IIS-юзеру)

3) Если нет файла/прав, то действительно надо перегенерировать и скомпилировать конфигурацию.

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

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

Где-то это можно сделать? Вместо "Новая запись" добавить свой текст. Менять нужно в параметрах элемента, или на самой странице?

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

Версия 7.11.

Нравится

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

Обычно название можно менять в разделе «Перевод». Главное не перепутать и изменить именно нужное место с этим текстом.

Но для преднастроенной, насколько понял, заголовок можно менять в её дизайнере

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

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

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

Проблема возникает с миникарточкой. Когда работник пытаюсь завершить Активность из мини-карточки, у нее ответственный подставляется ответственным из объекта, к которому Активность привязана, например, Контакт.

Есть несложный способ побороть это? Или надо городить свою мини-карточку, обработку Ответственного и т.д.?

Нравится

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

Добрый день.

При нажатии на «Завершить задачу» в мини карточке активности «ActivityMiniPage» вызывается метод «onChangeStatusButtonClick». Можете его заместить и добавить свою логику.

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

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

Базовая цена, плюс скидки:

За объём +3%

За удалённость +1%

За самовывоз +10% и т.д.

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

Нравится

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

Вы хотите эти скидки делать на уровне продукта в счёте или на уровне счёта?

Хороший вопрос... Нет, наверное на уровне в счёте лучше!

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

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

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

Пробую реализовать пример из обсуждения:

https://community.terrasoft.ru/questions/ctenie-dannyh-rezultiruusaa-ko…

Получаю ошибку на этапе скрипт-таска

System.NullReferenceException: Object reference not set to an instance of an object.
   at Terrasoft.Core.Process.UsrCollectionOfSmthMethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

 В процессе чтение данных, скрипт-таск, автогенерируемая страница. Читаем контакты, созданные за месяц, пытаемся их записать в параметр, чтобы показать на странице.

Подскажите, в какую сторону идти и что править.

Нравится

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

Добрый день.

Скорее всего вы неправильно читаете данные.

Код который работает:

EntityCollection entities = Get&lt;EntityCollection&gt;("ReadDataUserTask1.ResultEntityCollection");
Set("Param1", entities);

Параметр "Param1" имеет тип - "Коллекция объектов (EntityCollection)".

ReadDataUserTask1 - имя элемента (выберите элемент – расширенный режим (три точки вверху справа) - имя)

Проверьте настройку «Для интерпретируемого процесса», в элементе ScriptTask зайти в «Расширенный режим» (три точки вверху) – должна быть включена.

VladKapitanchyk,

А как в вашем случае использовать результирующую коллекцию?

Пытаюсь получить список записей по условию, чтобы записать их в Notes или в тело письма.

ZAN,

EntityCollection это класс, который наследуется от LinkedList<Entity> (базовый C# класс), поэтому содержит базовые методы для работы с коллекцией. https://msdn.microsoft.com/en-us/library/kb834fyk(v=vs.110).aspx

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

Всем доброго времени суток. Версия 7.11.

При выполнении элементов бизнес-процессов "Открытие страницы редактирования" и "Вопрос пользователю" в системе создаются технические активности. По ним удобно отслеживать движение по процессу и отправлять уведомления (главная задача).

Вопрос - можно ли как-то отследить аналогичным образом элементы "Автогенерируемая" и "Преднастроенная страница"? Ведь эти страницы имеют GUID, должны где-то сохраняться..

Нравится

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

Дмитрий, добрый вечер!



Активности типа "Автогенерируемая страница" и "Преднастроеная страница" хранятся в 2 таблицах: SysProcessData и  SysProcessLog. В первой таблице они сохраняются пока находятся в работе, во второй они сохраняются всё время.

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