Технические вопросы
7.x

Здравствуйте. Делаю фильтр по контакту. Нужно что бы отображались контакты, у которых у контрагента определенный тип. Ниже кидаю кусок attributes. Нашел как сделать, но проблема с построением пути к колонке. Подскажите как правильно путь прописать. В таблице Account есть поле TypeId, по нему и нужно фильтровать контакты. В таблице Contact поле AccountId, это типа связь с account. Как я не пробовал, а в консоле когда открываю словарь "Элемент коллекции с именем TypeId не найден".

attributes: {
                "UsrDriver": {
                    dataValueType: Terrasoft.DataValueType.LOOKUP,
                    lookupListConfig: {
                        filters: [
                            function () {
                                var filterGroup = Ext.create("Terrasoft.FilterGroup");
                                filterGroup.add("IsActive",
                                Terrasoft.createColumnFilterWithParameter(
                                Terrasoft.ComparisonType.EQUAL,
                                "Account.TypeId", - (вот на это ругается)
                                 "57412fad-53e6-df11-971b-001d60e938c6"));
                                return filterGroup;
                            }
                        ]
                    }
                }
            }

Нравится

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

без суффикса Id

"UsrDriver": {
	dataValueType: Terrasoft.DataValueType.LOOKUP,
	lookupListConfig: {
		filters: [
			function () {
				var filterGroup = Ext.create("Terrasoft.FilterGroup");
				filterGroup.add("IsActive",
				Terrasoft.createColumnFilterWithParameter(
					Terrasoft.ComparisonType.EQUAL,
					"Account.Type",
					"57412fad-53e6-df11-971b-001d60e938c6"));
				return filterGroup;
			}
		]
	}
},

Так же более предпочтительный вариант, использовать бизнес-правила для этой задачи:
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/AddBusines…

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

без суффикса Id

"UsrDriver": {

        dataValueType: Terrasoft.DataValueType.LOOKUP,

        lookupListConfig: {

                filters: [

                        function () {

                                var filterGroup = Ext.create("Terrasoft.FilterGroup");

                                filterGroup.add("IsActive",

                                Terrasoft.createColumnFilterWithParameter(

                                        Terrasoft.ComparisonType.EQUAL,

                                        "Account.Type",

                                        "57412fad-53e6-df11-971b-001d60e938c6"));

                                return filterGroup;

                        }

                ]

        }

},

Так же более предпочтительный вариант, использовать бизнес-правила для этой задачи:

http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/AddBusiness...


Целый день промучился, а знал что истина где то рядом. Спасибо большое.

Показать все комментарии
Технические вопросы
7.x

Здравствуйте. Создал бизнес-процесс при автоматическом создании страницы при поступившем сигнале. Однако, возникла вот такая проблема ID страницы не формируется и в итоге она не отображается. Подскажите в чём может быть проблема?

Нравится

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

Добрый день!

Такое поведение встречается, когда страница редактирования раздела написана некорректно.
Если в разделе несколько страниц редактирования, при создании записи в бизнес-процессе необходимо в элементе “Добавить данные” указывать тип записи (по которой будет определена страница редактирования).

"Зарицкий Олег Васильевич" написал:

Добрый день!

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

Если в разделе несколько страниц редактирования, при создании записи в бизнес-процессе необходимо в элементе “Добавить данные” указывать тип записи (по которой будет определена страница редактирования).

Здравствуйте. Т.е. мне нужно добавить в результат выборки тот самый раздел, который буду создавать и ID=начальному сигналу?

Добрый день!

В случае с несколькими страницами редактирования. Предположим, что в разделе Контакты – 2 станицы редактирования в зависимости от типа. Одна страница для контактов с типом “клиент”, вторая для “сотрудник”. Если стоит задача добавить запись в раздел контакты с помощью бизнес-процесса, в элементе “Добавить данные” необходимо указать объект – “Контакт” и обязательно заполнить поле “Тип” (клиент или сотрудник). Если этого не сделать в консоли будет сообщение вида “Cannot read EntitySchemaName”
По скриншотам трудно определить источник проблемы, необходимо дебажить.

Показать все комментарии
лиды
поиск дублей
Технические вопросы
7.x

подскажите, как повторить функционал поиска дублей, но для Лидов. Версия 7.5

Нравится

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

Добрый день!
Лид в bpm'online - потребность клиента. Для одного и того же контакта/контрагента может быть несколько одинаковых лидов(потребностей) в разные промежутки времени. В случае поиска дублей лидов все эти потребности объединятся, что является логически некорректным.

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

предусмотрено ведение различных задач по различным продуктам для одного лида. поиск дублей должен производится по детали «Средства связи» (по полям, содержащим телефон, а также по полю «E-mail»).

Валентин, добрый день!

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

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

Наталья, спасибо за информацию. Но пока обновления до 7.7 не планируется. Хотелось бы все таки получить рекомендации для решения задачи

Здравствуйте, Валентин!

