Доброго времени суток. В ходе внедрения BPM online была поставлена задача выводить результаты sql запроса на отдельную страницу. т.е. имеем созданную по средствам BPM страницу, на странице есть поле ФИО кнопка поиск и еще несколько полей (например телефон и дата рождения). Вопрос номер 1: как сделать так что бы при нажатии на кнопку поиска, открывалась новая страница с результатами sql скрипта привязанного к этой кнопке. Вопрос номер 2: как реализовать перенос данных из 2-й формы в первую, если мы двойным кликом выделим один из результатов нашего запроса.
Что-то похожее реализовано в карточке регистрации пользователя, когда выбираем фио пользователя из карточки контакты. Спасибо.

Нравится

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

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

есть связанный сервер, и в MSSQLе создано представление из нескольких таблиц из связанного сервера. есть sql скрипт который делает выборку из от этого представления. есть реестр регистрации обращений с кнопкой добавит, на кнопку привязана карточка регистрации нового обращения(назовем ее форма 1), в ней есть поля ФИО, дата рождения, номер телефона, адрес, остаток средств и кнопки поиск и добавить(плюс статусы, комментарии и т.д. - то есть поля которые заполняются вручную). есть вторая карточка(результаты запроса - форма 2) со списком полей (ФИО, дата рождения, номер телефона, адрес, остаток средств).
сам процесс: обращается клиент, добавляем новую запись, в первой форме в фио вводим к примеру иванов и жмем поиск, начинает отрабатывать sql скрипт который ищет всех ивановых в созданном предоставлении и результаты работы скрипта выводятся в форму 2. двойным кликом или по кнопке выбрать выбираем нужного нам иванова, все данные выбранного нами иванова из формы 2 переносятся в форму 1, после чего в форме один заполняем оставшиеся поля вручную и нажимаем кнопку добавить. после этого создается запись в реестр и все данные передаются в связанный сервер (в другую бд) для формирования документа и дальнейшей обработки информации.

Здравствуйте, Александр!
Вы говорите о создании справочного поля и наложении фильтрации для других полей (в зависимости от значения справочного поля).
Я правильно понял?
Если так, то никаких дополнительных страниц не нужно.

Нет, поля не справочные, хотя нужные данные хранятся в справочниках. Три текстовых поля. Вводим в каждое некий текст, нажимаем на созданную на форме кнопку поиск. Результат поиска получаем в отдельном окне.Пока вариант такой. Если знаете как лучше -подскажите, поиск должен проводиться по нескольким полям сразу. Про фильтры на странице выбора из справочника знаем, но нас такой вариант не устраивает. на скринах примерные формы, в первой форме в поле "фамилия" вводим иванов, в поле "имя отчество" александр и нажимаем поиск, результат выводится в форму на втором скрине и по дабл клику данные из второй формы должны заполнить поля в первой.

Александр, в таком случае можно открывать окно справочника с наложением своих фильтров.
Это можно делать с помощью действия. Посмотрите этот комментарий, есть пример открытия страницы справочника.

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

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

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

Посмотрели комментарий. А нельзя ли поподробнее код расписать, в частности откуда брать значения строковых параметров (Id документов, параметры фильтрации и т.д.). И как вообще его прикрутить к нашей странице, на какое событие вешать обработчик с кодом, как вытащить в код параметры из TextEditов. Если необходимо можем кинуть код нашей страницы.
PS: С# программиста у нас нет :(

Здравствуйте, Александр!
Обраобтчик вешается на кнопку на странице, где вводятся параметры для поиска.
Значения из TextEdit'ов берутся из свойства TextEdit'а "Value" таким образом:

var text = Page.TextEdit.Value;

UId объекта можно получить, открыв его метаданные (в разделе "Конфигурация"):

Есть много примеров наложения фильтрации и других действий в базовой конфигурации и здесь, на Comminty.
Можете посмотреть "ContactCareerEditPage", где открывается страница выбора из справочника по нажатию на кнопку "DepartamentButton".

Андрей добрый день, есть еще один вопросик, в примере в самом начале кода есть строка: var SSDocumentOfferingtId = new Guid(SysSettings.GetValue(UserConnection, "SSDocumentOfferingtId").ToString());//UID Объекта

можно подробнее описать что она делает? что в данном случае из себя представляет SSDocumentOfferingtId ? Это UID чего(объекта, страницы, справочника)?

C SSDocumentOfferingtId разобралиь, в данном случае это UID Объекта(таблицы из которой выбираем данные).

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

Здравствуйте, Александр!
Это делается в скрипте после действия.
Функция

OpenSpecOfferingLookupUserTask.GetSelectedValues(UserConnection) as Dictionary <string, object>;

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

А поподробнее можно? Как найденные значения определенных колонок справочника перенести в контролы на нашей форме.Скажем есть 3 параметра для фильтрации, нашли запись по 2 из них. Как в все три найденные значения перенести в первую форму(форму с нашими контрлами). Колонки справочника отличные от "Название" и "Описание".

Александр, с помощью EntitySchemaQuery получаете необходимую запись из объекта, и заносите значения полей этой записи в поля карточки. Вы ведь из справочника выбираете одну запись, правильно?
Как работать с EntitySchemaQuery описано здесь.
Плюс с помощью поиска по Community и в конфигурации можно найти множество примеров.

[/quote]

"Андрей Каспаревич" написал:Здравствуйте, Александр!
Это делается в скрипте после действия.
Функция
OpenSpecOfferingLookupUserTask.GetSelectedValues(UserConnection) as Dictionary ;

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

Дописали в этот скрипт следующее :

Page.TextEdit2.SetValue(offeringId);

Все компилируется без ошибок, но TextEdit2 заполняется нулями сразу после нажатия кнопки поиск.
На данный момент на кнопке поиск висит следующий событийный подпроцесс:
процесс
PrepareScript:

var SSDocumentOfferingtId = "2bba6de9-51eb-43ca-a67a-a0761b7357e4";
Collection<Dictionary<string, object>> filters = new Collection<Dictionary<string, object>>();
filters.Add(new Dictionary<string, object> {
    {"comparisonType", FilterComparisonType.StartWith},
    {"leftExpressionColumnPath", "LAST_NAME"},
    {"useDisplayValue", false},
    {"rightExpressionParameterValues", new object[] {Page.TextEdit1.Value}}
 
});
filters.Add(new Dictionary<string, object> {
    {"comparisonType", FilterComparisonType.StartWith},
    {"leftExpressionColumnPath", "IO_NAME"},
    {"useDisplayValue", false},
    {"rightExpressionParameterValues", new object[] {Page.TextEdit2.Value}}
 
});     
filters.Add(new Dictionary<string, object> {
    {"comparisonType", FilterComparisonType.Contain},
    {"leftExpressionColumnPath", "PHONE"},
    {"useDisplayValue", false},
    {"rightExpressionParameterValues", new object[] {Page.TextEdit3.Value}}
 
});     
UserTask1.ProcessKey = InstanceUId;
UserTask1.PageParameters = new Dictionary<string, object>() {
    {"LookupFilters", filters},
    {"schemaUId", SSDocumentOfferingtId},
    {"customClosedEvent", "SpecOfferingLookupPageClosed"} //Сообщение при закрытии окна
};
UserTask1.UseCurrentActivePage = true;
return true;

Выполнить задание сценарий 2:

var dmsres = UserTask1.GetSelectedValues(UserConnection) as Dictionary <string, object>;
var Id = Guid.Empty;
foreach (var dmsid in dmsres) {
   Id = new Guid (dmsid.Key.ToString());
   }
Page.TextEdit2.SetValue(Id);
return true;

Здравствуйте, Александр!
Дело в том, что действие считается выполненным, как только открывается страница.
Для решения проблемы необходимо вставить перед вторым скриптом вставить сигнал "Промежуточное обрабатывающее сообщение", которым "ловить" сообщение закрытия окна (в данном примере это "SpecOfferingLookupPageClosed"). Если так не сработает, удалите строку

 {"customClosedEvent", "SpecOfferingLookupPageClosed"}

, а после определения "PageParameters" добавьте:

UserTask1.CloseMessage = "SpecOfferingLookupPageClosed";

Пример можно посмотреть в "AccountEditPage", действие подписано "Открыть Страницу Результатов Поиска Дублей".

Здравствуйте Андрей, первый вариант сработал, спасибо, ID смогли вставить в TextEdit2. есть еще вопросик, на форуме нали вот такой скрипт:

var DmsRes = UserTask1.GetSelectedValues(UserConnection) as Dictionary <string, object>;
var Id = Guid.Empty;
var Lname = string.Empty;
foreach (var DmsId in DmsRes) {
   Id = new Guid (DmsId.Key.ToString());
	var Items = DmsId.Value as Dictionary <string, object>;
        Lname =Items["LAST_NAME"].ToString();
   }
Page.TextEdit2.SetValue(Lname);
return true;

По дабл клику в форме она закрывается с ошибкой

Action: ThrowClientEvent
SubmitAjaxEventConfig: {"config":{"viewStateMode":"include","extraParams":{"processInstanceId":"e296e086-1397-48fd-82a5-d0cdeadeaa25PageContainer","message":"SpecOfferingLookupPageClosed","key":"06a180ff-e906-4a32-beb8-3db90394d02d"}}} 

Может есть какие-нибудь идеи?

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

Здравствуйте, Андрей. Ошибка стала вываливаться именно после добавления этого кода, если вернуть этот скрипт

var dmsres = UserTask1.GetSelectedValues(UserConnection) as Dictionary <string, object>;
var Id = Guid.Empty;
foreach (var dmsid in dmsres) {
   Id = new Guid (dmsid.Key.ToString());
   }
Page.TextEdit2.SetValue(Id);
return true;

то все работает, Id вставляется в TextEdit2
ps: к предыдущему посту, форма закрывает, и открывается новое окошко с ошибкой.
Еррор

Александр, не могу точно определить, в чем дело.
Нужно посмотреть, что возвращает

var Items = DmsId.Value as Dictionary <string, object>;

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

Здравствуйте Андрей.
Сделали через EntitySchemaQuery. Все получилось. Но попутно возник еще один вопрос по поводу фильтра. В нашей таблице поле номер телефона может быть NULL. и если FilterComparisonType.Contain то записаи у которых поле PHONE NULL ны отображабтся в списке, как в даном скрипте моно поставить условие "или" Null?

filters.Add(new Dictionary<string, object> {
    {"comparisonType", FilterComparisonType.Contain},
    {"leftExpressionColumnPath", "PHONE"},
    {"useDisplayValue", false},
    {"rightExpressionParameterValues", new object[] {Page.TextEdit3.Value}}

Спасибо.

Вот пример из базовой конфигурации. Схема "Activity", метод "RecalculateWorkingTimeForServiceRequest()":

			var entitySchemaManager = UserConnection.GetSchemaManager("EntitySchemaManager") as EntitySchemaManager;
var activitySchemaQuery = new EntitySchemaQuery(entitySchemaManager, "Activity");
var startQueryColumnName = activitySchemaQuery.AddColumn("StartDate").Name;
var dueQueryColumnName = activitySchemaQuery.AddColumn("DueDate").Name;	
var incidentFilter = activitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "Incident", serviceRequestId);
var serviceCallFilter = activitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "ServiceCall", serviceRequestId);
var filter = new EntitySchemaQueryFilterCollection(activitySchemaQuery, LogicalOperationStrict.Or, incidentFilter, serviceCallFilter);
activitySchemaQuery.Filters.Add(filter);

Или можно воспользоваться методом, как в этой теме.

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

Вот пример из базовой конфигурации. Схема "Activity", метод "RecalculateWorkingTimeForServiceRequest()":

                        var entitySchemaManager = UserConnection.GetSchemaManager("EntitySchemaManager") as EntitySchemaManager;

var activitySchemaQuery = new EntitySchemaQuery(entitySchemaManager, "Activity");

var startQueryColumnName = activitySchemaQuery.AddColumn("StartDate").Name;

var dueQueryColumnName = activitySchemaQuery.AddColumn("DueDate").Name;

