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

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

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

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

Нравится

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

"Zaitova Liubov" написал:и вроде как условия по наличию/отсутствию кавычек и равенстве прописных и строчных букв там в условии не задать

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

"Zaitova Liubov" написал:и вроде как условия по наличию/отсутствию кавычек и равенстве прописных и строчных букв там в условии не задать

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

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

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

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

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

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


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

"Zaitova Liubov" написал:Вы хотите реализовать - это LIKE запрос по текстовому полю в таблице, в которой теоретически может быть и сто тысяч записей, и миллион.

а если делать как советовал Владимир Соколов:" Сохраняйте для всех контрагентов в скрытом поле имя, по которому искать, убирая кавычки, приводя к UPPER, убирая всякие возможные части текста типа А/O, OOO и другие.". то это уже будет equal, а не like и должно быть быстрее. все равно getEntityCollection не справится достаточно быстро? и еще вопрос - это вообще реализуемо, что можно дождаться его ответа и по результату дать/не дать сохранить?

Теоретически можно сделать что-угодно.)

Как заместить логику сохранения обсуждали буквально недавно: http://www.community.terrasoft.ru/forum/topic/25618
Можете аналогично переопределить метод save, и, допустим, строить запрос вида:
SELECT COUNT(*) FROM Account WHERE NAME = 'MyName', и если COUNT = 0 - сохранять запись, вызывая callParent. Однако, в таком случае Name в Контрагенте должен быть также без ООО, кавычек и прочего.

"Zaitova Liubov" написал:то это уже будет equal, а не like и должно быть быстрее

Боюсь, что для такой задачи даже Like недостаточно, нужно учиться у Google распознавать схожие записи, например "Аксиома" и "Аксиомаа"

"Мотков Илья" написал:Можете аналогично переопределить метод save

А может, лучше на Validation повесить?

"Владимир Соколов" написал:А может, лучше на Validation повесить?

Если можно логику выполнить синхронно то да, иначе:
http://www.community.terrasoft.ua/forum/topic/25618#comment-69035

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

Добрый день!

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

Нравится

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 комментария

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

Нравится

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