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



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

Нравится

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

Примерно так будет выглядеть sql запрос

with tempRecursive(Id, Name, ParentRoleId, level) as (

    select Id, Name, ParentRoleId, 0 as level

    from SysAdminUnit

    where id = '5905BE45-DFF1-4756-AF7C-92C6182F4602'

    Union All

    Select SysAdminUnit.Id, SysAdminUnit.Name, SysAdminUnit.ParentRoleId, (level+1) as level

    from tempRecursive join SysAdminUnit on tempRecursive.ParentRoleId = SysAdminUnit.Id

)

select * from tempRecursive

order by level

Варианта два:

1. Просканировать в системе все его роли. Вариантов не так много, Вы их все перечислили - фукциональная роль, орг. роль, руководитель + он может входить в роль системных администраторов явно или через подчиненного.

2. Проверить в БД таблицы SysAdminUnitInRole и SysUserInRole.

В 5.Х была C#-функция UserConnection.DBSecurityEngine.GetUserAdminUnitCollection. Возможно, и в 7.Х есть такая же. В качестве параметра — Id пользователя или без параметров для текущего.

Антон Малий пишет:

Таким образом он показывает только 1-е и прямое вхождение пользователя в роль. И никакие унаследованные роли так не видны.



Очевидно, нужно писать рекурсивный Select с разными проверками. Но я подозреваю, что уже такой функционал существует

Владимир Соколов,

К сожалению, готового скрипта нет. Можно воспользоваться функцией, предложенной Александром.

Примерно так будет выглядеть sql запрос

with tempRecursive(Id, Name, ParentRoleId, level) as (

    select Id, Name, ParentRoleId, 0 as level

    from SysAdminUnit

    where id = '5905BE45-DFF1-4756-AF7C-92C6182F4602'

    Union All

    Select SysAdminUnit.Id, SysAdminUnit.Name, SysAdminUnit.ParentRoleId, (level+1) as level

    from tempRecursive join SysAdminUnit on tempRecursive.ParentRoleId = SysAdminUnit.Id

)

select * from tempRecursive

order by level

Действительно, в итоге оказалось, что все права можно найти в SysAdminUnitInRole

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

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

О компании

Компания ООО «Термо Техно» включает в себя две компании — ООО «Термо Техно Инжиринг» и ООО «ТТ Аналитика». ООО «Термо Техно Инжиринг» занимается сервисным обслуживанием аналитического и измерительного оборудования, поставкой запасных частей, разработкой программного обеспечения, разработкой и внедрением новых продуктов, предоставляет услуги по аудиту процессов аналитического контроля, занимается проектированием лабораторий для промышленных предприятий. ООО «ТТ Аналитика» обеспечивает поставки аналитического и измерительного оборудования для лабораторного контроля, занимается проектированием и внедрением автоматических систем аналитического контроля.

Причины внедрения bpmonline

До начала роботы в bpm’online сотрудники компании выполняли задачи в удобном для них формате, то есть отсутствовал унифицированный алгоритм действий по взаимодействию с клиентами. Это увеличивало время на контроль выполнения задач и составление аналитики по общим показателям работы.

Задачи внедрения bpm’online sales enterprise:

  • ускорение процессов работы с клиентами;
  • агрегация информации в единой среде;
  • получение настраиваемой аналитики;
  • организация документооборота между сотрудниками компании;
  • организация оперативного взаимодействия подразделений компании между собой.

 

Выполненные настройки

Процесс внедрения bpm’online в компании стартовал с автоматизации процессов тендерного производства. Для организации работы с тендерами адаптирован раздел [Лиды]. В карточке лида добавлена вкладка «Тендерная информация», на которой созданы следующие поля:

  • название площадки;
  • объект запроса;
  • дата окончания подачи заявок;
  • номер процедуры.

 

С помощью автогенерируемых задач настроен алгоритм работы тендерного отдела. Работа с тендером начинается со стадии «Квалификация» и выполняется по базовому процессу «Управление лидом». На стадии «Распределение» автоматически создается проект, в который дублируются необходимые данные из лида.

 

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

 

Продажа, в свою очередь, также взаимосвязана с проектом. Алгоритм действий в разделе [Продажи] реализован через кейс менеджмент.  Кейс содержит следующие стадии:

  • квалификация;
  • коммерческое предложение;
  • контрактация;
  • завершена с победой;
  • завершена с проигрышем;
  • срок рассмотрение прошел;
  • ответ не получен.

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

 