var incidentFilter = activitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "Incident", serviceRequestId);

var serviceCallFilter = activitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "ServiceCall", serviceRequestId);

var filter = new EntitySchemaQueryFilterCollection(activitySchemaQuery, LogicalOperationStrict.Or, incidentFilter, serviceCallFilter);

activitySchemaQuery.Filters.Add(filter);

Или можно воспользоваться методом, как в этой теме.

С уважением,

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

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


Вариант не очень подходящий. Проблема такая же как в этой теме, но предложенный там вариант использовать не хотелось бы (очень много записей тянется). И попутно возникла вторая проблема, если в PrepareLookupFilter comparisonType заменить на IsNull, то записи с NULL в нужной колонке не подтягиваются

Здравствуйте, Александр!
Во-первых, хочу обратить внимание, что PrepareLookupFilter для поля с выпадающим списком реализуется немного не так, как в лукап-поле. Отличие в аргументе функции:

PrepareLookupFilter += delegate (object sender, ComboBoxEditEventArgs e) {

Во-вторых, проверьте, точно ли там null, а не пустая строка, это разные вещи.
В-третьих, проблема из той темы актуальна для 5.1, так как там не было возможности указать "logicalOperation" для группировки фильтров.

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

Здравствуйте, Александр!

Во-первых, хочу обратить внимание, что PrepareLookupFilter для поля с выпадающим списком реализуется немного не так, как в лукап-поле. Отличие в аргументе функции:

PrepareLookupFilter += delegate (object sender, ComboBoxEditEventArgs e) {

Во-вторых, проверьте, точно ли там null, а не пустая строка, это разные вещи.

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

С уважением,

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

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


Да в базе точно NULL. А вот из TextEdit3 если туда ничего не ввести передается не NULL. В любом случае прверка IsNull не отрабатывает. Может ли это быть связано с тем, что фильтруется справочник созданный на основе представления, созданного через linked server ?

Александр, думаю, что это не связано с linked server.
Можете посмотреть, какой запрос в базу приходит?

Запрос в базу уходит примерно такой

SELECT TOP 41
	[spisok].[Id] [Id],
	[spisok].[LAST_NAME] [LAST_NAME],
	[spisok].[IO_NAME] [IO_NAME],
	[spisok].[PHONE] [PHONE]
FROM
	[dbo].[spisok] [spisok]
WHERE
	([spisok].[LAST_NAME] LIKE N''%'' + @P1 + N''%''
	AND [spisok].[IO_NAME] LIKE N''%'' + @P2 + N''%''
	AND [spisok].[PHONE] = @P3)
ORDER BY
	[Id] ASC',N'@P1 nvarchar(5),@P2 nvarchar(4000),@P3 nvarchar(4000)',@P1=N'бутор',@P2=N'',@P3=N''

Проверки на NULL нет, хотя в фильтре

filters.Add(new Dictionary<string, object> {
    {"comparisonType", FilterComparisonType.IsNull},
    {"leftExpressionColumnPath", "PHONE"},
    {"useDisplayValue", false},
	//{"rightExpressionParameterValues", new object[] {Page.TextEdit3.Value}}
 
})

Здравствуйте, Александр!
Могу предложить Вам другой вариант. По аналогии с тем, как накладывается фильтр на поле "RegionEdit" в карточке Контрагента, можно проверять содержимое поля, и, если оно не равно String.Empty, накладывать фильтр, иначе - не накладывать. Вот, как это сделано в карточке контрагента:

Page.RegionEdit.PrepareLookupFilter += PrepareRegionEditFilter;
 
 
public virtual void PrepareRegionEditFilter(object sender, LookupEditEventArgs e) {
			object value = Page.CountryEdit.Value; //получение значения
Guid countryId = (value == null || value.ToString().Equals(string.Empty)) ? Guid.Empty : Guid.Parse(value.ToString()); //проверка
if (countryId == Guid.Empty) {	
	return; //если значение поля - пустая строка, выходим из метода
}
//наложение фильтров
var filters = e.Filters;
filters.Add(new Dictionary<string, object> { 
           {"comparisonType", FilterComparisonType.Equal}, 
           {"leftExpressionColumnPath", "Country.Id"}, 
           {"useDisplayValue", false}, 
           {"rightExpressionParameterValues", new object[] {countryId.ToString()}}});
		}

Мы так и планируем в будущем, но как из базы значения то получить , где PHONE=null ?

Александр, я попробовал на примере наложения фильтра на поле "CityEdit" так:

	filters.Add(new Dictionary<string, object> {
		{"comparisonType", FilterComparisonType.Equal},
		{"leftExpressionColumnPath", "Country.Id"},
		{"useDisplayValue", false},
		{"rightExpressionParameterValues", new object[] {countryId}}});
	filters.Add(new Dictionary<string, object> {
		{"comparisonType", FilterComparisonType.IsNull},
		{"leftExpressionColumnPath", "Country"},
		{"useDisplayValue", false}});
e.ParametersValue.Add("logicalOperation", LogicalOperationStrict.Or);

В иотге наложились оба фильтра с логическим объединением "ИЛИ". Вот такой запрос сформировался:

exec sp_executesql N'
SELECT TOP 41
	[City].[Id] [Id],
	[City].[Name] [Name]
FROM
	[dbo].[City] [City]
WHERE
	(EXISTS (
SELECT
	[Country].[Id] [Id]
FROM
	[dbo].[Country] [Country]
WHERE
	[City].[CountryId] = [Country].[Id]
	AND [Country].[Id] = @P1)
	OR [City].[CountryId] IS NULL)
ORDER BY
	[Name] ASC,
	[Id] ASC',N'@P1 uniqueidentifier',@P1='A670B005-E8BB-DF11-B00F-001D60E938C6'

Это конечно замечательно, что у вас все работает, только почему не работает у нас? Даже если из кода, приведенного выше выкинуть первые два фильтра и просто попытаться вывести список записей со значением NULL в колонке PHONE, то ни одна запись не выводится. Как видно в SQL запросе, отправляемом на сервер проверка на NULL не производится.
Второе: у нас операция "или" не должна применяться ко всем фильтрам сразу, т.е. результирующий SQL запрос должен быть таким

SELECT TOP 41
        [spisok].[Id] [Id],
        [spisok].[LAST_NAME] [LAST_NAME],
        [spisok].[IO_NAME] [IO_NAME],
        [spisok].[PHONE] [PHONE]
FROM
        [dbo].[spisok] [spisok]
WHERE
        ([spisok].[LAST_NAME] LIKE N''%'' + @P1 + N''%''
        AND ([spisok].[IO_NAME] LIKE N''%'' + @P2 + N''%'' OR [spisok].[IO_NAME] IS NULL)
        AND ([spisok].[PHONE] = @P3 OR [spisok].[PHONE] IS NULL )
ORDER BY
        [Id] ASC',N'@P1 nvarchar(5),@P2 nvarchar(4000),@P3 nvarchar(4000)',@P1=N'бутор',@P2=N'',@P3=N''

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

Александр, а зачем вообще накладывать фильтр "ИЛИ" с проверкой пустых строк, если заведомо известно, что там null, а не пустая строка? Если в поле не введены данные, то логичнее было бы вообще не фильтровать по этому полю.
Как пользователь сможет получить нужную запись, если у нее заполнены все поля, но пользователь помнит только одно из них?
Можно предположить, что пользователь захочет получить все записи, у которых поле не заполнено. Для этого случая предлагаю добавить на страницу с полями ввода значений для фильтрации еще чек-боксы типа "Не заполнено". И, если установлена "галка", накладывать только фильтр IsNull.

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

});  
if (!(p==null || p.ToString().Equals(string.Empty))){
filters.Add(new Dictionary<string, object> {
    {"comparisonType", FilterComparisonType.Contain},
    {"leftExpressionColumnPath", "PHONE"},
    {"useDisplayValue", false},
	{"rightExpressionParameterValues", new object[] {Page.TextEdit3.Value}}
 

Спасибо еще раз, и извиняюсь что не сразу отписались )

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

При попытке сгенерировать исходный код для всех элементов все кончается ошибкой :
Action: Click
ControlId: ActionsMenuPanelReGenerateSourcesAll
SubmitAjaxEventConfig: {"config":{"viewStateMode":"include","extraParams":{"tag":""}}}

что это может быть ?

Нравится

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

Здравствуйте, Николай.

Ошибка пользовательского интерфейса могла возникнуть из-за кеширования некорректных или более неактуальных данных и попытке использовать их в изменившейся среде.
В большинстве случаев, достаточно очистить кеш/куки файлы браузера и очистить значения ключей на сервере сессий (Redis).
Если проблема не пропадет, необходимо будет воспроизвести и проанализировать, для этого необходимо будет обратиться к технической поддержке.

Ок ,спасибо, буду пытаться...

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

Создаю новый отчет по документу договор. Добавил текст, данные, скрипт делаю по аналогии со стикером контакта:
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using System.Text.RegularExpressions;
using Terrasoft.Common;
using Terrasoft.Core;
using Terrasoft.Core.DB;
using Terrasoft.Reports;
using Terrasoft.Core.Entities;
using Terrasoft.UI.WebControls.Utilities;

private void ContractReport_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e) {
var report = ((Report)sender);
var userConnection = report.UserConnection;

System.Data.DataSet ds = report.CreateDataSet();
System.Data.DataTable filterTable = new System.Data.DataTable();
filterTable.Columns.Add("Id");
var filterObj = report.Parameters["Filters"].Value;
if (filterObj != null && !string.IsNullOrEmpty(filterObj.ToString())) {
var filters = EntitySchemaUtilities.DataSourceFiltersToESQFilters(userConnection, "Document", filterObj.ToString());
var contact = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Document");
contact.AddColumn("Id");
contact.Filters.Add(filters);
filterTable.Load(userConnection, contact);
}
EntitySchemaQuery query = new EntitySchemaQuery(
userConnection.EntitySchemaManager, "Document");
query.AddColumn("Id");
query.AddColumn("Date");
query.AddColumn("Number");
if (filterTable.Rows.Count > 0) {
var idFilters = new EntitySchemaQueryFilterCollection(query) {
LogicalOperation = LogicalOperationStrict.Or,
};
foreach (System.Data.DataRow row in filterTable.Rows) {
if (row["Id"] != null) {
idFilters.Add(query.CreateFilterWithParameters(FilterComparisonType.Equal,
"Id", row["Id"]));
}
}
query.Filters.Add(idFilters);
}
ds.Tables["Document"].Load(userConnection, query);

report.DataSource = ds;
}

В итоге при открытии получаю :
Следующая ошибка когда скрипт в процедуре OnBeforePrint:Object reference not set to an instance of an object
Ничего уже не понимаю....почему она лезет ?

Нравится

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

Здравствуйте, Николай.

Рекомендую к ознакомлению статью http://www.community.terrasoft.ru/blogs/8747, в которой содержится инструкцию по отладке конфигурации. Вы можете отладить схему отчета, который создали.

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

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

BPM 5.4.0.1351
В боковой панели раздела Документы есть дерево со статическими и динамическими папками.
Если раскрыть папки, перейти в другой раздел и вернуться, то папки параллельного уровня(разветвления) и все вложенные папки закрываются.
Объясните, пожалуйста, почему это происходит и как этого избежать? Постоянно открывать папки абсолютно не удобно.

Нравится

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

Здравствуйте, Александр!

Спасибо за Ваше обращение.

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

Здравствуйте, Александр.

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

Page.TreeGrid.GetRowConfigHandler += delegate(Terrasoft.Core.Entities.Entity row) {
	string primaryColumnName = row.Schema.PrimaryColumn.Name;
	string primaryColumnValue = row.GetColumnValue(primaryColumnName).ToString();
	var config = new DataSourceRowConfig(primaryColumnValue);
	config.AddConfig(new DataSourceRowExpandedConfigValue(true));
	return config;
};

Здравстуйте, Максим.
Большое спасибо! Все получилось.

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

Добрый день.
Подскажите каким образом можно сделать напоминание пользователю из БП без задачи(активности)?
Версия системы 5.4

Нравится

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

Напоминание – это запись в таблице Reminding. Можно создать там новую запись и прописать дату (с какой показывать), контакт (кому), текст, тип объекта и ссылку на этот объект.

В странице BaseApprovalEditPage есть функция CreateReminding, которая создаёт новое напоминание, можно сделать по аналогии.

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

В последние пару недель у пользователей очень часто стало появляться такое сообщение.
BPMonline CRM On-Site Версия 5.4.0.1063
Браузер Chrome
Что делать как бороться?

pagenotanswer.png

Нравится

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

Хром версии 32?
Они там что-то поменяли в движке.

Также протестируйте и сообщите результаты в другом браузере (к примеру Firefox).

Firefox в подобных безобразиях не замечен вроде......

Вот жеж "корпорация добра", чтоб им пусто было.....

Пишут, что:

<br> This is a know Chrome v32 bug. I think this will be fixed soon:<br> <a href="http://code.google.com/p/chromium/issues/detail?id=334948[/quote">http://code.google.com/p/chromium/issues/detail?id=334948[/quote</a>]</p> <p><a href="http://stackoverflow.com/questions/21196189/chrome-unresponsive-page-false-positive-since-chrome-32">тут</a> подробнее:<br> [quote написал:
I started getting this problem as well.

In searching, I came accross this issue https://code.google.com/p/chromium/issues/detail?id=335248.

As best I figured out, the bug is related to:

  • Windows 7/8 with Aero Theme
  • Scrollbars on pages (such as in the developer console)
  • Pages with popups (in particular Window.open() calls)

I guess they are slated to push the fix into version 33...and maybe leave the stable* 32 how it is (although I hope not).

So there are a few options:

  • Switch away from Aero Theme until version 33 is in stable
  • Upgrade to the beta channel, i.e. version 33
  • Click on the Wait button every 30 seconds whenever the chrome developer tools is open.

и решение:


Okay here’s the solution you can do without changing your theme, right click on my computer, go to your System Properties, and then go to "Advanced", click on "Settings" under Performance, then check the below radio button. This seems to stop it
options

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

Добрый день.
На сегодняшний день разработка в BPMOnline ведется "на коленке". Разработчик вручную кладет исходники в нужное место, вручную обновляет конфигурацию в системе...А если есть тестовый сервер, количество операций увеличивается.
Возникло желание сделать процесс разработки цивилизованным, внедрить систему контроля версий, настроить автоматическую сборку, тестовый сервер.
Вопрос: как можно организовать автоматическую сборку? Приветствуются любые идеи и предложения.

Нравится

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

Добрый день!

Не совсем понятен вопрос. Чтоб дать рекомендации по поводу организации автоматической сборки – нужно понимать, какие есть исходные данные. По идее, у Вас есть только собранные бинарники и БД (которые готовит наша автосборка). Автоматизировать сборку автоматически собранной сборки не имеет практического смысла, разве что, если имелось в виду что-то другое.

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

Самый простой вариант:
1) Разработчик изменяет код
2) Заходит в Инструменты -> Конфигурация
3) Исходный код -> Сгенерировать для выбранных элементов
То есть хотелось бы автоматизировать запуск автоматической сборки, чтобы она запускалась по расписанию без участия живых людей.

