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

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

BPMonline 7

подскажите можна ли в схему представления карточки и в схему представления детали добавить свой MESSAGE чтобы делать публикацию/подписку с помощю sandbox?

Нравится

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

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

Переадресовал обращение в департамент разработки. В ближайшее время ожидаем рекомендаций.

Владимир, ответ от разработки следующий:

На данный момент такое невозможно, поскольку у модулей есть список сообщений с которыми этот модуль работает (для детали они определяются не в схемах а в DetailModule, соответственно, доступны только сообщения которые выведены в нём).
1. Можно этот модуль переопределить, но при этом потеряется обновление исходного кода модуля и это не самый лучший вариант;
2. На стороне клиента динамически дописать в определение DetailModule нужное сообщение, но это не очень хороший вариант поскольку использует недокументированные возможности.

Максим, меня как раз интересует возможность дописать динамически нужное сообщение.

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

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

//Получение существующего дескриптора модуля ViewModule
var description = core.getModuleDescriptor("ViewModule");
//Добавление нового широковещательно сообщения на подписку
description.messages.MyMessage = {direction: "subscribe", mode: "broadcast"}
//Установка  нового описания для модуля (тут можно положится на ссылочный тип переменной description, но лучше установить явно, чтобы не зависеть от реализации метода ядра getModuleDescriptor)
core.setModuleDescriptor("ViewModule", description)

спасибо, Максим!

все получилось :wink:

Показать все комментарии
GridArea
недопустимое имя компонента
новая колонка
Технические вопросы
Разработка

При добавлении новой колонки в GridArea выскакивает сообщение с ошибкой (см. приложенный скриншот) при попытки сохранения сервиса. Сохранить сервис с новой колонкой никак не удаётся.

Нравится

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

Здравствуйте, Алексей!
Выглядит, как будто проблема не в указанной колонке, а в двух других. Перепроверьте, пожалуйста!

Здравствуйте, Андрей!
Ага, спасибо, заметил:twisted:

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

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

Нравится

1 комментарий
5.x
рассылка
Технические вопросы

При рассылке отправляется несколько писем, для остальных пишет:
"Socket connection was aborted by remote host."

Я так понимаю некий сервер воспринимает эту отправку как спам и блокирует отправку писем. Верно? Если так, то можно ли сделать отправку писем через некий интервал, например 20 сек?

Вот скрин: http://joxi.ru/Q7oZUxjKTJCJTP3O9-k

Нравится

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

Здравствуйте, Илья!

Попробуйте выставить большее значение в системной настройке SMTP TimeOut:

http://i.piccy.info/i9/7e0738ab20163a772b0952cf09ecbef9/1394201818/18591/710520/07_03_2014_16_16_23.png

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

"Безродный Андрей" написал:

Здравствуйте, Илья!

Попробуйте выставить большее значение в системной настройке SMTP TimeOut:

http://i.piccy.info/i9/7e0738ab20163a772b0952cf09ecbef9/1394201818/18591/710520/07_03_2014_16_16_23.png

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

поставил 40 сек, ошибка осталась.

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

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

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

Заранее спосиба.
С уважением,
Гюнель

Нравится

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

Здравствуйте, Гюнель!

Для этого необходимо:

1) В разделе Администрирование-Доступ к объектам активировать Администрирование по записям для объекта «Группа контакта» (контрагента, активности – выбрать необходимый раздел):

2) На детали «Доступ к записям по умолчанию» определить необходимые права доступа. Если на детали «Доступ к записям по умолчанию» нет ни одной записи – все будущие группы в данном разделе будут доступны только автору (т.е. пользователи будут видеть только свои группы).

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

Здравствуйте!
Два вопроса по администрированию пользователей
1. Ограничить доступ к вкладке, к примеру, "Маркетинг"
2. Закрыть для обычных пользователей детали "входит в группы", "взаимосвязи"

Нравится

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

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

1. Управлять доступом непосредственно на Рабочие места не получится. Но, ограничив доступ на все разделы в данном рабочем месте, рабочее место пропадет из представления автоматически.

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

http://i.piccy.info/i9/76d41e545a17a7d24655b93a5f460751/1394111483/106822/710520/1.jpg

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