В разделе [Договоры] реализовано визирование, которое автоматизирует согласование различных типов договоров. Процесс визирования зависит от таких переменных: тип договора, подразделение, вид договора и юридическое лицо. В данном процессе визирования система ожидает визы от всех участников процесса.

 

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

Внедрение bpm’online позволило также получать аналитику по таким показателям:

  • среднее время согласования договора;
  • количество успешных лидов/продаж за отчетный период;
  • количество неуспешных лидов/продаж за отчетный период;
  • количество тендеров в зависимости от площадки.

Результат

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

Также в планах развития компании — реализация постконтрактного сопровождения проектов в bpm’online.

 

 

Нравится

Поделиться

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

Всем привет!

Немного предыстории. По неопытности долгое время доработка системы производилась в облаке, на продуктивной среде. Соответственно все изменения попали в пакет Custom.

Сейчас стоит задача перенести все схемы и данные из объекта Custom в отдельный пакет, выгрузить его и дальше работать в отдельном пакете на локальной среде.

Погрузивший в структуру БД было выяснено, что принадлежность схемы к пакеты находится в БД, таблица SysSchema, поле SysPackageId, данные хранятся в соседней таблице SysPackageSchemaData. Был написан нехитрый sql скрипт, который переопределяет ссылку на на новый пакет. И вроде даже все работает, но вот беда, в метаданных схемы осталась ссылка на старый пакет, т.е. в БД уже новый, а в метаданных старый.

Прошу подсказать, как быть в этом случае? Как перегенерировать метаданные схемы? Очистка редис, генерация и компиляция не помогла.

Просто вручную тыкать в каждый объект как-то не очень хочется (объектов больше 200)

Нравится

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

Владимир Соколов пишет:

Может, просто переименовать Custom? И создать новый Custom

 + Помимо переименования необходимо будет почистить системную настройку "Идентификатор пользовательского пакета" [CustomPackageUId], т.к. именно эта настройка отвечает за указание системного пакета.

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

Может, просто переименовать Custom? И создать новый Custom

Владимир Соколов пишет:

Может, просто переименовать Custom? И создать новый Custom

 + Помимо переименования необходимо будет почистить системную настройку "Идентификатор пользовательского пакета" [CustomPackageUId], т.к. именно эта настройка отвечает за указание системного пакета.

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

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

Клиент столкнулся с такой же ситуацией, начав разработку в Custom. Но переименование не помогает - при переносе пакета на production получаем ошибку, что такой Uid уже существует

Может, там действительно существует с таким же UId? Без подробностей сложно подсказать, где искать.

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

При потыке вернуть изменения назад:

Ошибка

При работе с хранилищем произошла ошибка

Failed to run the WC DB work queue associated with '\icl_package', work item 162 (file-install Resources/ICLCars1Section.ClientUnit/resource.ru-RU.xml 1 0 1 1)

SvnErrorCode: SVN_ERR_WC_BAD_ADM_LOG

RootCause: ������� �� ������� ����� ��������� ����.

 

При попытке ее удалить:

При работе с хранилищем произошла ошибка

Previous operation has not finished; run 'cleanup' if it was interrupted

SvnErrorCode: SVN_ERR_WC_CLEANUP_REQUIRED

 

При сохранении схемы:

Ошибка

Ошибка сохранения: При работе с хранилищем произошла ошибка

 

Как мне исправить данную проблему?

Как вариант пока работаю через файловую систему.. но ошибка не ушла.

Нравится

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

Тут обсуждают причины такого же поведения SVN и дают советы:

Thanks to this reference for a solution that worked on Mac with svn installed via brew.

cd {work-dir-base}
sqlite3 .svn/wc.db "delete from work_queue"

Here is another blog entry dealing with this issue.

Found a solution. That is to delete the folder through svn on the windows box that contained the badly named file. This must tell svn to not bother updating that folder if it sees a local delete that has not yet been committed. If you do this be sure to back up your files first so you can recreate the folder and add all the files again (named properly of course).

I have also faced a similar problem:

I have deleted a local folder (for which svn files were checked out). After this none of the svn commands were working fine, even from cmd prompt(admin), also svn cleanup was not working.

Fix:

  1. I have created a dummy file, for which the error 'svn: E155009: Failed to run the WC DB work queue associated with' is coming.
  2. Then I have run svn cleanup in cmd line, found the same error in that a file couldn't be read
  3. Repeated the above steps for the file not found in step2.
  4. svn cleanup, it works!

и ещё ряд других возможных причин и способов решения.

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

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

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

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

