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

К примеру. У детали "продукт в заказе" можно добавить поле "тип продукта". Которое будет информационным.

Как только мы делаем деталь с редактируемым реестром, мы уже не можем так сделать, у нас есть только те поля которые мы имеем.

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

Нравится

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

1) Осуществлять запросы в БД (ESQ запрос), например если Вам необходимо получить какое либо значение из текущей карточки (в которой деталь находиться), то в коде выполняемом в окружении детали всегда доступно значение

this.get("MasterRecordId")

Которое возвращает Вам то поле по которому деталь связана с карточкой (как правило это ее Id).
По нему - ESQ запросом можно получить уже любые данные из карточки (сохраненные на данный момент в БД)
2) Публикация события-запроса, подписка на событие-ответ, публикация события-ответа происходит в подписке на событие-запрос в необходимых вам схемах других объектов (н/п карточки, других деталях)
в событие-ответ передаются необходимые данные. (в виде JS-объекта вторым аргументом в вызове метода this.sundbox.publish)

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

Каким образом можно привязаться на заход пользователя в систему? В частности нужно изменять значение системной настройки. По сигналу от SysAdminUnit (поля LoggedIn) в БП не выходит, очевидно потому-что значение поля задается не через Entity.

Нравится

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

Здравствуйте, Олег!

При входе пользователя в систему запускается процесс GetRemindingCounter. Аналогично можно запустить ваш процесс.
Как вариант можно создать триггер на объект SysAdminUnit, который будет менять значение в таблице SysSettingsValue.

Сделал триггером, только на таблицу SysUserSession на добавление записи, т.к. в SysAdminUnit значение LoggedIn не всегда соответствует действительности.

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

Стоит задача расширить поле "Решение" статьи БЗ от "края до края" для мониторов с разрешением 1920x1080. В принципе можно подключить свой модуль с CSS, и указать

#KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout-item-KnowledgeBasePageV2NotesContainer{
        width: 110% !important;
}

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

Нравится

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

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

body[OldUI=false] .center-main-container .grid-layout-row {
  max-width: 140em;
}

Вы можете переопределить базовый для нужного раздела, только укажите дополнительный селектор, чтобы не перекрыть логику ВСЕХ карточек. Например: data-item-marker="KnowledgeBasePageGeneralBlock"

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

@media (min-width: 1920px) {
	width: 110% !important;
}

Здравствуйте,
Вам нужно классу grid-layout-row ts-box-sizing
Во вложенности под id KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout
Сбросить стиль max-width в none;
Тогда нужное поле будет во всю ширину на любых разрешениях.

Сбросил max-width в none, теперь не нужно указывать конкретное разрешение. Приведите пожалуйста пример как переопределить свойство класса во вложенности по id? Не смог разобраться, и сделал пока так:

#KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout > div{
	max-width: none;
}

Извиняюсь, под #KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout и нет id, так что вариант с #KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout > div идеальный :twisted:

Если Вам требуется на всю ширину экрана, можете не заморачиваться с @media селекторами
Используйте специальные CSS единицы измерения Viewport Units: vw (1/100 процентное отношение к текущей ширине окна браузера) и vh (1/100 процентное отношение к текущей высоте окна браузера).

width: 100vw
В таком случае вне зависимости от размера экрана - элемент будет занимать всю доступную ширину окна, будьте внимательны с текущим значением box-sizing от чего будет зависеть будут ли в размер элемента включаться его border и margin в зависимости от этого иногда установка 100vw может привести к появлению горизонтальной полосы прокрутки, в таком случае необходимо будет или дополнительно скорректировать отсуты/границы или установить чуть меньшее значение в vw (98 - исходя из практики решает вопросы с типовыми проблемами)

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

В обновлении 7.9.1 добавили сохранение отображения дерева папок в профиль пользователя. Подскажите возможно ли сделать отображение дерева по умолчанию для новых пользователей? Сейчас по умолчанию дерево папок скрыто.

Нравится

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

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

Для настройки прав на группы, необходимо перейти в конфигурирование на вкладку "Администрирование" и найти объект "Группа базы знаний", на данный объект уже включено администрирование по записям, но права не настроены специально с расчетом на то, что кто создал группу, тот ее и видит.
Для настройки прав, чтоб при создании группы ее выдели другие пользователи, необходимо добавить правило раздачи прав по умолчанию на "Чтение", как минимум.
Например, как указано на скриншоте "2017-02-28"
В таком случае при создании группы любым пользователем, входящим в роль "Все сотрудники компании" будут розданы права всем пользователям, входящим в роль "Все сотрудники компании" и "Все пользователи портала". Это правило указано как пример, Вы можете настроить согласно Вашим требованиям.

Для того, чтоб применились Ваши правила раздачи прав на уже существующие записи в системе, необходимо выполнить два скрипта во вложении. Сначала выполнить скрипт №1, потом №2.
После, для всех уже существующих групп будут розданы права согласно правилам.

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

Здравствуйте, Олег!

К сожалению, на текущий момент данный функционал не реализован в базовой версии системы.
Мы передали Ваше пожелание в отдел разработки, для анализа возможности внедрения в будущих версиях системы.