Для того, чтобы объединить дубли лидов необходимо выполнить следующие действия:
1) Создать процесс для поиска лидов (аналогично процессу StartGlobalContactDuplicatesSearch). Для поиска необходимо создать процедуру в базе данных, аналогичную tsp_GloballySearchForDuplicates. Код процедуры tsp_GloballySearchForDuplicates можно найти в конфигурации, перейдя на вкладку "SQL сценарии". Процедура будет записывать данные в созданный Вами объект LeadDuplicates (создайте объект по аналогии с объектом ContactDuplicate)

2) Необходимо создать новую страницу редактирования, которая будет отображать данные из созданного объекта LeadDuplicates по аналогии со страницей DuplicatesPageV2 (либо заместите DuplicatesPageV2, добавив в нее нужную логику).

А теперь самое интересное - слияние лидов и удаление лишних. Так как удалить лид средствами системы не получится (связи, запущенный процесс...), то придется придумывать что-то новое.
Я бы в этот момент создавал бы новую запись лида и изменял данной записи значение в поле "Стадия" на нужное. Остальным дублям изменял бы стадию на "Дисквалифицирован" и указывал причину дисквалификации "Дубль".

Но лучше, наверное, обновиться до 7.7.0.:smile:

Спасибо.
Процесс StartGlobalContactDuplicatesSearch запускается в действии процесса StartGlobalDuplicatesSearch. Как теперь правильно заместить StartGlobalDuplicatesSearch, чтобы добавить в него запуск процесса StartGlobalLeadDuplicatesSearch? или если создать подобное действие процесса со своей логикой, где оно должно запускаться?

"Медведев Валентин Николаевич" написал:

Как теперь правильно заместить StartGlobalDuplicatesSearch, чтобы добавить в него запуск процесса StartGlobalLeadDuplicatesSearch?

Замещение процессов в системе не предусмотрено. Вам необходимо создать новый процесс и запускать его.

"Медведев Валентин Николаевич" написал:

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

Запускать новый процесс Вы можете, например, из библиотеки процессов (самая простая реализация). Также Вы можете добавить соответствующее действие в раздел "Лиды". Более подробно о создании действий, Вы можете прочитать в Академии.

имелось в виду
что собой и представляет StartGlobalDuplicatesSearch.

Добрый день!

Добавить соответствующее действие в раздел "Лиды" – подразумевается в замещающей странице редактирования лидов добавить новую кнопку в меню “Дейсвтия”. Также добавить обработчик, который будет запускать процесс по нажатию на эту кнопку.

StartGlobalDuplicatesSearch(Действие процесса) содержит сценарий:

string jobProcessName = (SchemaName == "Account") ? "StartGlobalAccountDuplicatesSearch" : "StartGlobalContactDuplicatesSearch";
AppScheduler.ScheduleImmediateProcessJob("DuplicatesSearchJob", "DuplicatesSearchGroup",
jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
return true;

если я создам подобное, в котором переменная jobProcessName будет получать "StartGlobalLeadDuplicatesSearch", то где оно должно вызываться?

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

Этот код добавляет в планировщик Quartz процесс StartGlobalAccountDuplicatesSearch, если поиск осуществляется со схемы Account, StartGlobalContactDuplicatesSearch - при поиске с другой схемы.

Для Вашей задачи, Вы можете действие процесса заменить на следующее:

string jobProcessName = "StartGlobalLeadDuplicatesSearch";
AppScheduler.ScheduleImmediateProcessJob("DuplicatesSearchJob", "DuplicatesSearchGroup",
jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
return true;

спасибо всем за помощь! разобрался.
теперь такой вопрос... можно ли изменить логику поиска дублей Лидов при импорте данных из Exel? например, чтобы телефоны "+7 (978) 123 12 31" и "+79781231231" считались совпадением. в каких модулях реализована стандартная логика?

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

При импорте из Excel записи +7 (978) 123 12 31 и +79781231231 действительно будут считаться разными записями. Проверка на тождественность этих записей не осуществляется.

При импорте из Excel Вы можете проверять уникальность по другим полям/признакам. Также непосредственно перед импортом Вы можете в файле Excel автозаменой символов "(", ")", " " на "".

Показать все комментарии
mobile
Мобильное приложение
7.x

На данный момент колонки объектов с типом = Время в мобильном приложении отображаются и имеют элемент выбора значения совпадающий с типом Дата/Время что не является полностью корректным. Планируются ли в связи с этим какие-то доработки приложения и каким образом на данный момент можно отображать в контролах и элементах выбора значения только время?

Нравится

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

Поддержка колонок с типом Время запланирована в bpm'online версии 7.8. В это же время будет обновлено мобильное приложение в магазине.

Источник:
http://www.community.terrasoft.ua/forum/topic/14271

Показать все комментарии
mobile
Технические вопросы
7.x

На данный момент колонки объектов с типом = Время в мобильном приложении отображаются и имеют элемент выбора значения совпадающий с типом Дата/Время что не является полностью корректным. Планируются ли в связи с этим какие-то доработки приложения и каким образом на данный момент можно отображать в контролах и элементах выбора значения только время?

Нравится

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

Алексей, здравствуйте!
Поддержка колонок с типом Время запланирована в bpm'online версии 7.8. В это же время будет обновлено мобильное приложение в магазине

Показать все комментарии
Технические вопросы
7.x

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

Нравится

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

Как идея - поставить на сутки, и потом по срабатыванию проверять - если этот день выходной, то еще на сутки.

А как проверить, что этот день выходной?

Добрый день!

Как вариант, создать 2 параметра.
1. Тип – Дата/Время – хранит текущее значение даты и времени.
2. Тип – целое число – хранит день недели.
С помощью элемента “Формула” передавать во второй параметр результат функции ДеньНедели(Параметр1). В условном потоке проверять значение второго параметра и порядкового номера дня недели.

Спасибо за комментарии.
Но неужели нет способа как-то использовать календарь? Нужно же еще и праздничные дни учитывать.

Так же как рассчитываются плановые даты по Сервису в карточке Обращения в системе Servicedesk.

Servicedesk использует календарь, через веб-сервисы, примером может служить TermCalculationService

За 5 лет решения не появилось?

Как можно получить рабочий ли день в новом расчете сроков (без устаревшей и неподдерживаемой библиотеки CalendarUtils)? Если по дню недели — то так. У нас есть таблица DayType. У неё есть признак NonWorking. C таблицей dayofweek она связана через DayInCalendar. Напрямую публичного метода, который выдавал бы этот признак, у нас нет. Примеры можно посмотреть в методах FillWeekTemplate и FillDayOffInfo в классе CalendarDataStore.

Показать все комментарии
Технические вопросы
7.x

Здравствуйте. Подскажите пожалуйста, ситуация такая: Создал объект для создания нового раздела( родитель базовый объект). В мастере разделов создал раздел "ТС" . Далее была создана деталь, в этой детали есть поле "ТС" (тип справочник) - ссылка на объект раздела. Добавляю деталь во вкладку(не важно куда), нажимаю добавить деталь, открывается форма добавления и поле "ТС" выглядит как справочник, но когда я на него нажимаю, то получаю пустую страницу.
Как я понимаю, то нужно для объекта раздела нужно создать схему или страницу? Я не сильно опытен в этом деле и если можно подскажите как это сделать.

Нравится

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

Здравствуйте, Павел.

1) Рекомендуем Вам создать раздел через [Мастер разделов]
http://academy.terrasoft.ru/documents/?/docs/product/bpm%27online%20cus…

Далее, создать деталь:
http://academy.terrasoft.ru/documents/docs/product/bpm%27online%20custo…

2) Создать объект в конфигурации, унаследовать базовый объект
3) Через [мастер деталей] -создать деталь, выбрав созданный объект в первом пункте
4) Сохраните, без перехода на редактирование страницы детали
5) Зайдите в раздел [Справочники] , добавьте новый справочник, выбрав Ваш раздел
http://academy.terrasoft.ru/documents/docs/product/bpm'online%20sales/t…

6) Зайдите в созданный раздел, [мастер раздела] , добавьте деталь созданную на шаге № 3
7) Cохраните
8) Зайдите в ваш раздел, найдите деталь и настройте её, добавьте справочник созданный на шаге №5

Спасибо, Александр, что так быстро ответили, но что-то не работает или я не так понял.
Во первых зачем пункт 2?
По 1 пункту - если у меня уже есть созданный раздел и деталь, то нужно снова создать?
5 - создал справочник с объектом раздела "ТС". Когда жму наполнения, то отображает нормально.

мб меня не правильно поняли тк много лишнего)
коротко - нужно что бы в детали, во вкладке или ещё где то все объекты из раздела "ТС" можно вывести справочником. Сейчас если я делаю это, то поле справочника появляется, но при нажатии на него открывается картинка вот штука (snimok2.png), есть раздел продукты и вот у него словарем открывается нормально вот так (snimok.png)

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

Так же, приложите, пожалуйста, скриншот с "пустым" открытым справочником и консолью браузера.

вот с консолькой и кусок кода