http://i.piccy.info/i9/507a190ab560e5b050ff65b5f29678f5/1394122797/31652/710520/06_03_2014_18_19_37.png

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

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

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

Если объект раздела администрируется по записям, то в разделе появляется деталь "Доступ". Это заложено в ядре.

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

Guid roleId = new Guid("83A43EBC-F36B-1410-298D-001E8C82BCAD"); //системные администраторы
Guid currentUserId = UserConnection.CurrentUser.Id;
var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "SysUserInRole");
esq.AddColumn("Id");
esq.AddColumn("SysRole");
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.NotEqual, 
                "SysUser", currentUserId));
var rolesCollection = esq.GetEntityCollection(UserConnection);
foreach(var role in rolesCollection) {
                if (role.GetTypedColumnValue<Guid>("SysRoleId") == roleId) {
                               for (var i = 0; i != Page.DetailsTabPanel.Tabs.Count - 1; i++) {
                                               if (Page.DetailsTabPanel.Tabs[i].Caption.ToString() == "Доступ") {
                                                               Page.DetailsTabPanel.Tabs[i].Visible = false;
                                               }
                               }
                }
}
return true;

"Безродный Андрей" написал:

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

Эмин, необходимо выгрузить данные, сами они туда не попадут.
На событии PageLoadComplete следует получить экземпляр источника данных, при необходимости наложить фильтры и выполнить LoadRows().
Очень наглядный пример есть в методе PrepareSchedule(), процесса страницы ManagersModulePage.

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

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

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

Вот этот код перебирает все выделенные записи в реестре.

for (var i = 0; i Page.TreeGrid.SelectedNodes.Count; i++) {

...

 }

Дорогие знатоки, как сделать так, чтобы перебирались все записи выборки?

Нравится

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

Здравствуйте, Илья!
Получить записи выборки можно закрузив строки в источник данных, а затем перебрать их.

Page.TreeGrid.DataSource.LoadRows();
foreach (var row in Page.TreeGrid.DataSource.Rows)
{
     //TODO
var name = row.GetTypedColumnValue<string>("Name"); //обращение к колонке
}

"Андрей Каспаревич" написал:

Здравствуйте, Илья!

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

Page.TreeGrid.DataSource.LoadRows();

foreach (var row in Page.TreeGrid.DataSource.Rows)

{

     //TODO

var name = row.GetTypedColumnValue<string>("Name"); //обращение к колонке

}

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки

Спасибо работает

foreach (var row in Page.TreeGrid.DataSource.Rows)

Данный код проходит только 41 запись, а например, не все 3700 записей. Как сделать чтобы по всей выборке проходил?

Здравствуйте, Илья!
Перед загрузкой данных в DataSource попробуйте установить неограниченное количество записей на странице источника данных:

Page.TreeGrid.DataSource.PageRowsCount = -1;
Page.TreeGrid.DataSource.PageRowsCount = -1;
Page.TreeGrid.DataSource.LoadRows();
foreach (var row in Page.TreeGrid.DataSource.Rows)

с таким кодом уже работает, спасибо

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

Добрый день,

Подскажите как передать table value parameter в Terrasoft.Core.DB.StoredProcedure?
по аналогии с ADO.NET
http://www.mssqltips.com/sqlservertip/2112/table-value-parameters-in-sql...

Нравится

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

Или возможно есть способ из Terrasoft.Core.UserConnection получить текущую строку подключения и использовать ее с ADO.NET?

Антон, переадресовал вопрос нашим разработчика. В ближайшее время ожидаем рекомендаций.

Спасибо за вопрос.

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

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

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

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

Здравствуйте, коллеги!
bpmonline 7

можно ли как то отлаживать скрипты отчета BPMonlineReportDesigner в момент построения?

Нравится

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

Здравствуйте, Владимир!
Отлаживать в среде программирования не получится, но можно логировать все, что требуется.
Вывод производится в файл "Common.log" так как логгер создан для типа «ScriptingNamespace.ScriptingReport»
Добавить в необходимый метод (BeforePrint) логгер

