Написал свой Web-сервис, который выполняет хранимую процедуру в БД.
Вопрос: как зарегистрировать сервис в системе, какие строчки необходимо прописать в конфигурационных файлах

Нравится

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

Добавление сервиса:
В системе существует возможность написать свой WCF сервис.
1. Создаем схему "Исходный код".
2. Пример кода который содержит схема:

namespace Terrasoft.Configuration.CommandLineService
{
	using System.CodeDom.Compiler;
	using System.ServiceModel;
	using System.ServiceModel.Web;
	using System.ServiceModel.Activation;
	using System.Web;
	using Terrasoft.Common;
	using Terrasoft.Core;
	using Terrasoft.Core.DB;
	using Terrasoft.Core.Entities;
	using Terrasoft.Core.Store;
	using System;
	using System.Data;
	using System.Collections.Generic;
	using System.Linq;
	using Newtonsoft.Json.Linq;
 
        [ServiceContract]
	[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
	public class TestService
	{
 
		[OperationContract]
		[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
		public string TestServiceMethod(string data)
		{
			var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
			string key = string.Format("ExportFilterKey_{0}", Guid.NewGuid());
			userConnection.SessionData[key] = data;
			return key;
		}
         }
}

сервис содержит один тестовый метод который принимает строку и возвращает строку.
Публикуем схему
3. Вызов сервиса на стороне клиента

var request = Terrasoft.AjaxProvider.request({
				url: "../rest/TestService/TestServiceMethod",
				headers: {
					'Accept': 'application/json',
					'Content-Type': 'application/json'
				},
				method: 'POST',
				jsonData:  'test data',
				callback: function(request, success, response) {
					if (success) {
						console.log(response.responseText);
					}
				},
				scope: this
			});

Примеров в системе очень много.
ReportService, ColumnService

Александр, большое спасибо, с Web-сервисом все получилось

У меня сработал но передать данные не получилось. После добавления

BodyStyle = WebMessageBodyStyle.Wrapped

в

[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat =WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]

и правильном задании параметра jsonData (в формате jSon):

jsonData:  {
      data: ‘some data’
}

Напишите как у Вас метод принимает параметры?

Это рабочий вариант, и работает как описано выше

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode =
 AspNetCompatibilityRequirementsMode.Required)]
public class ITS_Servises
{
	[OperationContract]
	[WebInvoke(Method = "POST", BodyStyle =WebMessageBodyStyle.Wrapped,
	RequestFormat =WebMessageFormat.Json, ResponseFormat = 
        ebMessageFormat.Json)]
	public string SendDataTest (string name)
	{			
	     return name;
	}
 
}

Попробуйте

jsonData:  {
      data: {'name' :‘some data’}
}

"Бондаренко Александр Сергеевич" написал:

Попробуйте

jsonData:  {

      data: {'name' :‘some data’}

}


я знаю =) я просто к Вашему примеру написал=) потому что он чуток не коректный и заработает после указаных правок. И еще одно без атрибута "BodyStyle =WebMessageBodyStyle.Wrapped" не запрыгнет туда брейкпоинт

Вы изменили метод добавив атрибут, конечно он не будет работать, сервис будет по другому параметры принимать =)
На breakpoin это никак не может влиять.

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

Добрый день!

Есть проблема, в процессе страницы в событии LoadPageCompleated добавляю свою функцию на JS.
В которой передаю некоторый параметр в другое событие этой же страницы при помощи Terrasoft.AjaxMethods.ThrowClientEventWithParameters.

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

Нравится

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

Здравствуйте!
Не могли бы Вы подробнее описать проблему. В какое событие Вы передаете, на какой странице?

Конечно могу рассказать и показать:

И так внутри скрипта события код моей процедуры на JavaScript, который передает параметр в событие GetPhoneState в обработчике которого не видно Page. Еще раз повторюсь, что все происходит на одной странице.

Хорошее разрешение на скрине http://hostingkartinok.com/show-image.php?id=aa0e73f38e1ade5d4250400ac6…

Есть такое мнение, что как-то не правильно передаем Page.Process.InstanceUid. Потому, как при вызове нашего события его уже нет.

Все получилось. Спасибо Михаилу Павлову.

Рад, что у Вас получилось, обращайтесь еще.