Или только через переопределение модуля LeftPanelTopMenuModule и соответствующие правки в loadMenu?

Нравится

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

Добрый день, Денис!



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

 

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

Добрый день! Подскажите, пожалуйста, а имеется ли возможность с помощью командой строки искать по другим разделам, а не по разделу «Контакты»/«Контрагенты»? Как в этот выпадающий список добавить новый раздел?

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

Нравится

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

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

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

Более детально Вы можете ознакомиться с статье Академии: https://academy.terrasoft.ru/documents/studio/7-12/globalnyy-poisk

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

Если же сайт находится на Ваших серверах, в статье есть инструкция по настройке.

День добрый! Сайт развернут на серверах и глобальный поиск уже работает. Вопрос в том как поднастроить его таким образом чтобы добавить поиск еще по одному разделу: Сейчас поиск идет по Контактам и Контрагентам. Мне необходимо чтобы появилась еще строка "Найти Вакансию Тест"

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

Александр, выдача выдана просто списком с фильтром в выбранном разделе. 

Значит, глобальный не включен.

А без глобального поиска такое возможно реализовать? Просто как таковой глобальный поиск не нужен. Нужен быстрый доступ к поиску по разделу.

Как настраивать командную строку, описано здесь.

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

В таком случае воспользуйтесь советом выше и включите глобальный поиск. Или же доработайте старый механизм для поддержки нового раздела. Логика реализована в схеме CommandLineModule, см. там упоминания Contact и Account.

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

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

Есть бизнес-процесс, запускающийся вручную. Необходимо в процессе отловить пользователя, запустившего процесс. Подходит ли для этого переменная "Контакт текущего пользователя"/"Текущий пользователь"?

Второй случай. Бизнес-процесс запускается по сигналу от объекта (изменение какой-либо колонки). Можно ли в процессе отловить пользователя, изменившего колонку в объекте, т.е. запустившего процесс?

В более общем смысле вопрос - что есть "Контакт текущего пользователя" в бизнес-процессах? Если у нас показывается "Контакту текущего пользователя" страница редактирования какого-либо объекта, и одновременно в системе сидит несколько пользователей - она будет показана всем?

Нравится

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

1) Да

2) Тут надо тестить, но я думаю нет (если, конечно, при запуске события не прокидывается UserConnection пользователя)

В общих чертах: есть UserConnection. Подключение пользователя, которое инициируется в момент вашего логина в СРМ. Соответственно "Контакт текущего пользователя" — контакт из UserConnection.

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

А все сервисы/бп по расписанию инициируются под userconnection от Supervisor-а.

2) Если в объекте в записи менялась колонка и по изменению запустился процесс, то сразу после запуска в поле ModifiedById этой записи и будет тот, кто поменял.

Варфоломеев Данила пишет:

А все сервисы/бп по расписанию инициируются под userconnection от Supervisor-а

а как определяется пользователь Supervisor, если он в системе не активный? 

Владимир Соколов пишет:

если он в системе не активный?

 AppConnection.SystemUserConnection всегда можно вытащить

Да и да. Пользователь, изменивший объект является инициатором триггерного процесса

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

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

Вопрос, наверно, простой - где определяется функция recalculateServiceTerms, в какой схеме?

Версия 7.12.

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

Нравится

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

Если есть доступ в базу, поискать можно запросом:

SELECT (SELECT [Name] FROM [SysSchema] WHERE [Id] = [SysSchemaId])
FROM [SysSchemaContent]
WHERE CAST([Content] AS VARCHAR(MAX)) LIKE '%recalculateServiceTerms%'

И среди трёх результатов будет искомая схема CaseServiceUtility:

/**
 * Recalculates scheduled dates by service item.
 * @protected
 */
recalculateServiceTerms: function() {
	var config = this.getIsFeatureEnabled("ServiceTerms")
			? this.getCaseTermCalculatorServiceConfig()
			: this.getCallTermCalculationServiceConfig();
	if (config) {
		if (this.getIsFeatureEnabled("ServiceTerms")){
			this.callService(config, this.onRecalculateCaseTerms, this);
		} else {
			this.callService(config, this.onRecalculateServiceTerms, this);
		}
	} else if (this.get("ResponseDate")) {
		this.set("ResponseDate", null);
		this.set("SolutionDate", null);
	}
},

 

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

Коллеги, доброго дня!

Есть такой базовый элемент бизнес-процессов "Создать задачу". В дизайнере процессов можно от него нарисовать условные потоки, которые аналитик заполняет возможными результатами из справочника "Результаты Активности".