Можно сгенерировать исходные коды конфигурации с помощью SolutionConsole, см. команду RegenerateSchemaSources:

Предназначение и миссия
Данная утилита предназначена для автоматической (скажем запуск по расписанию) и в основном массовой работы со схемами и данными. Позволяет осуществлять перегенерацию исходников, метаданных и структуры базы данных, выгружать и загружать данные, структуру схем и метаданные. Так же используется для переноса изменений с одной базы на другую, включая разные СУБД.
 
Описание и назначение параметров
1. Основные обязательные параметры
На основании этих параметров происходит соединение с базой и конфигурацией.
 
-solution=<Название конфигурации>
Допустимые значения: 
<Название конфигурации> - конфигурация над которой будет выполнятся операция
<*> - имя конфигурации не указано. Логин будет осуществляться на прямую в базу без привязки к конфигурации. Доступны будут только системные схемы.
Обязательность: нет
 
-user=<Имя пользователя>
Допустимые значения:
<Имя пользователя> - имя пользователя системы имеющего права доступа к конфигурации
<Имя пользователя> - имя пользователя базы данных в случае когда -solution=*
Обязательность: да
 
-password=<Пароль пользователя>
Допустимые значения:
<Пароль пользователя> - пароль пользователя системы имеющего права доступа к конфигурации
<Пароль пользователя> - пароль пользователя базы данных в случае когда -solution=*
Обязательность: да
 