var core = require("core");
core.setModuleDescriptor('CardModule', {path: "../../configuration/dd7bd5282557e5e7e4594abe18148617", css: ["CardModule"],
	"messages": {
		"LoadData": { "direction": "publish", "mode": "broadcast" },
		"DetailInfo": { "direction": "subscribe", "mode": "broadcast" },
		"GetHistoryState": { "direction": "publish", "mode": "ptp" },
		"SaveDetails": { "direction": "publish", "mode": "ptp" },
		"LookupInfo": { "direction": "subscribe", "mode": "ptp" },
		"ResultSelectedRows": { "direction": "subscribe", "mode": "ptp" },
		"OpenLookupPage": { "direction": "subscribe", "mode": "broadcast" },
		"GetCardSchemaName": { "direction": "subscribe", "mode": "ptp" },
		"ReplaceHistoryState": { "direction": "publish", "mode": "broadcast" },
		"PushHistoryState": { "direction": "publish", "mode": "broadcast" },
		"BackHistoryState": { "direction": "publish", "mode": "broadcast" },
		"SaveRecord": { "direction": "subscribe", "mode": "broadcast" },
		"GetRecordInfo": { "direction": "subscribe", "mode": "ptp" },
		"RequestDetailItems": { "direction": "publish", "mode": "ptp" },
		"GetDetailItems": { "direction": "subscribe", "mode": "ptp" },
		"FindDuplicatesResult": { "direction": "subscribe", "mode": "broadcast" },
		"GetPredefinedRecords": { "direction": "subscribe", "mode": "ptp" },
		"ChangeRemindingsCounts": { "direction": "publish", "mode": "broadcast" },
		"GetContextHelpId": { "direction": "subscribe", "mode": "ptp" },
		"LookupPageInfo": { "direction": "publish", "mode": "ptp" },
		"DoNotUseCommunication": { "direction": "subscribe", "mode": "ptp" },
		"ShowLookupPage": { "direction": "subscribe", "mode": "ptp" },
		"LookupResultSelected": { "direction": "publish", "mode": "ptp" },
		"GetProcessExecData": { "direction": "publish", "mode": "ptp" },
		"GetProcessExecDataCollection": { "direction": "publish", "mode": "ptp" },
		"GetEntityName": { "direction": "subscribe", "mode": "ptp" },
		"CardModuleEntityInfo": { "direction": "publish", "mode": "ptp" },
		"OpenCardModule": { "direction": "subscribe", "mode": "ptp" },
		"UpdateDetail": { "direction": "publish", "mode": "ptp" },
		"OpenGridSettings": { "direction": "subscribe", "mode": "ptp" },
		"CardModuleResponse": { "direction": "publish", "mode": "ptp" },
		"ProcessExecDataChanged": { "direction": "publish", "mode": "ptp" },
		"DetailChanged": { "direction": "subscribe", "mode": "broadcast" },
		"LoadCustomModule": { "direction": "subscribe", "mode": "ptp" },
		"UpdateCommentCounter": { "direction": "subscribe", "mode": "ptp" },
		"GetAdditionalFilterValue": { "direction": "subscribe", "mode": "ptp" },
		"DestroyCommentModule": { "direction": "publish", "mode": "ptp" },
		"GetParentContainer": { "direction": "publish", "mode": "ptp" },
		"IncomingPtp": { "direction": "subscribe", "mode": "ptp" },
		"IncomingBroadcast": { "direction": "subscribe", "mode": "broadcast" },
		"OutcomingPtp": { "direction": "publish", "mode": "ptp" },
		"OutcomingBroadcast": { "direction": "publish", "mode": "broadcast" },
		"GetEntityColumnValues": { "direction": "subscribe", "mode": "ptp" },
		"ReloadDetail": { "direction": "publish", "mode": "ptp" },
		"SetDetailReadOnly": { "direction": "publish", "mode": "ptp" },
		"GetProcessEntryPointsData": { "direction": "publish", "mode": "ptp" },
		"GetMapsConfig": { "direction": "subscribe", "mode": "ptp" },
		"ColumnSelected": { "direction": "subscribe", "mode": "ptp" },
		"GetStructureExplorerSchemaName": { "direction": "subscribe", "mode": "ptp" },
		"StructureExplorerInfo": { "direction": "subscribe", "mode": "ptp" },
		"GetIsDetailReadonly": { "direction": "subscribe", "mode": "ptp" },
		"GetCardModuleSandboxId": { "direction": "subscribe", "mode": "ptp" },
		"DetailSaved": { "direction": "subscribe", "mode": "ptp" },
		"RefreshFiles": { "direction": "publish", "mode": "broadcast" },
		"DestroyFilesModule": { "direction": "publish", "mode": "ptp" },
		"FileDeleted": { "direction": "subscribe", "mode": "ptp" },
		"RefreshWorkplace": { "direction": "publish", "mode": "ptp" },
		"GetWidgetParameters": { "direction": "publish", "mode": "ptp" },
		"PushWidgetParameters": { "direction": "publish", "mode": "ptp" },
		"CardProccessModuleInfo": { "direction": "subscribe", "mode": "ptp" }
	}});
core.setModuleDescriptor('ProcessProgressSpinnerImage', {path: "../../configuration/a1fa921decbb5aee03170d3b7bc1e92b"});
core.setModuleDescriptor('RightUtilities', {path: "../../configuration/c10b9dd2b99cd6a574464459291852c5"});
core.setModuleDescriptor('MaskHelper', {path: "../../configuration/27d32cf9403d46187b97829dd8728c00"});
core.setModuleDescriptor('LookupPageViewGenerator', {path: "../../configuration/07929e6cc749d51c88f646c68f210ee8"});
core.setModuleDescriptor('LookupPageViewModelGenerator', {path: "../../configuration/6e41c42262df83b8220fea5c27b8e8fb",
	"messages": {
		"GetGridSettingsInfo": { "direction": "subscribe", "mode": "ptp" }
	}});