Каким образом можно настроить аналогичную автоматизацию для пользовательского элемента бизнес-процессов? Либо где посмотреть, как это уже реализовано для элемента "Создать задачу"?

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

Нравится

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

Я не совсем понимаю, что требуется, если честно, но попытаюсь помочь :)

Возможно этот скрин поможет. Небольшой БП (чисто для примера не перенасыщал его дополнительными проверками и т.д.). Первая задача звучит так "Выяснить тип потребности в продаже". Менеджер вносит выбирает нужное значение в продаже, жмакает "Выполнена" и после этого мы читаем эту же продажу и в зависимости от того, что нужно клиенту, идем в нужную ветку и выполняем дальше задачи связанные с этим типом потребности. Если это не то, что Вам нужно, то объясните еще раз Ваш кейс :)

Добрый день!



Пример реализации данной логики в элементе "Выполнить задачу" Вы можете посмотреть открыв исходный код элемента "ActivityUserTask".

А можно чуть поподробнее, какой именно метод отвечает за указанный функционал?

Анна Журавель пишет:

Добрый день!

Пример реализации данной логики в элементе "Выполнить задачу" Вы можете посмотреть открыв исходный код элемента "ActivityUserTask".

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

Добрый час суток!

Немного не могу понять как построить запрос на UPDATE в мобильном приложении.

Например я хочу сделать такой запрос SQL

UPDATE TEST SET IsChecked = 1 WHERE Question = '' and Answer = ''

Я делаю так:

        var filters = Ext.create("Terrasoft.Filter", {

                type: Terrasoft.FilterTypes.Group,

                logicalOperation: Terrasoft.FilterLogicalOperations.And

            });

        filters.addFilter(Ext.create("Terrasoft.Filter", {

                property: "Question ",

                value: multiAnswerId // тут Id Question (для фильтра как выше)

        }));

        filters.addFilter(Ext.create("Terrasoft.Filter", {

                property: "Answer ",

                value: answerVariantId // тут Id Answer(для фильтра как выше)

        }));

        var sql = Terrasoft.Sql.UpdateBuilder.build({

                model: "Test", //Таблица в которую хочу сделать запрос

                queryConfig: queryConfig, //что это ?

                record: record, // что это?

                filter: filters,// это у меня есть

                includeOnlyModifiedColumns: true // что это?

        });

        sqls.push(sql);

        

Подскажите пожалуйста,как мне в мой обьект который я бросаю (var sql = ...) добавить по сути SET IsChecked =1 ? Ведь фильтры я уже сделал,а как сформировать немного не пойму.. может мне даже QueryConfig и includeOnlyModifiedColumns вообще ну нужны ? и достаточно как то константами сделать ? Спасибо заранее!

Нравится

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

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

Вот пример фильтрации и перебора:

// Создание экземпляра хранилища для данных модели Contact.
var store = Ext.create('Terrasoft.store.BaseStore', {
    model: 'Contact'
});
 
// Создание конфигурационного объекта с дополнительными параметрами запроса на выборку данных.
var queryConfig = Ext.create('Terrasoft.QueryConfig', {
    // Определение колонок, которые будут возвращены в запросе.
    columns: ['Name', 'Id', 'Account'],
    // Имя модели, к которой выполняется запрос.
    modelName: 'Contact'
});
 
// Загрузка данных в хранилище. Будет возвращена первая страница данных.
store.loadPage(1, {
    queryConfig: queryConfig,
    // Дополнительно указывается фильтрация возвращаемых данных по колонке Name.
    filters: Ext.create('Terrasoft.Filter', {
        // Имя колонки, по которой выполняется фильтрация.
        property: 'Name',
        // Значение для фильтрации.
        value: 'Test Name'
    }),
    // Функция обработки результатов выполнения запроса.
    callback: function(records, operation, success) {
        // Получение первой записи возвращенного набора.
        var loadedRecord = records[0];
        if (loadedRecord) {
            // Получение значения поля Account.
            var contactAccount = loadedRecord.get('Account');                                                                                                    
            if (contactAccount) {                                                                                                                   
                // Выполнение действий с полученным значением.
            }
        }
    },
    scope: this
});

Вот пример изменения и сохранения записи (но новой, а не существующей):

var record = Ext.create('Contact');
record.phantom = true;
//свойство модели phantom указывает на то, новая ли это запись или существующая
record.set('Name', 'New Contact');
 