У меня чем-то похожая проблема.
Есть страница редактирования, стандартно поднимаемая из реестра. На ней кнопка, поднимающая окно диалога, в котором пользователь вводит некий параметр. Его значение надо вернуть по ОК и закрытию поднятого диалогового окна в страницу редактирования и желательно, чтобы отработало событие процесса страницы редактирования.
Ситуация похожая на работу со справочником, вызываемым из стандартного контрола, только вместо контрола кнопка и окно свое, а не справочника поднимается.
На данный момент добился того, чтобы через SessionData получить в "родительском" окне выбранное в диалоге значение... но вот вызываю из диалога по закрытию его эвент родительского процесса - он вызывается, но в нем не виден Page... соответственно не могу в этом эвенте обращаться к контролам на странице редактирования и так далее...

эвент вызываю на кнопке ОК диалога через
parentProcess.ThrowEvent(parentProcess.InternalContext, "EventName")
parentProcess получаю через переданный в диалог параметр... смотрел дебаггером экземпляр процесса вроде тот что нужно, но внутри эвента Page = null...

Здравствуйте, Александр!
Попробуйте использовать стандартное действие процесса "Открыть страницу" и в нем указывать параметр "CloseMessage" и обрабатывать это сообщение в родительской странице, а не бросать сообщение "вручную" из страницы.

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

Александр, а можете более подробно описать эту часть процесса, со скриншотами и скриптами?

Александр, у меня была данная проблема потому, что я не в ту страницу отправлял евент проверьте что parentProcess.InternalContext возвращает именно ID вашей нужной страницы.

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

Александр, действительно, сообщение может отправляться не в ту страницу просто. Посмотрите механизм реализации этого функционала в "OpenLookupUserTask" и попробуйте сделать по аналогии. Должно правильно работать.

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

Вдогонку к теме (раз уж с URL разделов разобрались)
https://community.terrasoft.ru/forum/topic/9805
возник такой вопрос: как мне направить пользователя на конкретный URL?
Понятно, что надо что то дописать в MainPage.PageLoadComplete, но вопрос что и куда, чтобы всё не упало.......

Нравится

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

И в ответ тишина........
Никто не пробовал что ли?
И мыслей нет?
Мне интересно через
HtmlWindow.Open из System.Windows.Forms стоит пробовать или сразу забыть?

И еще такой вопрос: так как надо перенаправлять пользователя не всегда, а только после того как он вошел в систему (после "чистого" логина) как мне узнать с какого URL пришел пользователь?
Через HttpContext доставать?

Здравствуйте. По поводу вопроса в шапке:
http://msdn.microsoft.com/en-us/library/t9dwyts4.aspx

А по поводу второго вопроса, мне кажется проще дописать в сессию пользователя какой-то флаг, и от него уже "плясать".
Что-то вроде:

public void Redirect()
    {
       HttpSessionState session = HttpContext.Current.Session;
        if (session["redirect"] == null) {
            session.Add("redirect", 1);
            HttpContext.Current.Response.Redirect(url);             
    }

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

Здравствуйте. По поводу вопроса в шапке:

http://msdn.microsoft.com/en-us/library/t9dwyts4.aspx

С уважением,

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

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


Ларчик просто открывался :-)

"Олейник Дмитрий" написал:
проще дописать в сессию пользователя какой-то флаг

с этого момента поподробнее, не понял

а, пардон, понял. Но все равно не понял :-)
Этот Redirect в MainPage получается вставлять?.....

Александр, да.

Спасибо, попробую.

Все получилось. :smile:

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

Метод такой вышел:

void RedirectToDepartmentHomeModule(Guid ContactId) {
 
Guid DepartmentId = Guid.Empty;
string HomeURL = "";
 
var session = HttpContext.Current.Session;
 
if (session["redirect"] == null) {
	session.Add("redirect", 1);
 
	Select selectDepartmentId = new Select(UserConnection).
			Column("DepartmentId").
				From("Contact").
					Where(Column.Const(ContactId.ToString())).IsEqual("Id")
		as Select;			
 
	using (var dbExecutor = UserConnection.EnsureDBConnection()) {
		using (IDataReader dr = selectDepartmentId.ExecuteReader(dbExecutor)) {
			if (dr.Read()) {
				DepartmentId = UserConnection.DBTypeConverter.DBValueToGuid(dr[0]);
			}			
		}
	}
 
	Select selectHomeURL = new Select(UserConnection).
			Column("HomeURL").
				From("DepartmentHomeModule").
					Where(Column.Const(DepartmentId.ToString())).IsEqual("DepartmentId")
		as Select;			
 
	using (var dbExecutor = UserConnection.EnsureDBConnection()) {
		using (IDataReader dr = selectHomeURL.ExecuteReader(dbExecutor)) {
			if (dr.Read()) {
				HomeURL = dr[0].ToString();
			}			
		}
	}
 
	if (!String.IsNullOrWhiteSpace(HomeURL)) {
		HttpContext.Current.Response.Redirect( HomeURL );
	}
}
}

