Вопрос

Задача: загрузка изменений по контактам в bpm и слияние записей со старыми записями. Поиск дублей справляется идеально, но вручную объединять по 40 000 записей слишком долго. Можно ли как-то объединить все дубли сразу, а не нажимать на каждом в отдельности "выбрать все" - "объединить"?

У меня такой же вопрос

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

Есть дополнение Automatic duplicates merge, которое позволяет в том числе и сливать по расписанию.

1) оно платное
2) задачу сливания всех дублей может ведь решаться простым бизнесс-процессом

Можно и так. Если реализуете свой более простой процесс слияния, можете тоже его опубликовать, бесплатно или по меньшей цене.

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

Добрый день! 

Подскажите, пожалуйста, как формируется набор прав доступа для входящих писем, пришедших на общий почтовый ящик?

Рассмотрели возможные варианты:
1. Default rights на Activity

2. Allow shared access в настройках почтового ящика

3. Access rights в настройках почтового ящика

Но всё равно в письме появляется не только владелец почтового ящика (что, наверное, логично), но и All employees, от которых надо избавиться

И второй вопрос - почему на исходящие письма с общего почтового ящика не действует такое же распределение прав? Там только автор права получает

У меня такой же вопрос

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

Владимир, нужно искать в скриптах то место, где при синхронизации создаётся запись. Видимо, там выдаются и права. Смотрите в сторону LoadExchangeEmailsProcess, из него ExchangeUtility, ExchangeEmailSyncProvider, ExchangeEmailMessage. Возможно, это тут (в последней):

public Activity GetActivityInstance(SyncContext context, LocalItem localItem, EntitySchema schema,
	Exchange.EmailMessage message, string subject) {
	var instance = (Activity)schema.CreateEntity(context.UserConnection);
	SyncEntity instanceSync = GetActivityInstanceSync(context, message, subject, instance);
	if (instanceSync.Action != SyncAction.Create && !context.UserConnection.GetIsFeatureEnabled("MailboxRightsForEmail")) {
UpdateEmailRelations(context.UserConnection, instance);
	}
	localItem.AddOrReplace(schema.Name, instanceSync);
	return instance;
}

 

Краткое резюме - этих настроек оказалось достаточно. Просто, система не сразу реагировала на их изменение. И получая письма в течение нескольких минут после изменения, всё ещё действовали старые настройки.

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

TLS

Добрый день!

появилась ли возможность использования TLS в 7.11?

в 7.12? если да, то где можно ознакомиться с описанием?

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

Вопрос:

Можем ли мы такое реализовать в bpm?

Как это можно реализовать? 

 

У меня такой же вопрос

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

TLS — протокол на смену SSL. В bpm'online должен поддерживаться. Как настроить HTTPS в IIS для сайта — описано тут.

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

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

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

1. Создается объект UsrVwTest , который наследуется от базового, в нем не добавляется ни одного поля (в view будет 1 колонка с идентификаторами контакта), у него устанавливается признак, что это представление в базе, он сохраняется и публикуется.

2. После этого, через расширение SqlExecutor выполняется что-то в духе

create view UsrVwTest as select top 1 Id as 'Id' from Contact

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

var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "UsrVwTest" });
esq.addColumn("Id");
esq.getEntityCollection(function (result) {
	if (!result.success) {
		// обработка/логирование ошибки, например
		this.showInformationDialog("Ошибка запроса данных");
		return;
	}
	console.info(result.collection.getCount());
}, this);

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

После этого я повторяю тот же алгоритм на on-site проекте 7.11, в том же порядке. После этого я на аналогичное обращение к view из консоли получаю 500 (InvalidObjectStateException). Запрос в Network падает также с кодом "ErrorCode":"InvalidObjectStateException". Обработка результата падает в ветку с !result.success. Пробовал дополнительно компилировать конфигурацию на разных этапах алгоритма, создавать view различными способами (напрямую в базе, через установку скрипта в конфигурации и т.д.), получаю тот же ответ. Названия view в базе и в конфигурации совпадают, название и количество колонок тоже.  Кроме того, на проекте уже есть view, реализованные ранее, с которыми ведется работа, они реагируют по-разному. Некоторые так же выдают 500, некоторые послушно пишут количество записей внутри себя. 

Резюмируя, мог бы кто-то подсказать, в чем может быть проблема или какой единственно верный алгоритм реализации такой связки? Поиск по статьям привел меня именно к тому алгоритму, который заработал на демо-стенде, но упорно не хочет работать на on-site площадке. 