var log = global::Common.Logging.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Вывести текст выполняемого запроса

invoiceEsq.GetSelectQuery(userConnection).BuildParametersAsValue = true;
log.Debug(invoiceEsq.GetSelectQuery(userConnection).GetSqlText());

Вывод стека ошибки

try {
// код метода
} catch {
log.Debug(ex.Message, ex);
}

Настройки расположения файла лога хранятся в конфигурационном файле "../Terrasoft.WebApp/log4net.config".

Спасибо, Андрей!

Показать все комментарии
Встроенные формы
кеширование
Технические вопросы
Разработка

Добрый день!

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

Есть необходимость кешировать такую форму (сохранять в объекте) после инициализации.
Но довольно часто возникает проблема: при открытии основной формы, которая находится в объекте, вываливает Exception типа pgTest has no parent Window.

Если каждый раз инициализировать форму (не брать из объекта), то все ок.
Никто не сталкивался с таким?

Нравится

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

Вот ошибка:

Дата/Время: 27.02.2014 14:21:52
Название компьютера: ххх
Имя пользователя: ххх
Операционная система: Workstation, Build: 7601, 'Service Pack 1'
Системный язык: Русский (Россия)
Процессор: Intel, Intel(R) Core(TM)2 Duo CPU E7500 @ 2.93GHz, MMX
Видеосистема: 1680x1050 pixels, 32 bpp
Время работы системы: 0 day(s) 02:24:13.0578
Время работы программы: 0 day(s) 00:00:44.0273
Исполняемый файл: C:\Program Files (x86)\Terrasoft\Bin\TSClient.exe
Версия: 3.3.2.267
Класс исключения: EOleException
Сообщение об ошибке: Control 'pgDebitors' has no parent window

Стек вызова
Controls.TWinControl.CreateWnd ()
Controls.TWinControl.CreateHandle ()
Comctrls.TPageControl.DeleteTab ()
TSAutomationObject.TBaseAutomationObject.ObjRelease (Line 191, "TSAutomationObject.pas") ()
Comobj.TComObject._Release ()
System.@IntfClear ()
Comobj.TComObject.ObjRelease ()
TSAutomationObject.TBaseAutomationObject.ObjRelease (Line 191, "TSAutomationObject.pas") ()
Comobj.TComObject._Release ()
TSConnectionPoints.TConnectionPointDispatcher.Invoke (Line 592, "TSConnectionPoints.pas") ()
TSConnectionPoints.TConnectionPointDispatcher.Invoke (Line 592, "TSConnectionPoints.pas") ()
Comobj.DispatchInvokeError ()
Comobj.DispatchInvokeError ()

Активные элементы управления:
pcData (TInternalPages)

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

Здравствуйте!
С ходу не получится сказать, в чем проблема. Нужно смотреть на код. Возможно, после закрытия основного окна работает еще какая-то логика на вкладке.
В общем, нужны куски кода с реализацией.

Спасибо, Андрей,

Проблему вроде бы закрыл.
Воркараунд приблизительно следующий:

При закрытии основной формы удаляю с нее компонент вложенного сложного окна (контейнера окна) (остается пустой таб) и потом уже закрываю форму.
function wnd_DocumentEditOnClose(Window) {
Window.DisableEvents();
Self.RemoveComponent(wndDocumentDebitors);
Window.EnableEvents();
wnd_BaseDBEditOnClose(Window);
}

При повторном показе, если сервис берется из массива объектов (не перестраивается форма с нуля) то просто проверяю, есть ли у компонента контейнера окна родительский элемент, если нет - добавляю контейнер окна на страницу и вызываю метод Show().
...............
var DetailWindow = wndDocumentDebitors.Window;
if (!ScriptObject.IsDebitorsInitialized) {
SetAttribute(DetailWindow, 'ParentItemFieldName', 'DocumentID');
DetailWindow.Prepare();
ScriptObject.IsDebitorsInitialized = true;
}
if(!Assigned(wndDocumentDebitors.ParentComponent)){
pgDebitors.Add(wndDocumentDebitors);
DetailWindow.Show();
}
..............

Спасибо за информацию!
Рад, что у Вас получилось.

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