P.S. Одного не пойму: какого лешего столь простую (как оказывается) функциональность нельзя было реализовать сразу в поставке? Задача стандартная до ужаса..... ну да ладно......

Ну, как вариант, часть кода с запросом можно унифицировать: создать свой класс в SourceScheme и реализовать общий метод. Что-то вроде

public string executeSelect(string columnName, string tableName, string recordId, string filterColumnName)
{
var result;
Select selectDepartmentId = new Select(UserConnection).
                        Column(columnName).
                                From(tableName).
                                        Where(Column.Const(recordId)).IsEqual(filterColumnName)
                as Select;                      
 
        using (var dbExecutor = UserConnection.EnsureDBConnection()) {
                using (IDataReader dr = selectDepartmentId.ExecuteReader(dbExecutor)) {
                        if (dr.Read()) {
                                result= UserConnection.DBTypeConverter.DBValueToGuid(dr[0]);
                        }                       
                }
        }
        return result.ToString();
}

и тогда все будет красивее:

void RedirectToDepartmentHomeModule(Guid ContactId) {
 
Guid DepartmentId = Guid.Empty;
string HomeURL = "";
 
var session = HttpContext.Current.Session;
 
if (session["redirect"] == null) {
        session.Add("redirect", 1);
        string res = executeSelect("DepartmentId", "Contact", ContactId.ToString(), "Id");
        string res2 = executeSelect("HomeURL", "DepartmentHomeModule", res , "DepartmentId");
 
 
        if (!String.IsNullOrWhiteSpace(res2)) {
                HttpContext.Current.Response.Redirect( res2);
        }
}
}

Согласен. Вообще эту конструкция много где пользуется, надо так и сделать.

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

Как сформировать URL на раздел?
Если делать так:
http://bpm/0/ViewPage.aspx?Id={ID СТРАНИЦЫ РАЗДЕЛА}
то открывается страница раздела, но "голая", без всей "обвязки" в виде закладок рабочих мест, разделов и т.д.

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

Нравится

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

Изучал, как сделать открытие раздела с выбранной в нём записью. Может, будет полезно:

http://localhost/0/ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a&pcv=[guid записи]&pdv=[name записи]&ActiveTabId=PageContainer_[guid раб. места]_[guid раздела]_[guid в SysModuleInSysModuleFolder]

Пример:

http://localhost/0/ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a&pcv=0b2de5af-f887-41b6-9ffc-d96da088a07e&pdv=VPupkin&ActiveTabId=PageContainer_5ca0dabc8c894e1a9bb536407e1c4ef2_065063c98180e011afbc00155d04320c_800581929880e011afbc00155d04320c

pdv=[name записи]

вот это не совсем понял что имеется ввиду

Значение первичного поля для отображения, обычно Name.

Спасибо, разобрался.

Вот так работает просто до конкретного раздела:
http://bpm/0/ViewPage.aspx
?
Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a
&
ActiveTabId=PageContainer
_[ID Рабочего места в SysModuleFolder]
_[ID Раздела в SysModule]
_[ID Записи Раздела в SysModuleInSysModuleFolder]

Ну и не забывать про мелочи, что ID'шники после PageContainer без дефисов и скобок.... :smile:

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