core.setModuleDescriptor('LookupPageResources', {path: "../../configuration/6b9d74cc8f03aec01bf47e0892f3c779", css: ["LookupPage"],
	"messages": {
		"LookupInfo": { "direction": "publish", "mode": "ptp" },
		"ResultSelectedRows": { "direction": "publish", "mode": "ptp" },
		"GetHistoryState": { "direction": "publish", "mode": "ptp" },
		"ReplaceHistoryState": { "direction": "publish", "mode": "broadcast" },
		"BackHistoryState": { "direction": "publish", "mode": "broadcast" },
		"PushHistoryState": { "direction": "publish", "mode": "broadcast" },
		"CardModuleEntityInfo": { "direction": "subscribe", "mode": "ptp" },
		"MacrosInfo": { "direction": "subscribe", "mode": "ptp" },
		"GridSettingsInfo": { "direction": "subscribe", "mode": "ptp" },
		"GridSettingsChanged": { "direction": "subscribe", "mode": "ptp" },
		"CardProccessModuleInfo": { "direction": "publish", "mode": "ptp" },
		"CardModuleResponse": { "direction": "subscribe", "mode": "ptp" },
		"OpenCard": { "direction": "publish", "mode": "ptp" },
		"getCardInfo": { "direction": "subscribe", "mode": "ptp" },
		"GetGridSettingsInfo": { "direction": "subscribe", "mode": "ptp" },
		"UpdateDetail": { "direction": "subscribe", "mode": "ptp" }
	}});