2. Параметр операции
-operation=<Название операции>
Описание:
Параметр, определяющий операцию, которую будет осуществлять утилита.
Допустимые значения:
<ExtractSolutionData> - выгрузка конфигурации
<LoadSolutionData> - загрузка выгруженной ранее конфигурации
<LoadSystemDBData> - загрузка выгруженных ранее данных только для системных схем
<UpdateConfigurationDBStructureAndData> - обновляет структуру таблиц и данные в текущей базе данных для конфигурационных схем выгруженными ранее данными
<UpdateSystemDBStructureAndData> - обновляет структуру таблиц и данные в текущей базе данных для системных схем выгруженными ранее данными
<UpdateConfigurationRightsDBStructure> - обновляет структуру таблиц прав для конфигурационных схем
<ReGenerateSchemaSources> 
<GenerateUpdateSystemDBStructureSqlText> - генерирует Sql скрипт обновления структуры системных таблиц на основании выгруженных ранее данных о схемах
<GenerateUpdateSystemDBDataSqlText> - генерирует Sql скрипт обновления данных системных таблиц на основании выгруженных ранее данных
<ReGenerateSchemaMetaData>

Вот пример вызова операции перегенерации:

Terrasoft.Tools.SolutionConsole.exe "-user=Supervisor" "-password= Supervisor " -solution=TSBpm -destinationPath=C:\Temp\SR -Operation=ReGenerateSchemaSources -contentTypes=Localization -logPath=C:\Temp\Log -ignoreLocking=true