Как это сделать ? не могу найти аналогов =( И сразу как фильтровать с помощью константы или какого то поля? Тут есть что-то типа бизнес правил как к справочникам (BusinessRuleModule.enums.RuleType.FILTRATION)

Нравится

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

"Ильюша Сергей Николаевич" написал:

Как это сделать ? не могу найти аналогов =( И сразу как фильтровать с помощью константы или какого то поля? Тут есть что-то типа бизнес правил как к справочникам (BusinessRuleModule.enums.RuleType.FILTRATION)

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


Добрый день, Сергей!
На 7.0.0 возможность фильтровать по нескольким колонкам деталь не реализована.
Такая возможность появится есть на 7.0.1.
выглядеть это так

filterPath: ['Application', 'Contact'],
//значения берутся из колонок
filterValuePath: ['Id', 'Contact'],
//значения берутся из констант
filterValue: [contstant1, contstant2],

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

"Ищенко Елена" написал:

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

Судя по дате заливки то с 7.0.1.273

"Бондаренко Александр Сергеевич" написал:
Ильюша Сергей Николаевич пишет:

Как это сделать ? не могу найти аналогов =( И сразу как фильтровать с помощью константы или какого то поля? Тут есть что-то типа бизнес правил как к справочникам (BusinessRuleModule.enums.RuleType.FILTRATION)

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

Добрый день, Сергей!

На 7.0.0 возможность фильтровать по нескольким колонкам деталь не реализована.

Такая возможность появится есть на 7.0.1.

выглядеть это так

filterPath: ['Application', 'Contact'],

//значения берутся из колонок

filterValuePath: ['Id', 'Contact'],

//значения берутся из констант

filterValue: [contstant1, contstant2],


Спасибо!!! почти угадал как это зделать =) А как скомбенировать ? Тоесть одно поле колонка второе константа ?

"Ильюша Сергей Николаевич" написал:
Бондаренко Александр Сергеевич пишет:

Ильюша Сергей Николаевич пишет:

Как это сделать ? не могу найти аналогов =( И сразу как фильтровать с помощью константы или какого то поля? Тут есть что-то типа бизнес правил как к справочникам (BusinessRuleModule.enums.RuleType.FILTRATION)

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

Добрый день, Сергей!

На 7.0.0 возможность фильтровать по нескольким колонкам деталь не реализована.

Такая возможность появится есть на 7.0.1.

выглядеть это так

filterPath: ['Application', 'Contact'],

//значения берутся из колонок

filterValuePath: ['Id', 'Contact'],

//значения берутся из констант

filterValue: [contstant1, contstant2],

Спасибо!!! почти угадал как это зделать =) А как скомбенировать ? Тоесть одно поле колонка второе константа ?


Комбинируйте.
Первым должен взять filterValuePath потом filterValue. Попробуйте

"Бондаренко Александр Сергеевич" написал:Комбинируйте.
Первым должен взять filterValuePath потом filterValue. Попробуйте

Я так и сделал сначало но фильтрует только по колонках, а по константах нет, и еще я заметил что у меня вопще по filterValue не фильтрирует, пробовал только по константе отфыльтрировать мне выдало весь список, думаю что просто значения этой переменной не обрабатывается, моя версия бпм-а 7.0.1.328

{
	name: 'tradePointsDetail',
	schemaName: 'TradePoitDetail',
	type: Terrasoft.ViewModelSchemaItem.DETAIL,
	filterPath: ['Parent','Type'],//['Parent', 'Type'],
	filterValuePath: ['Id'],
	filterValue: ['179e73f6-20de-4fbf-b4e7-3d7b01c40516'],
	caption: resources.localizableStrings.tradePointsDetail,
	visible: true,
	collapsed: false,
	leftWidth: '60%',
	rightWidth: '40%',
	wrapContainerClass: 'control-group-container'
}

"Ильюша Сергей Николаевич" написал:
Бондаренко Александр Сергеевич пишет:

Комбинируйте.

Первым должен взять filterValuePath потом filterValue. Попробуйте

Я так и сделал сначало но фильтрует только по колонках, а по константах нет, и еще я заметил что у меня вопще по filterValue не фильтрирует, пробовал только по константе отфыльтрировать мне выдало весь список, думаю что просто значения этой переменной не обрабатывается, моя версия бпм-а 7.0.1.328

{

        name: 'tradePointsDetail',

        schemaName: 'TradePoitDetail',

        type: Terrasoft.ViewModelSchemaItem.DETAIL,

        filterPath: ['Parent','Type'],//['Parent', 'Type'],

        filterValuePath: ['Id'],

        filterValue: ['179e73f6-20de-4fbf-b4e7-3d7b01c40516'],

        caption: resources.localizableStrings.tradePointsDetail,

        visible: true,

        collapsed: false,

        leftWidth: '60%',

        rightWidth: '40%',

        wrapContainerClass: 'control-group-container'

}


Значит нельзя комбинировать.(
Никто не рассматривал такой кейс.

а как хоть по константе фильтровать ? пример выше не работает (правда нашел решение но оно карявое)

var config = new DetailPageConfig({
	caption: resources.localizableStrings.CompaignTargetDetailCaption,
	action: ConfigurationEnums.CardState.View,
	schemaName: 'CampaignTargetDetail',
	filterPath: ['Contact', 'CampaignResponse'],
	filterValue: [contactId, ConfigurationConstants.Campaign.Response.Expected]
});

Работает 100% на 448 сборке

"Бондаренко Александр Сергеевич" написал:Работает 100% на 448 сборке

Зделал так:

{
	name: 'tradePointsDetail',
	schemaName: 'TradePoitDetail',
	type: Terrasoft.ViewModelSchemaItem.DETAIL,
	filterPath: ['Parent'],//['Parent', 'Type'],
	//filterValuePath: ['Id'],
	filterValue: ['4dcc8fce-9bde-44ec-a431-302befd28640'],
	caption: resources.localizableStrings.tradePointsDetail,
	visible: true,
	collapsed: false,
	leftWidth: '60%',
	rightWidth: '40%',
}				

Выдает ошибку, но если указывать не как массив не фильтрует, а выдает весь список. Но с колонками все хорошо работает

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

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

и что делать ? =) Как мне это реализовать ?

"Ильюша Сергей Николаевич" написал:
Бондаренко Александр Сергеевич пишет:

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

и что делать ? =) Как мне это реализовать ?


Сергей, такая ошибка есть. Сейчас с ней разбираемся.

Сделал

"Ильюша Сергей Николаевич" написал:
Бондаренко Александр Сергеевич пишет:

Работает 100% на 448 сборке

Зделал так:

{

        name: 'tradePointsDetail',

        schemaName: 'TradePoitDetail',

        type: Terrasoft.ViewModelSchemaItem.DETAIL,

        filterPath: ['Parent'],//['Parent', 'Type'],

        //filterValuePath: ['Id'],

        filterValue: ['4dcc8fce-9bde-44ec-a431-302befd28640'],

        caption: resources.localizableStrings.tradePointsDetail,

        visible: true,

        collapsed: false,

        leftWidth: '60%',

        rightWidth: '40%',

}                              

Выдает ошибку, но если указывать не как массив не фильтрует, а выдает весь список. Но с колонками все хорошо работает


Пробовал такое на версии 7.0.1.598 тоже самое.... мб както можно в самой детали фильтрировать ?

Можно фильтровать и в детали.
Используя метод applyFilter
Пример:

this.methods.applyFilter = function(select, args) {
                                                               var filter = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
                                                                              '[CampaignTarget:Campaign:Id].' + args.filterPath, args.filterValue);
                                                               select.filters.add('filterName', filter);
                                                               return false;
                                               };