define('LookupPageResources', ['terrasoft'], function(Terrasoft) {
var localizableStrings={
	SelectButtonCaption: 'а’б‹аБб€аАб‚бŒ',
	CancelButtonCaption: 'аžб‚аМаЕаНаА',
	ActionButtonCaption: 'а”аЕаЙбб‚аВаИб',
	AddButtonCaption: 'а”аОаБаАаВаИб‚бŒ',
	DeleteButtonCaption: 'аЃаДаАаЛаИб‚бŒ',
	EditButtonCaption: 'а˜аЗаМаЕаНаИб‚бŒ',
	CopyButtonCaption: 'аšаОаПаИб€аОаВаАб‚бŒ',
	SelectedRecordsLabelCaption: 'а’б‹аБб€аАаНаО аЗаАаПаИбаЕаЙ',
	SettingsColumnButtonCaption: 'ааАбб‚б€аОаЙаКаА аКаОаЛаОаНаОаК',
	SearchButtonCaption: 'аŸаОаИбаК',
	CountSelectedRecord: 'а’б‹аБб€аАаНаО аЗаАаПаИбаЕаЙ:',
	CaptionLookupPage: 'а’б‹аБаОб€: ',
	OnDeleteWarning: 'а’б‹ аДаЕаЙбб‚аВаИб‚аЕаЛбŒаНаО б…аОб‚аИб‚аЕ бƒаДаАаЛаИб‚бŒ аВб‹аДаЕаЛаЕаНаНб‹аЕ баЛаЕаМаЕаНб‚б‹?',
	DependencyWarningMessage: 'а’б‹аБб€аАаНаНб‹аЕ баЛаЕаМаЕаНб‚б‹ бƒаДаАаЛаИб‚бŒ аНаЕаВаОаЗаМаОаЖаНаО, б‚аАаК аКаАаК аОаНаИ аИбаПаОаЛбŒаЗбƒбŽб‚бб аВ аДб€бƒаГаИб… аОаБбŠаЕаКб‚аАб….',
	StartProcessButtonCaption: 'а—аАаПбƒбб‚аИб‚бŒ',
	ShowProcessLogButtonCaption: 'а–бƒб€аНаАаЛ аПб€аОб†аЕббаОаВ'
};
var localizableImages={
	'MenuButtonImage': {source: Terrasoft.ImageSources.SOURCE_CODE_SCHEMA, params: { schemaName: 'LookupPage', resourceItemName: 'MenuButtonImage' }}
};
return {localizableStrings:localizableStrings,localizableImages:localizableImages};
});
define("LookupPage", ["ext-base", "MaskHelper", "LookupPageViewGenerator", "LookupPageViewModelGenerator",
	"LookupUtilities"],
	function(Ext, MaskHelper, LookupPageViewGenerator, LookupPageViewModelGenerator, LookupUtilities) {
 
		var lookupPage = Ext.define("Terrasoft.configuration.LookupPage", {
			extend: "Terrasoft.BaseObject",
			alternateClassName: "Terrasoft.LookupPage",
 
			Ext: null,
 
			sandbox: null,
 
			Terrasoft: null,
 
			/**
			 * аŸб€аИаЗаНаАаК б‚аОаГаО, б‡б‚аО аМаОаДбƒаЛбŒ аИаНб†аИаАаЛаИаЗаИб€бƒаЕб‚бб аАбаИаНб…б€аОаНаНаО
			 * @private
			 * @type {Boolean}
			 */
			isAsync: true,
 
			/**
			 * аšаОаНб„аИаГ Lookup-аА
			 * @private
			 * @type {Object}
			 */
			lookupInfo: null,
 
			/**
			 * аЁбб‹аЛаКаА аНаА ViewModel LookupPage-аА
			 * а˜аНаИб†аИаАаЛаИаЗаИб€бƒаЕб‚бб аПаЕб€аЕаД аОб‚б€аИбаОаВаКаОаЙ
			 * @private
			 * @type {Object}
			 */
			viewModel: null,
 
			/**
			 * аЁбб‹аЛаКаА аНаА аКаОаНб‚аЕаЙаНаЕб€ аВ аКаОб‚аОб€аОаМ аБбƒаДаЕб‚ аОб‚б€аИбаОаВаАаН ModalBox.
			 * а˜аНаИб†аИаАаЛаИаЗаИб€бƒаЕб‚бб аПаЕб€аЕаД аОб‚б€аИбаОаВаКаОаЙ
			 * @private
			 * @type {Object}
			 */
			renderContainer: null,
 
			/**
			 * аЄаЛаАаГ, аКаОб‚аОб€б‹аЙ аИаМаЕаЕб‚ аЗаНаАб‡аЕаНаИаЕ аЕбаЛаИ аМаОаДбƒаЛбŒ аБб‹аЛ аЗаАаГб€бƒаЖаЕаНаИ аИаЗ CardProcessModule
			 * @private
			 * @type {Boolean}
			 */
			processModuleFlag: false,
 
 
			/**
			 * а˜аНаИб†аАаЛаИаЗаИб€бƒаЕб‚ аНаАб‡аАаЛбŒаНб‹аЕ аЗаНаАб‡аЕаНаИб аМаОаДбƒаЛб,
			 * аВ аЗаАаВаИбаИаМаОбб‚аИ аОб‚ б€аЕаЗбƒаЛбŒб‚аАб‚аА аПбƒаБаЛаИаКаАб†аИаИ баОаОаБб‰аЕаНаИб 'CardProccessModuleInfo'
			 * аМаОаДбƒаЛбŒ аИаНаИб†аИаАаЛаИаЗаИб€бƒаЕб‚бŒбб аДаЛб б€аАаБаОб‚б‹ аВ аМаОаДаАаЛбŒаНаОаМ аОаКаНаЕ аИаЛаИ аВ centerPanel
			 * @private
			 */
			init: function(callback, scope) {
				callback = callback || function() {};
				if (this.viewModel) {
					callback.call(scope);
					return;
				}
 
				this.lookupInfo = this.sandbox.publish("LookupInfo", null, [this.sandbox.id]);
				this.processModuleFlag = this.sandbox.publish("CardProccessModuleInfo", null, [this.sandbox.id]);
 
				this.initHistoryState();
 
				this.getSchemaAndProfile(function(entitySchema, profile) {
					if (this.isDestroyed) {
						return;
					}
 
					this.lookupInfo.searchColumn = {
						value: entitySchema.primaryDisplayColumn.name,
						displayValue: entitySchema.primaryDisplayColumn.caption
					};
					this.lookupInfo.entitySchema = entitySchema;
					this.lookupInfo.gridProfile = profile;
 
					var viewModel = this.viewModel = this.generateViewModel();
					viewModel.init();
					if (this.lookupInfo.selectedValues) {
						viewModel.set("RestoreSelectedData", this.lookupInfo.selectedValues);
					}
					if (profile &&
						!((profile.captionsConfig && profile.listedColumnsConfig) || profile.tiledColumnsConfig)) {
						var newProfile = viewModel.getDefaultProfile();
						Terrasoft.utils.saveUserProfile(newProfile.key, newProfile, true, function(response) {
							if (!response.success) {
								return;
							}
							this.lookupInfo.gridProfile = newProfile;
							viewModel.set("gridProfile", newProfile);
 
							viewModel.updateSortColumnsCaptions();
							viewModel.load();
							callback.call(scope);
						}, this);
					} else {
						viewModel.updateSortColumnsCaptions();
						viewModel.load();
						callback.call(scope);
					}
 
				});
			},
 
			/**
			 * а’б‹аПаОаЛаНбаЕб‚ аОб‚б€аИбаОаВаКбƒ аМаОаДбƒаЛб аВ аКаОаНб‚аЕаЙаНаЕб€
			 * @protected
			 * @param {Object} renderTo аКаОаНб‚аЕаЙаНаЕб€ аВ аКаОб‚аОб€б‹аЙ аБбƒаДаЕб‚ аОб‚б€аИбаОаВаАаН аМаОаДбƒаЛбŒ
			 */
			render: function(renderTo) {
				this.renderContainer = renderTo.id;
				this.renderLookupView(this.lookupInfo.entitySchema, this.lookupInfo.gridProfile);
			},
 
			generateViewModel: function() {
				var viewModelConfig = LookupPageViewModelGenerator.generate(this.lookupInfo);
				if (!this.lookupInfo.columnValue && this.lookupInfo.searchValue) {
					viewModelConfig.values.searchData = this.lookupInfo.searchValue;
					viewModelConfig.values.previousSearchData = this.lookupInfo.searchValue;
				}
				var viewModel = Ext.create("Terrasoft.BaseViewModel", viewModelConfig);
				viewModel.Ext = this.Ext;
				viewModel.sandbox = this.sandbox;
				viewModel.Terrasoft = this.Terrasoft;
 
				if (this.lookupInfo.updateViewModel) {
					this.lookupInfo.updateViewModel.call(viewModel);
				}
				viewModel.initCaptionLookup();
				viewModel.initHasActions();
				viewModel.initLoadedColumns();
				if (!Ext.isEmpty(this.lookupInfo.filterObjectPath)) {
					viewModel.updateFilterByFilterObjectPath(this.lookupInfo.filters, this.lookupInfo.filterObjectPath);
				}
				if (this.lookupInfo.hideActions) {
					viewModel.set("hasActions", false);
				}
				return viewModel;
			},
 
			initHistoryState: function() {
				if (!this.processModuleFlag) {
					return;
				}
				var state = this.sandbox.publish("GetHistoryState");
				var currentHash = state.hash;
				var currentState = state.state || {};
				if (currentState.moduleId === this.sandbox.id) {
					return;
				}
				this.sandbox.publish("ReplaceHistoryState", {
					stateObj: {
						moduleId: this.sandbox.id
					},
					pageTitle: null,
					hash: currentHash.historyState,
					silent: true
				});
			},
 
			/**
			 * аŸаОаЛбƒб‡аАаЕб‚ бб…аЕаМбƒ аИ аНаАбб‚б€аОаЙаКаИ аПб€аОб„аИаЛб аДаЛб баПб€аАаВаОб‡аНаИаКаА
			 * @private
			 * @param {Function} callback б„бƒаНаКб†аИб аКаОб‚аОб€аАб аБбƒаДаЕб‚ аВб‹аПаОаЛаНаЕаНаА аПаО аОаКаОаНб‡аАаНаИаИ аЗаАаГб€бƒаЗаКаИ аВ аКаОаНб‚аЕаКбб‚аЕ баАаМаОаГаО аМаОаДбƒаЛб
			 */
			getSchemaAndProfile: function(callback) {
				var entitySchemaName = this.lookupInfo.entitySchemaName;
				this.sandbox.requireModuleDescriptors([entitySchemaName], function() {
					var columnsSettingsProfileKey = "GridSettings_" + this.lookupInfo.entitySchemaName;
					var me = this;
					require([entitySchemaName, "profile!" + columnsSettingsProfileKey], function(entitySchema, profile) {
						var fixedProfile = me.actualizeProfile(entitySchema, profile);
						callback.call(me, entitySchema, fixedProfile);
					});
				}, this);
			},
 
			/**
			 * а’б‹аПаОаЛаНбаЕб‚ аОб‚б€аИбаОаВаКбƒ Lookup-аА аВ баОаОб‚аВаЕб‚бб‚аВаИаИ баО бб…аЕаМаОаЙ аИ аНаАбб‚б€аОаЙаКаОаЙ аПб€аОб„аИаЛб
			 * а”аЛб аПб€аОб†аЕбаОаВ аОб‚б€аИбаОаВб‹аВаАаЕб‚бб аНаА аВбаЕ аОаКаНаО, аДаЛб баПб€аАаВаОб‡аНаИаКаОаВ аВ modalBox
			 * @private
			 * @param {Object} schema EntitySchema аОаБбŒаЕаКб‚аА
			 * @param {Object} profile аНаАбб‚б€аОаЙаКаА аПб€аОб„аИаЛб
			 */
			renderLookupView: function(schema, profile) {
				var configArgs = {};
				configArgs.actionsMenuConfig = LookupPageViewGenerator.getActionsMenuConfig(schema.name);
				configArgs.captionConfig = schema.columns[schema.primaryDisplayColumnName].caption;
				configArgs.entitySchema = schema;
				configArgs.isRunProcessPage = this.lookupInfo.isRunProcessPage;
				configArgs.columnsSettingsProfile = profile;
				Ext.apply(configArgs, this.lookupInfo);
				var fixedViewConfig = LookupPageViewGenerator.generateFixed(configArgs);
				var fixedView = Ext.create(fixedViewConfig.className || "Terrasoft.Container", fixedViewConfig);
				fixedView.bind(this.viewModel);
				fixedView.render(LookupUtilities.GetFixedHeaderContainer());
				var gridViewConfig = LookupPageViewGenerator.generateGrid(configArgs);
				var gridView = Ext.create(gridViewConfig.className || "Terrasoft.Container", gridViewConfig);
				gridView.bind(this.viewModel);
				gridView.render(LookupUtilities.GetGridContainer());
				if (this.processModuleFlag) {
					this.loadCommandLine();
				}
				MaskHelper.HideBodyMask();
			},
 
			/**
			 * аЃбб‚аАаНаАаВаЛаИаВаАаЕб‚ б„аОаКбƒб аНаА бб‚б€аОаКаЕ аПаОаИбаКаА аПаОбаЛаЕ аОб‚б€аИбаОаВаКаИ
			 * @private
			 */
			loadCommandLine: function() {
				var commandLineContainer = Ext.get("module-command-line");
				if (!this.lookupInfo.commandLineEnabled || Ext.isEmpty(commandLineContainer)) {
					return;
				}
				this.sandbox.loadModule("CommandLineModule", {
					renderTo: commandLineContainer
				});
			},
 
			actualizeProfile: function(entitySchema, profile) {
				if (profile.listedConfig) {
					var viewGenerator = Ext.create("Terrasoft.ViewGenerator");
					viewGenerator.viewModelClass = this;
					this.entitySchema = entitySchema;
					this.columns = entitySchema.columns;
					var newProfile = {
						listedConfig: Ext.decode(profile.listedConfig),
						tiledConfig: Ext.decode(profile.tiledConfig),
						isTiled: profile.type === "tiled",
						type: profile.type,
						key: profile.key
					};
					viewGenerator.actualizeGridConfig(newProfile);
					this.clearLinks(newProfile);
					return {
						isTiled: newProfile.isTiled,
						key: newProfile.key,
						listedColumnsConfig: Ext.encode(newProfile.listedConfig.columnsConfig),
						captionsConfig: Ext.encode(newProfile.listedConfig.captionsConfig),
						tiledColumnsConfig: Ext.encode(newProfile.tiledConfig.columnsConfig),
						type: newProfile.type
					};
				}
				return profile;
			},
 
			clearLinks: function(profile) {
				Terrasoft.each(profile.listedConfig.columnsConfig, function(item) {
					if (item.hasOwnProperty("link")) {
						delete item.link;
					}
				}, this);
				Terrasoft.each(profile.tiledConfig.columnsConfig, function(rowItem) {
					Terrasoft.each(rowItem, function(item) {
						if (item.hasOwnProperty("link")) {
							delete item.link;
						}
					}, this);
				}, this);
			}
		});
 
 
		return lookupPage;
	});