У меня такой же вопрос

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

Поправка:

По всей видимости, все уже существующие представления ошибок не вызывают. Случаи, когда запрос к ним из консоли выдает 500 - превышение 20 000 записей на выгрузку. 

 

Все получилось. Оказалось, что view нужно создавать именно как dbo.ViewName, а не просто ViewName, иначе InvalidObjectName

 

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

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

У меня такой же вопрос

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

Выдачу прав в зависимости от типа можно сделать при помощи БП, срабатывающего при вставке. А невозможность добавить нужного типа — или кодом дорабатывать, или включить в объекте справочника администрирование по записям и выдать права.

Спасибо, можете, подробнее пояснить как задать права на определенный тип объекта, в Управлении Конфигурацией увидел права ко всему объекту, 

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

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

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

Возможно ли в разделе динамически менять entitySchemaName?

Допустим в фильтр добавить кнопку, по нажатию на которую перегружать грид данными другого объекта?

У меня такой же вопрос

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

Скорее всего вы столкнётесь с тем, что колонки будут настроены неправильно. Может лучше 2 грида? 

Варфоломеев Данила,

Данила, там пока не понятно, сколько их может быть.. вот и хотелось бы прояснить разные варианты.

Если данные из разных разделов однотипной структуры, можно сделать в базе view с кучей union из разных таблиц и работать с ней, как с обычной сущностью, при необходимости фильтруя. В Terrasoft 3.Х такой подход использовался в окне уведомлений, где выводилась информация о записях разных разделов, включая самодельные.

Ближайший аналог - это, наверно, журнал изменений.

https://academy.terrasoft.ru/sites/default/files/documents/docs/product…

Там переключение сделано в интерфейсе 5.Х на странице реестра ChangeLogGridPage. Логика загрузки данных при смене схемы реализована в функции InitializeDataSourceCurrentStructure.

Но в 7.Х движок страниц реестра совсем другой.

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

Доброго времени суток!

Существует следующая проблема:

В реестре [Обращения] выделяются сообщения от VIP клиентов, но при выборе этих строк в реестре, они перекрашиваются в дефолтный голубой цвет (цвет выделенной строки). Каким образом можно осуществить замену дефолтного цвета активной строки реестра на тот, что мне нужен, в зависимости от того, является ли клиент VIP или нет. Где определяется стиль выделенной строки реестра?

У меня такой же вопрос

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

Есть бесплатное дополнение «Records color highlighting».

1) Оно абсолютно не решает текущую задачу
2) Оно не работает с логическими полями (только со справочными)

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

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

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

В css выделенная запись задаётся стилем grid-row-selected, там явно прописан этот цвет.

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

Похожая задача и похожая проблема ( https://community.terrasoft.ru/questions/zapros-ne-vozvrasaet-znacenie ). Используя запрос:

var vip = 0;
var recordId = item.get("Id");
var esqCase = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Case"
});
esqCase.addColumn("UsrVIPobr");
esqCase.getEntity(recordId, function(result) {
if (result.success) {
vip = result.entity.get("UsrVIPobr");
}
}, this);

Получаю корректный Id (по базе находится нужное обращение с нужным id и полем UsrVIPObr). В карточке обращения есть логическое поле UsrVIPobr (1 или 0), но почему-то переменная vip не меняется. Прошу помочь разобраться. 

У меня такой же вопрос

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

Быстров Сергей,

Добро пожаловать в мир async вычислений, коллбеков и промисов)

Вам надо весь код(который за скриншотом) перенести в коллбек-функцию getEntity. грубо говоря:

var vip=null;
esq.getEntity(id, function(p) {
     //тут vip будет не null
     var vip=...;
 
     if (vip) {....}
}, this);
//тут vip все ещё null, следующие строки кода отработают ДО результата функции getEntity
var a = ...;
....

 

То, что у вас скриншот обрывается на esq.getEntity - уже подозрительно :)

Вы используете переменную vip после выполнения getEntity?

Варфоломеев Данила,

Да, используется для сравнения с константой

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

Быстров Сергей,

Добро пожаловать в мир async вычислений, коллбеков и промисов)

Вам надо весь код(который за скриншотом) перенести в коллбек-функцию getEntity. грубо говоря:

var vip=null;
esq.getEntity(id, function(p) {
     //тут vip будет не null
     var vip=...;
 
     if (vip) {....}
}, this);
//тут vip все ещё null, следующие строки кода отработают ДО результата функции getEntity
var a = ...;
....

 