Показать все комментарии

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

НО! По логике приложения изначально ВСЕ поля редактирования НЕ Enabled и выставляются в Enabled в PageLoadComplete страницы редактирования в зависимости от пользователя текущего и других условий.

Так вот если пройти по ссылке из письма (bpm закрыт у пользователя), попросят залогинится, логинимся и в открывающейся странице редактирования ВИДИМ ВСЕ ПОЛЯ АБСОЛЮТНО ДОСТУПНЫЕ ДЛЯ РЕДАКТИРОВАНИЯ.
То есть не то что PageLoadComplete не отработал, еще болт был спокойно положен на то, что у всех полей флажок Enabled в дизайнере снят....

Это как понимать?

Нравится

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

Так ни у кого фантазий нет на тему?

Александр, Вы пробовали убрать из PageLoadComplete выставление свойств в Enabled?
Я это к тому, что может PageLoadComplete отрабатывает, но проблема либо в условиях, либо где-то еще поля выставляются в Enabled.

Гм.....сорри, я идиёт. Я страницу редактирования сделал новую и из реестра оно в новой открывалась, а ссылка формировалась на старую..... :biggrin:

Спасибо, что заставили повнимательнее посмотреть.....

Рад, что проблема была решена. Обращайтесь еще.)

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

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

Может кто то уже сталкивался с таким?