Судя по ошибке в консоли- Вы по-прежнему используете вручную созданный объект раздела.
ошибка нам сообщает: primaryDisplayColumn is undefined.- не определена первичная колонка в объекте для отображения.

В таком случае, откройте Ваш объект- и заполните значение: "Отображаемое значение" на любую текстовую колонку существующую в объекте. Не забудьте отобразить "все" свойства объекта.

"Александр Зубков" написал:

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

ошибка нам сообщает: primaryDisplayColumn is undefined.- не определена первичная колонка в объекте для отображения.

В таком случае, откройте Ваш объект- и заполните значение: "Отображаемое значение" на любую текстовую колонку существующую в объекте. Не забудьте отобразить "все" свойства объекта.


Спасибо огромное. Это видать я сам накосячил тк удалил поле которое создалось по умолчанию когда объект создался (я вспомнил , что объект создался при создании раздела через конструктор).

Показать все комментарии
лендинг
Лид
Технические вопросы
7.x

Добрый день!

Подскажите, возможно ли настроить заполнение пользовательских полей лида через маппинг полей веб-формы лендинга?

Нравится

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

Добрый день!
Да, это возможно. Для этого необходимо в код лендинга в список css-селекторов добавить строки вида:
"Name": "css-selector",
где "Name" - название поля в bpm'online
"css-selector" - класс или id поля в форме лендинга