Спасибо конечно, но я уже сделал. Может кому-то будет нужно:

initLeftSectionContainerSize: function(callback, scope) {
    Terrasoft.require(["profile!" + this.getLeftSectionContainerSizeProfileKey()],
        function(leftSectionContainerSize) {
            this.set("ShowFolders", !Object.getOwnPropertyNames(leftSectionContainerSize).length);
            this.set("LeftSectionContainerSize", leftSectionContainerSize);
            Ext.callback(callback, scope);
    }, this);
},
onGridDataLoaded: function() {
    this.callParent(arguments);
    if ( this.get("ShowFolders") ) {
        this.showFolderTree();
    }
}

ShowFolders - атрибут типа bool

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

Добрый день.
Просьба предоставить инструкцию по работе с DcmDesigner, если такая есть.

Нравится

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

Также прошу предоставить рекомендации по настройке фильтрации записей при добавлении новой стадии в индикаторе стадий?

"Коновалов Игорь" написал:

Добрый день.

Просьба предоставить инструкцию по работе с DcmDesigner, если такая есть.

Подписаться на обновления этого материала

ИзменитьУдалить

Игорь, здравствуйте!

Вся доступная информация есть на Академии - https://academy.terrasoft.ru/documents/technic-bpms/7-9/dizayner-keysov

"Коновалов Игорь" написал:

Также прошу предоставить рекомендации по настройке фильтрации записей при добавлении новой стадии в индикаторе стадий?

Игорь, если я правильно понял, то каждая новая стадия равна новому значению в соответствующем справочнике, например, в "Стадия лида". То для фильтрации выбрать необходимую стадию, чтобы отфильтровать записи в разделе (https://academy.terrasoft.ru/documents/sales-enterprise/7-9/standartnyy…).


Рис. 1


Рис. 2

"Вильшанский Дмитрий" написал:Игорь, если я правильно понял, то каждая новая стадия равна новому значению в соответствующем справочнике, например, в "Стадия лида". То для фильтрации выбрать необходимую стадию, чтобы отфильтровать записи в разделе (https://academy.terrasoft.ru/documents/sales-enterprise/7-9/standartnyy-...).

Здравствуйте, Дмитрий. Вы не правильно поняли. Мне нужно отфильтровать поле "Значение стадии в справочнике" в свойствах новой стадии в Дизайнере кейсов

Здравствуйте, Игорь!

Описание настройки DCM вы можете найти по ссылке:
https://academy.terrasoft.ru/documents/technic-bpms/7-9/dizayner-keysov

При настройке DCM вы самостоятельно настраиваете доступные переходы между стадиями. Подробнее описано в Академии.

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

Здравствуйте, Игорь!

Детализируйте, пожалуйста, бизнес-кейс.

В справочнике "Стадии обращения" добавлено справочное поле "Категория обращения" и необходимо для разных категорий обращения построить свой dcm индикатор. Т.е. при добавлении новой стадии в индикатор в дизайнере кейсов фильтровать поле "Значение стадии в справочнике" в настройках новой стадии.

Игорь, здравствуйте!

Теперь ваша задача стала ясна. К сожалению, в версиях продукта 7.9.0, 7.9.1 этот функционал не предусмотрен. Однако он будет доступен в базовой версии продукта в версии 7.10.0 - при настройке DCM будет возможность выбрать поле типизации DCM. Далее для каждого значения из поля типизации можно будет создать свой DCM.

Спасибо. Будем ждать :)

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

Задача следующая: при настройке прав доступа на группу статей в базе знаний, раздавать те же права на все подгруппы в ней (а так же все статьи им соответствующие).
Замещать модуль Rights или RightUtilities (и создать свой сервис, унаследовавшись от RightsHelper) не хочется, т.к. при его изменении в последующих обновлениях пришлось бы постоянно переписывать замещающий модуль.
Лучшим решением казались триггеры в БД на INSERT для таблицы [SysKnowledgeBaseFolderRight]. Я использовал два курсора (один вложен в другой) для перебора записанных строк, и подгрупп для каждой группы. Но если уровень подгрупп больше 1, триггер не отработает т.к. пытается по сути объявить курсор, который уже объявлен.
Да и каким образом с помощью триггера раздавать права на статьи в группах не имею представления.
Есть ли еще варианты, или все-таки придется замещать модуль Rights (RightUtilities)?

Нравится

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

Примерный(костыльный вариант):
1) расковырять схему Rights. В методе onSaveClick

RightUtilities.applyChanges({
	"recordRights": changedRights,
	"record": {
		entitySchemaName: this.get("entitySchemaName"),
		primaryColumnValue: this.get("primaryColumnValue")
	}
}, this.onChangesApplied, this);

т.е у нас есть список прав, название схемы с фильтрами в entitySchemaName, id фильтра в primaryColumnValue.
По идее, если entitySchemaName === "KnowledgeBaseFolder", то запускаем свою логику по изменению прав записей
2) Выбираем из KnowledgeBaseFolder вложенные папки, где ParentId = Id главной папки, получаем коллекцию, бежим по каждой записи
3) Для каждого элемента вставляем/удаляем запись в таблицу SysKnowledgeBaseFolderRight. Значения берем из переменной changedRights с п1.