record.save({
    success: function() {
        ...
    },
    failure: function(exception) {
        Terrasoft.MessageBox.showException(exception);
    },
    queryConfig: Ext.create('Terrasoft.QueryConfig', {
        modelName: record.self.modelName,
        columns: ['Name']
    }
}, this);

 

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

var store = Ext.create('Terrasoft.store.BaseStore', {

            model: 'SuInterviewAnswerChoice'

        });

        var queryConfig = Ext.create('Terrasoft.QueryConfig', {

            columns: ['SuInterviewQuestion', 'SuAnswer', 'SuIsChecked'],

            modelName: 'SuInterviewAnswerChoice'

        });

        

        store.loadPage(1, {

            queryConfig: queryConfig,

            filters: Ext.create('Terrasoft.Filter', {

                property: 'SuInterviewQuestion',

                value: multiAnswerId

            }),

            callback: function(records, operation, success) {

                for(var i =0; i<records.length;i++){

                    if(records[i].data.SuAnswer === answerVariantId){

                        var isChecked = records[i].get('SuIsChecked');

                        if(!isChecked){

                            records[i].set('SuIsChecked',true);

                            records[i].save({

                                success: function() {

                                    console.log('Successfully');

                                },

                                failure: function(exception) {

                                    Terrasoft.MessageBox.showException(exception);

                                },

                                queryConfig: Ext.create('Terrasoft.QueryConfig', {

                                    modelName: records[i].self.modelName,

                                    columns: ['SuIsChecked']

                                })

                            }, this);

                            return;

                        }

                    }

                    

                }

            },

            scope: this

        });

 

 

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

Зверев Александр,

да,меняет. Поле ModifiedOn меняется. Подскажите пожалуйста еще,как правильно написать Insert,спасибо!

Зверев Александр, Просто документации по мобилке в плане этого очень мало.обрываю исходники пишу по примерам +- но синхронизация так и не появляется.

Зверев Александр пишет:

Вот пример изменения и сохранения записи (но новой, а не существующей):


 
var record = Ext.create('Contact');
record.phantom = true;
//свойство модели phantom указывает на то, новая ли это запись или существующая
record.set('Name', 'New Contact');
 
record.save({
    success: function() {
        ...
    },
    failure: function(exception) {
        Terrasoft.MessageBox.showException(exception);
    },
    queryConfig: Ext.create('Terrasoft.QueryConfig', {
        modelName: record.self.modelName,
        columns: ['Name']
    }
}, this);

или я так понимаю вот это можно использовать вместо InsertBuilder?

 

Да, лучше вместо InsertBuilder использовать редактирование и сохранение записи.

Зверев Александр,Спасибо

Зверев Александр,

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

Зверев Александр пишет:

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

Вот пример фильтрации и перебора:


 
// Создание экземпляра хранилища для данных модели Contact.
var store = Ext.create('Terrasoft.store.BaseStore', {
    model: 'Contact'
});
 
// Создание конфигурационного объекта с дополнительными параметрами запроса на выборку данных.
var queryConfig = Ext.create('Terrasoft.QueryConfig', {
    // Определение колонок, которые будут возвращены в запросе.
    columns: ['Name', 'Id', 'Account'],
    // Имя модели, к которой выполняется запрос.
    modelName: 'Contact'
});
 
// Загрузка данных в хранилище. Будет возвращена первая страница данных.
store.loadPage(1, {
    queryConfig: queryConfig,
    // Дополнительно указывается фильтрация возвращаемых данных по колонке Name.
    filters: Ext.create('Terrasoft.Filter', {
        // Имя колонки, по которой выполняется фильтрация.
        property: 'Name',
        // Значение для фильтрации.
        value: 'Test Name'
    }),
    // Функция обработки результатов выполнения запроса.
    callback: function(records, operation, success) {
        // Получение первой записи возвращенного набора.
        var loadedRecord = records[0];
        if (loadedRecord) {
            // Получение значения поля Account.
            var contactAccount = loadedRecord.get('Account');                                                                                                    
            if (contactAccount) {                                                                                                                   
                // Выполнение действий с полученным значением.
            }
        }
    },
    scope: this
});

 

Работайте асинхронно, через callback.

Зверев Александр,

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

Основная логика bpm'online реализуется в веб-версии, мобильная имеет вспомогательное применение, её SDK не настолько подробен и не включает всех возможных сценариев. Если у Вас есть необходимость в какой-то логике, которую не реализовать иначе, можете завести идею, описать там подробно своё пожелание и, возможно, в новых версиях такое реализуют.

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