Предварительно обязательно указать корректную строку подключения к БД в конфиге приложения (Terrasoft.Tools.WorkspaceConsole.exe.config)

И скопировать из Terrasoft.WebApp\bin\ все файлы в папку с SolutionConsole

Вот пример вызова операции перегенерации:

Terrasoft.Tools.SolutionConsole.exe "-user=Supervisor" "-password= Supervisor " -solution=TSBpm -destinationPath=C:\Temp\SR -Operation=ReGenerateSchemaSources -contentTypes=Localization -logPath=C:\Temp\Log -ignoreLocking=true

Предварительно обязательно указать корректную строку подключения к БД в конфиге приложения (Terrasoft.Tools.WorkspaceConsole.exe.config)

И скопировать из Terrasoft.WebApp\bin\ все файлы в папку с SolutionConsole

Исходные коды удалось получить.
А как можно загрузить из консоли изменения, т.е. например .md файл?

Антон, операция LoadSolutionData + опция includedSchemas

Опции операций:
-destinationPath=<Путь к папке>
Описание:
Путь к папке, в которую будет осуществляться выгрузка или из которой будет происходить загрузка файлов данных.
Допустимые значения:
<Путь к папке> - путь к папке хранения файлов данных используемых утилитой
Обязательность: да
 
-includedSchemas=<Имя схемы,Имя схемы,Имя схемы,…>
Описание:
Список схем, для которых необходимо выполнить операцию. В случае отсутствия параметра операция выполняется для всех схем
Допустимые значения:
<Имя схемы> - имя схемы
<Имя схемы,Имя схемы,Имя схемы,…> - список схем через запятую
Обязательность: нет

Дмитрий,

Не удалось загрузить схему. Указал путь к папке, там один файл .cs.
Ошибка:
ERROR: Идентификатор GUID должен содержать 32 цифры и 4 дефиса (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).

Попытался сделать ExtractSolutionData:
Сформировались файлы:
SolutionResources.xml
SysSchemaFolder.dat
SysSchemaInSolution.dat
и папки повторяющие элементы конфигурации в веб-интерфейсе. Но сами папки не содержат файлов.
Как я понимаю должны быть и файлы?

Проверил у себя - всё отлично, внутри папок (структура конфигурации) есть схемы.

Вот команда:

Terrasoft.Tools.SolutionConsole.exe -solution=TSBpm -user=supervisor -password=Supervisor -operation=ExtractSolutionData -destinationPath=C:\Temp\SR -logPath=C:\Temp\SR\Log

Вот скриншот:

Что то на нашей конфигурации не работает.
Делаю такую же команду

Terrasoft.Tools.SolutionConsole.exe "-user=Supervisor" "-password=*****" -solution=TSBpm -destinationPath=C:\BPMSrcAuto -Operation=ExtractSolutionData -logPath=C:\BPMSrcAuto\log

Версия 5.4.0.2028

Лог ошибки:

=== 09:09:12.4443 ===
Start info:
	Operation: ExtractSolutionData
	Solution: TSBpm
	User: Supervisor
	UserPassword: **
	DestinationPath: C:\BPMSrcAuto
 
ERROR: Не удалось найти часть пути "C:\BPMSrcAuto\BPMonline CRM\Конфигурационные элементы\Контакты\Продукты\BaseOfferingInterest.cs".

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

Ошибка или в доступа к папке (не может создать под каталоги) или в русских символах. Локализация Windows у Вас какая? Какой язык для non-unicode?

До этого у меня каталоги создавались, но были пустые.
Windows русская, язык non-unicode - русский.

Антон, не готов Вам указать точную причину возникновения данной проблемы. Если есть возможность - предоставьте бекап Вашей БД на support@terrasoft.ru, либо обратитесь на этот же имейл с уточнением даты и времени, когда к Вам можно будет удаленно подключится для анализа причин проблемы.

Вот здесь пытаюсь решить тоже самое
http://www.community.terrasoft.ru/forum/topic/10139

"Олейник Дмитрий" написал:

Антон, не готов Вам указать точную причину возникновения данной проблемы. Если есть возможность - предоставьте бекап Вашей БД на support@terrasoft.ru, либо обратитесь на этот же имейл с уточнением даты и времени, когда к Вам можно будет удаленно подключится для анализа причин проблемы.

С уважением,

Олейник Дмитрий

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


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

Антон, Team Viewer.

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

Добрый день
Прислали новую версию ядра и ExtractSolutionData заработало.
Возник вопрос:
1.Что за файлы json генерируются, как их применять?
2.можно ли определить, чтобы генерировались только cs или только md например?

Здравствуйте, Антон!
1. Эти файлы практически бесполезны, функционал добавлялся для каких-то "узких" задач, вероятно связанных с интеграцией. Ценность имеют *.md файлы, так как в них содержатся все метаданные схем.
2. Для этого существует параметр "contentTypes":

-contentTypes=<Тип данных для операции>|<Тип данных для операции>|…
Описание:
Определяет тип данных, которые необходимо выгрузить или загрузить. Можно указать несколько типов через знак «|».
Допустимые значения:
<Source> - исходники схем. Расширение файлов “*.cs<MetaData> - метаданные схем. Расширение файлов “*.json<Data> - данные хранящиеся в базе для данных схем. Расширение файлов “*.dat<Localization> - ресурсы схем. Расширение файлов “*.tsresx<CodeReviewData> - данные для CodeReview. Расширение файлов “*. mdcs<LocalizableData> - данные схем для локализации. Выгружается или в файл "SolutionLocalizableData.xml" или в файл указанный в параметре –fileName
<ExportData> - метаданные схемы с дополнительной информацией о схеме (состояние, название, имя менеджера). Выгрузка идет напрямую из базы. Расширение файлов “*.md<All> - все перечисленные выше типы

Добрый день,

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