А есть какие-то безболезненные способы заставить работать код в синхронном режиме?

Быстров Сергей,

нет. только упаковать всё в Terrasoft.chain (те же коллбеки, только в более удобоваримом виде)

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

Есть такой пример в Документации:
Для раздела [Заказы] реализовать выделение тех записей реестра, которые находятся на стадии [Исполнение].

Подскажите: как определять константы для других разделов (интересует выделение Обращений в реестре по их приоритету)?

В этом примере проверятся по стадии [Исполнение] в разделе [Заказы]:

if (running.value === OrderConfigurationConstants.Order.OrderStatus.Running)

 

У меня такой же вопрос

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

Возможно несколько вариантов.

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

2. Либо сразу же сравнивать с нужным значением Id записи в справочнике приоритетов обращений.

Id нужных значений записей можно получить из базы данных.

Если у Вас приложение on-site, то заходите на сервер баз данных и пишите запрос к таблице CasePriority и получаете нужные значения, если on-demand, то можно обратиться за помощью в службу поддержки.

Также можно себе в конфигурацию установить бесплатное приложение SQL Executor, с помощью которого можно получить значения из нужной таблицы непосредственно из приложения bpm'online.

А вообще, очень похоже, что для Вашей задачи подойдет другое бесплатное приложение Records color highlighting.

Дополнение "Records color highlighting" облегчает навигацию по записям в разделах bpm'online, фокусируя внимание пользователя на элементах, выделенных цветом по предварительно настроенному правилу. Для создания правила выделения можно использовать одно из справочных полей в любом разделе bpm'online и широкую цветовую палитру.

Возможно несколько вариантов.

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

2. Либо сразу же сравнивать с нужным значением Id записи в справочнике приоритетов обращений.

Id нужных значений записей можно получить из базы данных.

Если у Вас приложение on-site, то заходите на сервер баз данных и пишите запрос к таблице CasePriority и получаете нужные значения, если on-demand, то можно обратиться за помощью в службу поддержки.

Также можно себе в конфигурацию установить бесплатное приложение SQL Executor, с помощью которого можно получить значения из нужной таблицы непосредственно из приложения bpm'online.

А вообще, очень похоже, что для Вашей задачи подойдет другое бесплатное приложение Records color highlighting.

Дополнение "Records color highlighting" облегчает навигацию по записям в разделах bpm'online, фокусируя внимание пользователя на элементах, выделенных цветом по предварительно настроенному правилу. Для создания правила выделения можно использовать одно из справочных полей в любом разделе bpm'online и широкую цветовую палитру.

Остается только один не решенный вопрос - как обратиться к колонке, которой нету в отображении Реестра, но есть в самом обращении. Используемый код:

var vip = item.get("нужная колонка");
if (vip.value === *константа*) {
item.customStyle = {
"color": "black",
"background": "#A52A2A"
};

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

Можно брать Id обращения и получать значение нужной колонки из базы.

Быстров Сергей,

В смысле? Добавляете её, когда формируется запрос на выборку в реестр (см addGridDataColumns из GridUtilities). Далее в updateLoadedGridData точно будет ваша колонка в выборке.

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

Добрый день!

 Нужно загрузить в систему объекты связанные с Контрагентом. Например, договоры.

мы можем подготовить 2 файла.

1 с данными о контрагентах, другой с данными о договорах.

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

можно ли настроить импорт так, чтобы поиск справочных полей был по кастомным полям, например, по ИНН и КПП?

то есть в файл по договорам добавляем 2 столбца и при загрузке по этим двум столбцам  находится потребитель

 

У меня такой же вопрос

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

Насколько я знаю, то система позволит Вам обратиться к одному полю в контрагенте, чтобы определить его уникальность. Например, к полю ИНН. (но оно ведь не всегда уникально). Так что, придется по другому полю проверить уникальность или убедиться, что все ИНН уникальны. А потом, когда сопоставляю колонки договора при импорте с моим файлом excel, при выборе контрагента "проваливаюсь" в него плюсиком и ищу там ранее проимпортированное поле с кодом.

Насколько я знаю, то система позволит Вам обратиться к одному полю в контрагенте, чтобы определить его уникальность. Например, к полю ИНН. (но оно ведь не всегда уникально). Так что, придется по другому полю проверить уникальность или убедиться, что все ИНН уникальны. А потом, когда сопоставляю колонки договора при импорте с моим файлом excel, при выборе контрагента "проваливаюсь" в него плюсиком и ищу там ранее проимпортированное поле с кодом.

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