Анастасия, спасибо за ответ!

У меня еще один вопрос :)

"Савельева Анастасия Юрьевна" написал:
"css-selector" - класс или id поля в форме лендинга

А можно ли ссылаться не на id или класс, а на name?
К примеру, есть потребность интеграции с формой на lpgenerator.ru Возможности редактирования кода там ограничены. class у всех полей формы одинаковый, а для идентификации используется не id, а name.

Николай, добрый день!

К сожалению, использовать можно только class или id.

"Савельева Анастасия Юрьевна" написал:

Николай, добрый день!

К сожалению, использовать можно только class или id.


Добрый день! У меня тот же вопрос, что и у Николая. Решен ли он на сегодняшний день?
У меня Версия 7.9.1.3284 и есть необходимость связать лендинг созданный на спец ресурсе по их созданию (платформа ЛП, флексби, тильда, ЛП генератор) с системой и получать лидов.

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

Здравствуйте, Катерина!

Пока такого решения в bpm'online не разработано. Мои коллеги передали Ваш вопрос на рассмотрение к доработкам.

Приятной работы.

Показать все комментарии
Технические вопросы
7.x

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

Нравится

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

Дмитрий,

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

В первую очередь вам потребуется заместить метод в js отвечающий за автонумерацию записей на карточке.

Посмотрите вот эту тема:
http://www.community.terrasoft.ru/forum/topic/10362

и то, это не даст вам 100% непрерывности нумерации, например, если произойдет ошибка после генерации номера.
можно вынести логику на триггер SQL, но у этого решения есть весомые минусы

Показать все комментарии
Quartz
Технические вопросы
7.x

Вопросы:
1) Где и как можно конфигурировать планировщик задач (на уровне администрирования - подключение к БД и т.д.)
2) Поделитесь опытом - как исключить запросы Quartz'a из профайлера SQL

Нравится

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

Здравствуйте, Дмитрий.

1. Необходимые параметры находятся в файле ConnectionStrings.config (в корне папки с бинарными файлами)
2. Запросы исключаются следующим образом:
[IMG]http://s012.radikal.ru/i320/1512/51/7bccf3c13715.png[/IMG]
[IMG]http://s017.radikal.ru/i416/1512/d3/f1e118b7cadc.png[/IMG]

"Сергей Кy6риш" написал:Необходимые параметры находятся в файле ConnectionStrings.config (в корне папки с бинарными файлами)

т.е. Quartz подключается по тем же настройкам, что и все приложение? Ок

Совершенно верно!

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