method.ZipBody = new byte[] { 31,139,8,0,0,0,0,0,4,0,173,143,77,11

стало:

method.Body = @"base.SetCustomFilterDetails();
List<string> filteredColumn = new List<string>();
filteredColumn.Add(""StartDate"");
filteredColumn.Add(""DueDate"");

Можете подсказать с чет это связано? Возможно это какая то настройка в конфиге?

Еще один вопрос созрел: а возможно генерировать .cs файлы без учета группы, т.е. также как и .md файлы в одной папке?

Здравствуйте, Антон!
По первому Вашему вопросу. Тут дело в том, что по-разному генерируются храняться метаданные методов. Ничего страшного в этих изменениях нет.
По второму вопросу. Файлы .cs можно также выгружать, настроив должным образом Web.config приложения. Тогда все файлы выгружаются в одну папку, и можно отлаживаться, если требуется.

По второму хотел уточнить:
Я полагал, что может есть параметр у Terrasoft.Tools.SolutionConsole.exe.
В предложенном варианте много "ручных действий", например опубликовать схему. Цель не отладка, а хранение исходных кодов в git, для этого уже есть bat файл.

Но проблема с папками, т.к. иногда получается, что схемы импортируются в другую группу, а не где ранее был объект.

Здравствуйте, Антон!
К сожалению, такого параметра нет.
Но, возможно, Вам будет полезна следующая информация. В БД хранятся все версии элементов конфигурации в таблице [SysSchemaInSolution]. Актуальной считается та запись, у которой значение поля [Version] максимальное.
В этой же таблице есть привязка схемы к группе (поле [SysFolderId]). Можно для всех схем прописать одну и ту же группу, что решит Вашу задачу.

Спасибо за хорошую идею, так и сделаю)

Добрый день,
А есть подобная утилита для версии 7.2?
Похоже это "\Terrasoft.WebApp\DesktopBin\WorkspaceConsole\Terrasoft.Tools.WorkspaceConsole.exe" ?
Но выдает что не знает ExtractSolutionData.

Добрый день.

Описание утилиты WorkspaceConsole можно найти в документации BPMonline
http://www.training.terrasoft.ru/sites/default/files/BPMonline_Setup_Guide_MSSQL_7.3.0.pdf

Начиная со страницы 20.

Спасибо.
Как я понял теперь нет операции ExtractSolutionData для экспорта всего кода конфигурации в .cs файлы. Ругается что операция не известная. ContentType = Source - тоже нету.
Есть какой то способ получить .cs код всей конфигурации?

Добрый день, Антон!
Действительно, WorkspaceConsole не позволяет выгружать cs-файлы. Если есть необходимость, можно в Web.config приложения (по пути %SitePath%\Terrasoft.WebApp\) указать для параметра "IncludeDebugInformation" значение "true", а в параметре "CompilerSourcesTempFolderPath" - путь к папке, куда будут выгружены cs-файлы.
Файлы будут выгружены при компиляции конфигурации.
Но если Вы хотите просто хранить конфигурацию где-либо на стороне, подобный подход не приемлен для 7.х. Лучше либо выгружать свои пакеты, либо настроить SVN.

Добрый день,
В 7.2.0.1331 предложенный метод CompilerSourcesTempFolderPath заработал, спасибо.
Пробую сделать тоже самое в версии 7.2.2.342 исходники не появляются в указанной папке. Сравнивал доступ к папке, дал всем полный доступ, не помогло.
Можете подсказать куда еще капать?

в web.config добавил:

    <add key="IncludeDebugInformation" value="true" />
    <add key="IncludeXmlDocumentation" value="false" />
    <add key="CompilerSourcesTempFolderPath" value="D:\Terrasoft\WebApp\Debug\" />

Здравствуйте, Антон!

Компилировали конфигурацию? Вы вносили изменения в web.config, который лежит в папке Terrasoft.WebApp?

"Резниченко Сергей" написал:

Здравствуйте, Антон!

Компилировали конфигурацию? Вы вносили изменения в web.config, который лежит в папке Terrasoft.WebApp?


Спасибо, упустил этот момент. Внес изменения в Terrasoft.WebApp и заработало.

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

Здравствуйте! По БП создаются задачи, в зависимости от результата происходит ветвление процесса. Но у некоторых задач выпадающий список результат не фильтруется, т.е. там есть все возможные варианты. И те что нужны по процессу и те, что не участвуют в процессе. Соответственно при выборе варианта, который не влияет на процесс, БП останавливается. При этом в БП есть задачи у которых все нормально и фильтрация выпадающего списка результат работает. На что нужно обратить внимание при создании задачи БП, чтобы выпадающий список результат фильтровался корректно?

Нравится

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

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

При создании задачи по процессу, заполняется колонка в AllowedResult в объекте активности. Потом, при открытии карточки редактировании задачи накладывается фильтр на поле ResultEdit на событии инициализации страницы, фильтр накладывается в методе SubscribeResultEditPrepareLookupFilterEvent(). Фильтруется список по параметру AllowedResults, который заполняется на событии загрузки данных.

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

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

Задача раскрасить основной реестр раздела давно решенна, но возникла другая: раскрасить реестр ДЕТАЛИ РАЗДЕЛА.

Не пойму как.....

Нравится

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

Пытаюсь на PageLoadComplete страницы реестра детали сделать так:

var primaryColumnValue = Page.DataSource.ActiveRow.PrimaryColumnValue;
 
var config = new DataSourceRowConfig(primaryColumnValue);
 
config.AddConfig(new DataSourceRowColorConfigValue("Red"));

но вылетает на первой же строчке....

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

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

Очень бы хотелось чтобы возможно..... :biggrin:

Александр, судя по всему - возможно :)

Шаги:

1. Создать метод в нужной Вам странице реестра - GetDetailRowConfig(Entity module). Ну к примеру:

string primaryColumnName = module.Schema.PrimaryColumn.Name;
string primaryColumnValue = module.GetColumnValue(primaryColumnName).ToString();
var config = new DataSourceRowConfig(primaryColumnValue);
string PriorityColumnValue = module.GetTypedColumnValue<Guid>("Priority").ToString();
if(PriorityColumnValue == "guid приоритета критичный"){
   config.AddConfig(new DataSourceRowColorConfigValue("Red"));
}else if(PriorityColumnValue == "guid приоритета важный") {
   config.AddConfig(new DataSourceRowColorConfigValue("Yellow"));
}