Нравится

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

А чем деталь с кнопками "Добавить" и "Удалить" не подходит? По кнопке "Добавить" открывать лукап.

Поподробнее.....
Я просто не понимаю как связи будут хранится и где? Ну что станок 1 есть аналог станку 2 и в то же время он аналог для станка 3?

P.S. Может под вечер уже туплю?....

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

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

А, ну да, точно туплю под вечер :-)

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

Добрый день!!!
У меня вопрос, как добавить поле не привязанное к полю объекта (таблицы). Я попробовал так, без указания пути:

{
        type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
        name: 'EmployeesNumberVK',
        dataValueType: Terrasoft.DataValueType.INTEGER,
        visible: true,
        customConfig: {
                readonly: true,
                enabled: true
        }
}

В добавлении или редактировании карточки оно отображается нормально, но когда в режиме просмотра, ничего не отображается (ни одного элемента, пустая страница). Как зделать так чтобы оттображалась (пока зделал viewVisible: false работает но мне это не подходит так как не отображается это поле =( )? И сразу вопрос после решение первого, можно ли будет его устанавливать каким-то селектом? Например: есть функция выбора каких-то данных и установить значение что бы оно отображалось в просмотре

Нравится

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

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

Попробуйте использовать виртуальную колонку

{
	type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
	caption: resources.localizableStrings.EntityControlCaption,
	columnType: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
	name: 'EntityVirtual',
	isRequired: true,
	dataValueType: Terrasoft.DataValueType.ENUM,
	visible: true,
	isCollection: true,
	customConfig: {
		className: 'Terrasoft.ComboBoxEdit',
		list: {
			bindTo: 'EntityVirtualList'
		},
		prepareList: {
			bindTo: 'getEntityItems'
		}
	},
	dependencies: ['EntityVirtual'],
	methodName: 'onEntityChange'
}

А чем отличается виртуальное поле от CALCULATED_COLUMN (я просто думаю оно мне должно больше подойти к моей задаче), где-то можно посмотреть примеры или какое то описание к перечислениям Terrasoft.ViewModelColumnType

Все описания по бизнес правилам должны быть в документации по бизнес правилам. Больше к сожалению нет.

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

{
	type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
	columnType: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
	name: 'EmployeesNumberVK',
	caption: resources.localizableStrings.EmployeesNumberVK,
	dataValueType: Terrasoft.DataValueType.TEXT,
	visible: true,
	viewVisible: true,
	customConfig: {
		className: 'Terrasoft.TextEdit',
		value: '1',
		readonly: true,
		enabled: true
	}
};

второй вариант:

{
	type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
	columnType: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
	name: 'isCheckedEnabled',
	dataValueType: Terrasoft.DataValueType.BOOLEAN,
	visible: false,
	viewVisible: true
};

ошибка при просмотре

Так сразу и не скажу.
Напишите пожалуйста версию ядра, нужно воспроизвести.

"Бондаренко Александр Сергеевич" написал:Так сразу и не скажу.
Напишите пожалуйста версию ядра, нужно воспроизвести.

Версия 7.0.1.328

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

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

С уважением,
Фещенко Денис
Разработчик BMPonline

а как мне проапгрейдить ?

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

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

НЕ пойму где собака зарыта, в карточке отображается значения, в реестре нет
Сам профили почистила, в карточке реестра заново привязала источник данных, галка "всегда загружать данные " стоит

Нравится

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

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

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

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

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

Вот так вот ругается

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

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

Action: Click
ControlId: PageContainer_TranslationOrdModulePage_DetailGridContainer292bc2437a8a42c0ad30c039fc156913_SaveToFileButton
SubmitAjaxEventConfig: {"config":{"viewStateMode":"include","extraParams":{}}}

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

Нравится

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

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

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

Добрый день,

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

Спасибо.

Обнадежили.....

Александр,

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

Спасибо.

Ссылку на архив бекапа обезличеной БД отправил через портал ТП.
Раздел заявки --> Переводы

Добрый день, Александр.

Необходимо всегда загружать данные файла в настройках реестра детали (OrdFileListPage):

После установки признака очистите кеш.

Да японский городовой.......
Два раза за неделю на одни те же грабли.....:lol:
От жеж я идиёт!!!
Спасибо!

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