Добрый день!

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

Нравится

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

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

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

К сожалению, не помогло.

Выявила еще одну проблему.
Добавила новый кейс. Для стадий "Отказ от сотрудничества", "Мелкая партия" в справочнике стадии лида установила значение завершающих стадий. Пример в приложении.
Наблюдаю такую ситуацию, что при переходе на эти стадии , индикатор стадий отображается неверно. Приложение 2.

Не могу понять в чем может быть ошибка.

В продаже так же не все стадии отображаются на индикаторе стадий. Они просто не умещаются.

Сдается мне, что все сгруппированные кейсы будут принимать тот цвет, что установлен у первого в группе. В Вашем случае первый в группе "зеленый"
[color=green]"Потребность отсутствует"[/color] + [color=red]"Отказ от сотрудничества"[/color] + [color=red]"Мелкая партия"[/color] + [color=red]"Дисквалифицирован"[/color]

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

Надо эту гипотезу проверить. Если она верна - то это очевидный дефект.

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

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

Вариант с цветом стадии не сработал. Все точно так же.

Есть ли какое-то граничение на количество стадий в индикаторе? У меня сейчас их 8. На странице редактирования часть стадий не отображается.(не умещаются).

Светлана, здравствуйте.

Это известная проблема коробочной версии 7.10, при большом количестве стадий они отображаются неверно, в 7.11 исправлена.

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

Добрый день!

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

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

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

Нравится

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

Отключите процессы управление Лидом и старта корп. продаж в Системнноых настройках UseProcessLeadManagement и StartOppBusinessProcess.

http://prntscr.com/fmbfwb

Спасибо за помощь!

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

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

Нравится

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

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

prosteysheemodalnoeoknomodalbox.doc
В примере из вложения: страница модального окна это «Схема модели представления карточки», без указания родительской схемы.
Модуль модального окна это «Модуль», с одной единственной зависимостью на вышесозданную страницу. Все из этого ни от кого не наследуется.

Максим Шевченко, здравствуйте, использовал ваш пример из вложения, он выдает ошибку при загрузке самого окна:

ConfigurationBootstrap.js:21948 Uncaught TypeError: Cannot read property 'entitySchemaName' of undefined

    at i.<anonymous> (ConfigurationBootstrap.js:21948)

    at all-combined.js:477

    at Object.execCb (require.js:1693)

    at Module.check (require.js:881)

    at Module.<anonymous> (require.js:1136)

    at require.js:134

    at require.js:1186

    at each (require.js:59)

    at Module.emit (require.js:1185)

    at Module.check (require.js:936)

(anonymous) @ ConfigurationBootstrap.js:21948

(anonymous) @ all-combined.js:477

execCb @ require.js:1693

check @ require.js:881

(anonymous) @ require.js:1136

(anonymous) @ require.js:134

(anonymous) @ require.js:1186

each @ require.js:59

emit @ require.js:1185

check @ require.js:936

enable @ require.js:1173

init @ require.js:786

callGetModule @ require.js:1200

completeLoad @ require.js:1608

onScriptLoad @ require.js:1714

core.js:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647

 file: http://localhost:82/0/Nui/ViewModule.aspx

 line: 3

 column: 1

 message: Uncaught SyntaxError: Unexpected token < 

 date: Thu Sep 07 2017 11:04:28 GMT+0300 (RTZ 2 (зима))

 stack: SyntaxError: Unexpected token <

writeErrorMessage @ core.js:579

(anonymous) @ core.js:740

execCb @ require.js:1693

check @ require.js:881

enable @ require.js:1173

init @ require.js:786

(anonymous) @ require.js:1457

setTimeout (async)

(anonymous) @ require.js:1812

localRequire @ require.js:1446

errorHandler @ core.js:716