Для записей еще жестче:
п1. такой же
2) Выбираем из KnowledgeBaseFolder фильтр по id, который мы знаем из предыдущего пункта, нужна колонка SearchData. Там лежит мусор) Весь вопрос как этот хлам преобразовать в сериализованый(или нет) фильтр.
3) Выбираем из KnowledgeBase все записи с фильтром из п2, получаем коллекцию, бежим по каждому элементу коллекции.
4) Для каждого элемента из базы знаний вставляем/удаляем запись в таблицу SysKnowledgeBaseRight. Значения берем из переменной changedRights с п1.

как-то так :smile:

upd. Только что проверил, в п2. берем entity по id, потом

var folderFilter = Terrasoft.deserialize(result.entity.values.SearchData);

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

Спасибо за ответ :smile:
В принципе я, не найдя другого решения, делаю примерно тоже самое. Заместил модуль RightUtilities, в котором меняю вызываемый сервис на свой в методе callServiceMethod, если вызывается метод "ApplyChanges".
Далее уже на сервере проверяю имя схемы, и если это KnowledgeBaseFolder - рекурсивно прохожусь по всем подпапкам раздавая права, а также выбираю фильтры у каждой, десериализуя их и раздавая права на статьи.
Старался максимально вынести функционал на сервер. Таким образом при обновлении версии/билда если изменится RightUtilities - придется добавить в него всего одну строку. А на сервере я создаю экземпляр класса RightsHelper и вызываю у него метод ApplyChanges, как это делается в базовом RightsService (что в принципе устойчиво к обновлениям).

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

Версия
7.9.1.3284
Нужно добавить в БП звонок-элемент чтобы его привязать к активностям и другим объектам.

Нравится

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

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

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

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

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

Вы можете настроить процесс:
1. Стартовый сигнал по изменению записи в звонке, где Активность заполнена.
2. Читать данные в активности, где Id = Пункт 1. Активность.
3. Раздать права доступа на активность, где Id = Пункт 2. Id
4. Открыть страницу редактирования активности, где Id = Пункт 2. Id

Хорошо, это сделаю, но как настроить видимость кнопок звонка и эмейла в миникарточке активности, они создаются динамически. (две кнопки ля контакта и две для контрагента)

Добрый день!

Не могли бы Вы прикрепить скриншот Вашей миникарточки и код создания данных кнопок?


Вот карточка, кнопки базовые(есть еще емейл но в контакте его нет и тут его не видно)

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

Логика данной миникарточки находится в UIv2.ActivityMiniPage. Кнопки добавляются при ее создании(методы init и onEntityInitialized). Логика отображения кнопок находится в UIv2.MiniPageEntityConnectionsUtils и NUI.EmailExtendedMenu и работает именно так как Вы описали - при создании миникарточки формируется EntitySchemaQuery запрос в базу данных, и если у данного контака(контрагента) заполнена колонка телефон(e-mail) кнопка будет добавлена. Если таких данных нет - не будет и кнопки.

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

Добрый день.
Развернул on-site BPMOnline 7.9.0.1228. Настроил Https.
Сайт работает нормально, но смущает в ошибка в консоли:

Uncaught ReferenceError: calq is not defined.

Подскажите, пожалуйста, что за ошибка и как её побороть?

Нравится

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

Здравствуйте, Игорь!

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

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

Здравствуйте.
Возникла проблема при добавлении на страницу мобильного приложения, например Контрагента, действия с созданием новой активности. В недрах кода MobileAccountModuleConfig пакета Mobile нашёл нечто похожее с использованием функции Terrasoft.sdk.Actions.add, но её описания нигде не нашёл. Быть может кто обладает им... В частности, есть атрибут actionClassName, что он означает, и как с ним работать. Был бы благодарен за пример...
Дополнительно, за что отвечает переменная UseMobileUIV2?

Нравится

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

Павел, здравствуйте!

Terrasoft.sdk.Actions.add – это метод, который позволяет добавить действие в раздел (рис. 1-2). Примеры реализаций прикрепил к комментарию.


naznachitvstrechu.doc
polzovatelskoedeystvie.doc

UseMobileUIV2 – это системная настройка, которая необходима если выходите использовать новую платформу V2.

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

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

Добрый день.

В ходе разработке на платформе, у меня возникла задача создания разных "Кейсов" в зависимости от справочного поля, в разделе "Продажи".

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

С уважением,
Александр

Нравится

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

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

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

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

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

Тип потребности=="Программное обеспечение" в дизайнере отображены вот эти стадии:
"Квалификация->Презентация->Коммерческое предложение..."
https://yadi.sk/i/U7CRVIfp38ChcL

Тип потребности!="Программное обеспечение" в дизайнере - эти стадии:
"Анализ потребностей->Подготовка предложения->Отправка опытных образцов..."
https://yadi.sk/i/1y-_PWog38ChZf

С уважением,
Александр

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

Вы можете настроить доступность перехода в справочнике "Доступные переходы по стадиям продажи".
Таким образом вы решите проблему перехода между стадиями.

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

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