2. На PageLoad (по аналогии с BaseModulePage) прописать делегаты:

Page.TreeGrid.GetRowConfigHandler = GetDetailRowConfig;
Page.DataSource.Loaded += Page.TreeGrid.DataLoaded;

Супер, опробую завтра с утра.

Все заработало, супер, спасибо.

"Олейник Дмитрий" написал:

Александр, судя по всему - возможно :)

Шаги:

1. Создать метод в нужной Вам странице реестра - GetDetailRowConfig(Entity module). Ну к примеру:

string primaryColumnName = module.Schema.PrimaryColumn.Name;

string primaryColumnValue = module.GetColumnValue(primaryColumnName).ToString();

var config = new DataSourceRowConfig(primaryColumnValue);

string PriorityColumnValue = module.GetTypedColumnValue<Guid>("Priority").ToString();

if(PriorityColumnValue == "guid приоритета критичный"){

   config.AddConfig(new DataSourceRowColorConfigValue("Red"));

}else if(PriorityColumnValue == "guid приоритета важный") {

   config.AddConfig(new DataSourceRowColorConfigValue("Yellow"));

}

2. На PageLoad (по аналогии с BaseModulePage) прописать делегаты:

Page.TreeGrid.GetRowConfigHandler = GetDetailRowConfig;

Page.DataSource.Loaded += Page.TreeGrid.DataLoaded;

С уважением,

Олейник Дмитрий

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


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

Page.TreeGrid.GetRowConfigHandler = delegate(Terrasoft.Core.Entities.Entity row) {                   
	string primaryColumnName = row.Schema.PrimaryColumn.Name;
	string primaryColumnValue = row.GetTypedColumnValue<string>(primaryColumnName);
	var config = new DataSourceRowConfig(primaryColumnValue);
	Guid resultId = row.GetTypedColumnValue<Guid>("DesignatedUseStatusId");
	string cellColor = String.Empty;
	//Указываем цвет фона ячеек реестра в зависимости от условия
	if (resultId.Equals(new Guid("{F79FBF11-5799-55E8-E043-323E1EACFB56}"))) { //Целевое использование не подтверждено
		cellColor = "Red";
	//	config.AddConfig(new DataSourceRowColorConfigValue(cellColor));
	}
	if (resultId.Equals(new Guid("{F79FBF11-5798-55E8-E043-323E1EACFB56}"))) { //Целевое использование подтверждено
		cellColor = "Green";
	//	config.AddConfig(new DataSourceRowColorConfigValue(cellColor));
	}
 
	var cellsBackground = new Dictionary<string, DataSourceRowColumnBackgroundColorConfigValue>();
	if (!cellColor.Equals(String.Empty)) {
		cellsBackground.Add("Result", new DataSourceRowColumnBackgroundColorConfigValue(cellColor));
		config.AddConfig(new DataSourceRowColumnsBackgroundColorConfigValue(cellsBackground));
	}
 
	return config;
};
Page.DataSource.Loaded += Page.TreeGrid.DataLoaded;
 
return true;

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

"Maxim Gritsenko" написал:

В делегате все ок.

Возможно, проблемы есть на диаграмме. Событийный подпроцесс для цепочки сообщений PageLoad и скрипта создали?


я все сделал как должно быть и Событийный подпроцесс тоже, высылаю скриншот.

Какая версия/сборка?

"Maxim Gritsenko" написал:

Какая версия/сборка?


Версия 5.1.1.159

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

"Maxim Gritsenko" написал:

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

Добрый день. Максим,
вы уточнили у свойх коллег?

Добрый день.
Пока что в процессе.

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

Пришел ответ от коллег из разработки.

Да, это возможно. Более того, код из вложения должен работать. Специально развернул 5.1.1 и проверил (практически один в один переписал код клиента). Раскраска реестра работает.

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

1) В реестр не вынесена (скрыта) колонка с названием Result;
2) В схеме реестра вообще отсутствует колонка с названием Result.

Я проверил и для текстовых полей, и для полей типа «Справочник» - вот результат:

На всякий случай привожу код обработки LoadPage (пример для базовой страницы реестра адресов):

Page.TreeGrid.GetRowConfigHandler = delegate (Terrasoft.Core.Entities.Entity row) {
string primaryColumnName = row.Schema.PrimaryColumn.Name;
string primaryColumnValue = row.GetColumnValue(primaryColumnName).ToString();
var config = new DataSourceRowConfig(primaryColumnValue);
Guid TypeColumnValue = row.GetTypedColumnValue<Guid>("AddressTypeId");
string cellColor = String.Empty;
if(TypeColumnValue.Equals(new Guid("{4F8B2D67-71D0-45FB-897E-CD4A308A97C0}"))){
cellColor = "Red";
}else if(TypeColumnValue.Equals(new Guid("{780BF68C-4B6E-DF11-B988-001D60E938C6}"))) {
cellColor = "Yellow";
}
var cellsBackground = new Dictionary<string, DataSourceRowColumnBackgroundColorConfigValue>();
if (!cellColor.Equals(String.Empty)) {
                cellsBackground.Add("Address", new DataSourceRowColumnBackgroundColorConfigValue(cellColor));
                cellsBackground.Add("Country", new DataSourceRowColumnBackgroundColorConfigValue(cellColor));
                config.AddConfig(new DataSourceRowColumnsBackgroundColorConfigValue(cellsBackground));
}
 
return config;
};
Page.DataSource.Loaded += Page.TreeGrid.DataLoaded;
return true;
Показать все комментарии

Люди добрые, дайте инструкцию по установке BPMonline Realty Версия 5.4 on-site при условии, что на сервере используется IIS7 и нет установочного приложения(имеются только исполняемые файлы).

Нравится

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

Здравствуйте Антонина!

Инструкция во вложении, если Вам необходима будет помощь в установке, сообщите нам.

С уважением,
Ковшевацкий Дмитрий
Специалист службы поддержки II линии
Группа компаний Terrasoft

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