core.js:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647

 file: http://localhost:82/0/configuration/04a28bb938a0652641f26936a1b20234/Co…

 line: 21948

 column: 57

 message: Uncaught TypeError: Cannot read property 'entitySchemaName' of undefined 

 date: Thu Sep 07 2017 11:04:28 GMT+0300 (RTZ 2 (зима))

 stack: TypeError: Cannot read property 'entitySchemaName' of undefined

    at i.<anonymous> (http://localhost:82/0/configuration/04a28bb938a0652641f26936a1b20234/Co…)

    at http://localhost:82/core/9081d8eb154840ddc3ec408c11264ff4/combined/all-…

    at Object.execCb (http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…)

    at Module.check (http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…)

    at Module.<anonymous> (http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…)

    at http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…

    at http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…

    at each (http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…)

    at Module.emit (http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…)

    at Module.check (http://localhost:82/core/c3a883e5c39cffb863b2f781f396c705/requirejs/req…)

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

Всем привет!

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

С уважением.

Нравится

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

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

1. Создаете атрибут на странице с названием вроде "ПереходНаТакуюТоСтадиюРазрешен": ложь
2. Создаете атрибут на странице с названием вроде "АсинхроннаяПроверкаВыполнена": ложь
3. Замещаете метод save: , в нем проверяеете какую сейчас выбрали стадию, если ту что требует проверок, и атрибут АсинхроннаяПроверкаВыполнена = ложь, то проверка не выполнена, запускаете метод проверки (4).
4. Пишите метод проверки который проверяет нужные вам условия, и в результате выполнения устанавливаете ПереходНаТакуюТоСтадиюРазрешен согласно ваших проверок, а АсинхроннаяПроверкаВыполнена в истину. В этом же методе вызываете снова метод save();
5. Метод сейв дописываете так, что если АсинхроннаяПроверкаВыполнена = истина, а ПереходНаТакуюТоСтадиюРазрешен = ложь, то выводите пользователю сообщение что сохранение запрещено потому что потому... А если АсинхроннаяПроверкаВыполнена = истина, а ПереходНаТакуюТоСтадиюРазрешен = истина, то, вызываете родительскую реализацию через this.callParent(arguments).

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

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

1. Создаете атрибут на странице с названием вроде "ПереходНаТакуюТоСтадиюРазрешен": ложь
2. Создаете атрибут на странице с названием вроде "АсинхроннаяПроверкаВыполнена": ложь
3. Замещаете метод save: , в нем проверяеете какую сейчас выбрали стадию, если ту что требует проверок, и атрибут АсинхроннаяПроверкаВыполнена = ложь, то проверка не выполнена, запускаете метод проверки (4).
4. Пишите метод проверки который проверяет нужные вам условия, и в результате выполнения устанавливаете ПереходНаТакуюТоСтадиюРазрешен согласно ваших проверок, а АсинхроннаяПроверкаВыполнена в истину. В этом же методе вызываете снова метод save();
5. Метод сейв дописываете так, что если АсинхроннаяПроверкаВыполнена = истина, а ПереходНаТакуюТоСтадиюРазрешен = ложь, то выводите пользователю сообщение что сохранение запрещено потому что потому... А если АсинхроннаяПроверкаВыполнена = истина, а ПереходНаТакуюТоСтадиюРазрешен = истина, то, вызываете родительскую реализацию через this.callParent(arguments).

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

Есть вариант с "безотканой" проверкой,
[color=green]Соответственно данный подход работает именно при клике юзера по "колбасе", если стадии будут двигаться бизнес-процессами этот вариант не подойдет[/color]
Вам необходимо будет расширять/перекрывать методы класса BaseStageControl (схема BaseStageControl как ни странно :))
В частности его метода onStageItemMenuClick
Куда вы можете внедрить вызов любых необходимых Вам проверок, и соответственно прервать или "отпустить" выполнение дальнейшей логики по смене стадии.

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

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

В примерах из документации для версии 7.10 для при создании схемы представления детали с полями в качестве базового объекта нужно указать Base fields detail ( BaseFinance ). Какой объект должен быть указан базовым в версии 7.9.1.3284?

Нравится

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

Вообще пользуйтесь мастерами деталей для создания детали, это намного проще.
https://academy.terrasoft.ru/documents/marketing/7-8/master-detaley
Для того что бы создать деталь мастером детали, предварительно нужно только в конфигурации создать объект на основании "base object".
Мастер создаст и схему детали, и схему страницы детали самостоятельно, а в созданных схемах уже и посмотрите от кого они наследуются.

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

"Максим Шевченко" написал:

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


Большое спасибо за подсказку!

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

По клику на гиперссылку в справочном поле вылетает ошибка entitySchemaName of undefined,
хотя если в ту же карточку зайти из раздела то она открывается корректно.
С чем это может быть связано?
При попытке дебага было выявлено в метод build в configurationBotstrap неверно передается один из элементов config, в котором собственно schemaName нужной мне карточки является undefined.

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

Нравится

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

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

"Алла Савельева" написал:

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

Life is better than you think :-)


Делали и не раз, безуспешно.

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

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

"Франчук Виталий" написал:

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


А можно поподробнее? Не совсем понятно как вы исходный код (к контексте приложения это же с# схема) меняли.

Михаил, добрый день!

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

"Мотков Илья" написал:

Михаил, добрый день!

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


Так как я пытался из Лида перейти, в урле был LeadPageV2, но я предполагал что он просто не менялся.
Момент ещё такой что мы по SVN переносили все работы над проектом. И у нас как разработчиков самая актуальная версия и на боевом соответственно, но у нас те схемы работают исправно, а на боевом проблемы.

"Кисловский Михаил Андреевич" написал:
Франчук Виталий пишет:

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

А можно поподробнее? Не совсем понятно как вы исходный код (к контексте приложения это же с# схема) меняли.


Прикрепил картинку. Ошибка устранилася добавлением подчеркнутого на картинке параметра. Это со схемы раздела

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

Добрый вечер.
Каким образом передавать параметры из БП в преднастроенную страницу? Требуется передавать, как значение справочника, так и какие-то текстовые/логические данные.
Видео, на которое постоянно ссылаются (https://community.terrasoft.ru/img/video/lms/28/story.html) по-моему уже не является актуальным. По-крайней мере я, повторив все шаги, результата не получил. Есть ли ещё материал, тема на форуме (не нашёл) с более подробным рассмотрением данного вопроса?

Нравится

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

Добрый день!

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

Также рекомендую ознакомиться с следующей темой http://www.community.terrasoft.ru/forum/topic/25237

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

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

Нравится

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

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

Нравится

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

Если сервер API предоставляет специализированные заголовки CORS то в Вашем распоряжении вся мощь JavaScript в клиентской схеме, делайте запросы (н/п используя инструментарий используемой библиотеки Ext.JS AJAX), обрабатывайте ответы - устанавливайте атрибуты для заполнения полей и т.д.

Если сервер API не предоставляет специализированные заголовки CORS то в данном случае Вам придется писать код C# (Здесь я сильно не подскажу что да как, веб-сервис что-то там такое есть)
После чего можете например по websocket протоколу пробросить события с данными в клиентские карточки (как это сделать обсуждалось вот здесь)

"Севостьянов Илья Сергеевич" написал:Если сервер API не предоставляет специализированные заголовки CORS то в данном случае Вам придется писать код C#

Из js вызываете сервис. В сервисе обычные post/get запросы с помощь System.Web. Получаете ответ от сервера, делаете return, в js-коллбеке проходит ответ в json-строке. Сериализуете, обрабатываете далее как угодно

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

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

Возник простейший, но очень важный вопрос.

Я создал деталь (от FileDetailV2) и добавил в нее новый Grid путем объявления в diff. Эта часть сработала корректно. Новый грид называется Datagrid1.

Теперь хочу добавить в этот грид индикаторы сортировки. Но не понял, как мне попасть в скоп моего нового грида и оттуда вызвать этот метод addSortColumnIndicator? Отсюда два вопроса, как корректно вызвать этот метод и как его переопределить(например) для данного грида?

Нравится

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

1) Можно заглянуть в метод sortColumn. Вот описание сортировки в типичном гриде:

"sortColumn": {"bindTo": "sortColumn"},
"sortColumnDirection": {"bindTo": "GridSortDirection"},
"sortColumnIndex": {"bindTo": "SortColumnIndex"},

"Шумков Виталий" написал:переопределить(например) для данного грида?

2) Если метод из GridUtils, то можно прям в схеме детали переопределять метод (скопировать код и изменить или callParent-ом вызвать родителя)

"sortColumn": {"bindTo": "sortColumn"},
"sortColumnDirection": {"bindTo": "GridSortDirection"},
"sortColumnIndex": {"bindTo": "SortColumnIndex"},

Насколько я понимаю, это свойства, а мне нежно вызвать метод.
Метод принадлежит самому гриду
https://academy.terrasoft.ru/jscoresdk/#!/api/Terrasoft.controls.Grid

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

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

...
sortColumnIndex: {
changeEvent: "sortColumn",
changeMethod: "setSortColumnIndex"
},
...

Следовательно если вы привяжите как указано выше:
"sortColumnIndex": {"bindTo": "SortColumnIndex"},

то установке и изменении этого самого атрибута SortColumnIndex вызовется метод базового грида
setSortColumnIndex а он вызовет метод updateSortColumn а он в свою очередь вызовет addSortColumnIndicator вот ответ на ваш первый вопрос, как вызвать этот addSortColumnIndicator,

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

Спасибо, за ответ!

много чего попробовал, но ничего не подходит.

Сейчас код детали такой
new_3.txt

При изменении SortColumnIndex ничего не происходит. Может в коде что-то не так.

Также заметил, что при инициализации грида вызывается из GridUtilitiesV2 метод

initSortActionItems: function() {
				var collection = this.Ext.create("Terrasoft.BaseViewModelCollection");
				var gridColumns = this.mixins.GridUtilities.getProfileColumns.call(this);
				this.Terrasoft.each(gridColumns, function(column, columnName) {
					collection.addItem(this.getButtonMenuItem({
						Caption: {bindTo: this.name + columnName + "_SortedColumnCaption"},
						Tag: columnName,
						Click: {bindTo: "sortGrid"}
					}));
				}, this);
				this.set("SortColumns", collection);
				this.updateSortColumnsCaptions(this.get("Profile"));
			},

this.updateSortColumnsCaptions(this.get("Profile"));

но this.get("Profile") возвращает пустой DataGrid. Может в этом загвоздка? Как думаете?

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

Пробовал =)

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

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