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

Вариант со справочником не подходит, т.к. в этом случае нельзя вывести системную колонку "id bpm" Контрагента.

Прошу подсказать , какие есть варианты.

Спасибо.

Нравится

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

Шевчук Александр,

Для вывода информации из детали можно использовать стандартный элемент итогов 'Список'. Информация, отображаемая в данном блоке может быть выгружена в MS Excel. Ознакомиться с документацией можно по ссылке.

В качестве источника данных можно использовать либо существующий объект таблицы, либо специально настроенное представление (view) с нужными Вам данными.

Все данные из родительской таблицы могут быть настроены через родительскую связь (в Вашем случае это поле 'Id контрагента').

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

Можно, например, создать в основном объекте текстовое поле и при добавлении, изменении и удалении записей на детали синхронизировать там значение. Логику реализовать на БП, встроенном БП или на триггере на объекте детали.

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

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

 

Опишите более подробно кейс который вы хотите сделать с названием полей  и тд

 

Шевчук Александр,

Для вывода информации из детали можно использовать стандартный элемент итогов 'Список'. Информация, отображаемая в данном блоке может быть выгружена в MS Excel. Ознакомиться с документацией можно по ссылке.

В качестве источника данных можно использовать либо существующий объект таблицы, либо специально настроенное представление (view) с нужными Вам данными.

Все данные из родительской таблицы могут быть настроены через родительскую связь (в Вашем случае это поле 'Id контрагента').

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

Алла Савельева,

Спасибо за помощь, это именно то, что нужно!

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

Создаю деталь по инструкции https://academy.terrasoft.ru/documents/technic-sdk/7-12/sozdanie-detali… , но при попытке зайти в выбор получаю ошибку

Uncaught TypeError: Cannot read property 'caption' of undefined

    at i.getDefaultProfile (LookupPageViewModelGenerator.js?hash=10a3e18ed60b415a9bafcc1102d5b7ab:1368)

    at i.load (LookupPageViewModelGenerator.js?hash=10a3e18ed60b415a9bafcc1102d5b7ab:59)

    at i. (LookupPage.js?hash=10a3e18ed60b415a9bafcc1102d5b7ab:194)

    at LookupPage.js?hash=10a3e18ed60b415a9bafcc1102d5b7ab:328

    at Object.execCb (require.js:1699)

    at Module.check (require.js:881)

    at Module. (require.js:1136)

    at require.js:134

    at require.js:1186

    at each (require.js:59)

Нравится

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

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

Объект который используете для вашей детали имеет отображаемое поле? 

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

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

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

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

Добрый день! Есть задача обновить значения в таблице при удалении элемента детали: в обработчике onDelete - делаю все необходимые изменения, но потом необходимо вызвать this.callParent(arguments); - но насколько я понимаю этого невозможно добиться в асинхронной функции. Как правильно поступить в таком случае? Если вызывать сallParent(); в теле основной функции, то в асинхронном запросе не могу получить данные, так как они уже удалены из БД.

Нравится

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

Добрый день, а вы пробовали вызвать this.callParent(arguments) в callback-функции при асинхронном запросе (при получении ответа)

Конечно пробовал, так не работает( Видимо контент this теряется и возвращается уже не тот...

mcNosferatum,

а передать контекст выполнения внутрь функции?

Колодяжный Владислав Эдуардович,

Да, пробовал. Не работает(

Если обновить значения в таблице нужно в базе, то можно сделать на уровне серверной логики: добавить обработчик во встроенном БП объекта, где есть событие «Deleting», вызываемое до удаления.

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

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

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

Изображение удалено.

Нравится

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

Можно, на примере раздела, по нажатию на кнопку "Выбрать несколько записей" проверял:

 

setMultiSelect: function() {
				this.callParent(arguments);
				var rows = this.getGridData();
				this.addSelectedRecords(rows);
			},
			addSelectedRecords: function(gridData) {
				if (gridData) {
					var rowKeys = gridData.getKeys();
					this.set("SelectedRows", this.Ext.Array.push(rowKeys[0]));
				}
			}

 

Можно, на примере раздела, по нажатию на кнопку "Выбрать несколько записей" проверял:

 

setMultiSelect: function() {
				this.callParent(arguments);
				var rows = this.getGridData();
				this.addSelectedRecords(rows);
			},
			addSelectedRecords: function(gridData) {
				if (gridData) {
					var rowKeys = gridData.getKeys();
					this.set("SelectedRows", this.Ext.Array.push(rowKeys[0]));
				}
			}

 

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

Предпосылки:

В системе клиента есть N-количество пакетов привязанных к не активному хранилищу (снята галочку "Активное" в Списке хранилищ). Доступа к этому хранилищу нет.

Действия:

Пытаюсь обновить свой пакет из своего хранилища.

В итоге получаю ошибку :

"Хранилище "<Название не активного хранилища>" пакета "<Название НЕ моего пакета>" не активно"

Структура моего пакета не обновляется. 

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

Нравится

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

Унаследуйтесь от активного пакета или сделайте активным родителя

Унаследуйтесь от активного пакета или сделайте активным родителя

Из доступных только пакет Custom

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

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

 

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

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

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

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

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

Добрый день.

Есть ли возможность массово поменять значения, например, объединив использование $filter и MERGE? Или единственный вариант по идентификатору?

Цели 2:

1. Действительно массово заменить общее значение на другое

2. Использовать кастомный идентификатор, известный внешней системе, без необходимости каждый раз разрешать его в guid.

Подход "в лоб" вернул ошибку

Query options $select, $expand, $filter, $orderby, $inlinecount, $skip, $skiptoken and $top are not supported by this request method or cannot be applied to the requested resource.

Может, просто синтаксис чуть неверен?

Отправленный запрос (по сути тоже по Id)

curl -X MERGE -H 'Content-Type: application/json;odata=verbose' -H 'Accept: application/atom+xml' -i 'http://terapp-t.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou? eq '\''648dbb58-2aea-578d-e053-2413a8c01794'\' --data '{Name: '\''Other name'\''}'

Нравится

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

Вы уверенны что правильно передали название объекта те что в системе есть объект Accou очень похоже что вы имели ввиду Account (Контрагент) но недокопипастили!

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

В фильтре можно строить условия поиска по любым полям, но быстро и надежно работать именно с Id!

 

Григорий Чех,

 

Спасибо за ответ, но я пока не уверен, что хорошо объяснил свою задачу. Мне бы хотелось получить аналог update Account set Name='New name' where Name='Old Name'; я представляю, как сделать аналог select, но модифицировать могу только по первичному ключу

update Account set Name='New name' where Id='{61402C80-BB18-45FC-89A2-5BBFAC1A53F2}' через AccountCollection(guid'61402c80-bb18-45fc-89a2-5bbfac1a53f2')

 

Мой запрос выглядит так:

curl -X PUT -H 'Accept: application/atom+xml' -H 'Content-Type: application/json;odata=verbose' -i 'http://terapp-d.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou… eq guid'\''61402c80-bb18-45fc-89a2-5bbfac1a53f2'\' --data '{Name: "Other name3"}'

Ответ:

 

    Status Code: 405 Method Not Allowed

    Cache-Control: private

    Content-Length: 1197

    Content-Type: application/xml;charset=utf-8

    DataServiceVersion: 1.0;

    Date: Fri, 21 Sep 2018 10:03:14 GMT

    Server: Microsoft-IIS/8.5

    X-AspNet-Version: 4.0.30319

    X-Content-Type-Options: nosniff

    X-Frame-Options: SAMEORIGIN

    X-Powered-By: ASP.NET

 

<?xml version="1.0" encoding="utf-8" standalone="yes"?><error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><code>4</code><message xml:lang="">The URI 'http://terapp-d.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou… eq guid'61402c80-bb18-45fc-89a2-5bbfac1a53f2'' is not valid for PUT operation. The URI must point to a single resource for PUT operations.</message><innererror><message>The URI 'http://terapp-d.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou… eq guid'61402c80-bb18-45fc-89a2-5bbfac1a53f2'' is not valid for PUT operation. The URI must point to a single resource for PUT operations.</message><type>System.Data.Services.DataServiceException</type><stacktrace>   в System.Data.Services.DataService`1.HandlePutOperation(RequestDescription description, IDataService dataService)&#xD;

   в System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)&#xD;

   в System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)&#xD;

   в System.Data.Services.DataService`1.HandleRequest()</stacktrace></innererror></error>

По поводу Accou - это валидатор сайта укоротил url, он был перенесен через клипборд прямо из браузера

The URI must point to a single resource for PUT operations!!!

Делайте в два прохода вызовите фильтр и получите коллекцию id пробежитесь по ним и проапдєйтите записи. Или используйте другие механизмы. (БП или кодом вариантов много)

Можно не использовать OData, а сделать свой БП с текстовыми входными параметрами, который делает нужное обновление записей. А потом для запуска дёргать его через веб-сервис.

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

Это не вариант, ищется generic решение, как заткнуть каждую конкретную дыру, мы и так знаем, но их ожидается неопределенное количество :)

 

Это вариант. Если считаете, что это «дыра» и такое требуется массово, делайте свой универсальный конфигурационный веб-сервис, заточенный под потребности.

Например, в bpm'online loyalty были специальные веб-сервисы и их методы для чтения, добавления, изменения контактов, карт, покупок и прочих сущностей. В любом случае специализированная логика будет работать быстрее стандартной, которая будет гонять тысячу Id туда и обратно, а потом тысячу раз обновлять по одной записи.

Итого ответ на 21.09.2018 такой:

указанная функциональность включена в OData V4.01, поэтому ожидать ее в bpm'online в ближайшее время бессмысленно; нужно искать обходные решения.

Начать искать можно с комментариев выше этого ^.

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

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

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

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

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

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

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

Итак, есть объект раздела, ObjectModule. На его странице есть деталь, её объект ObjectDetail.

У ObjectDetail есть колонки: Id, ObjectModuleId (используется для связи с объектом раздела), Parameter, Value (параметр и значение, оба - строки).

Нужно в запросе отобрать все записи объекта раздела  ObjectModule, в которых на детали ObjectDetail есть Parameter типа "A" со значением "Value" равным 1. То есть указан параметр соответствующего типа и имеет соответствующее значение.

Возможна ли вообще реализация такого фильтра - по детали?

Нравится

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

Вы хотите в разделе отобразить эти данные через расширенный фильтр? Или реализацию кодом?

Интересует именно код в запросе EntitySchemaQuery.

Я примерно понимаю, что нужна группа фильтров - один по значению Parameter и второй - по значению Value.

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

Алла Савельева,

на клиенте запрос.

Смородинов Денис,

Как выглядит текст для данного запроса на SQL?

Судя из Вашего описания, Вам подойдет такая реализация ссылка

Пример приведен с фильтрацией по одному условию, а Вам нужно добавить ещё один фильтр в subFilters.

Алла Савельева,

не до конца понял немного, что именно фильтруется в том примере..

Ищутся записи Account по заданному значению колонки SearchNumber  детали AccountCommunication в разделе Account? Если да, то наверно подойдёт, спасибо.

Смородинов Денис,

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

За код не ручаюсь, не проверял, в блокноте накидал

 

"MyLookup": {
                    "dataValueType": this.Terrasoft.DataValueType.LOOKUP,
                    "lookupListConfig": {
                        "filters": [
                            function() {
                                var filterGroup = Ext.create("Terrasoft.FilterGroup");
 
								filterGroup.logicalOperation = Terrasoft.LogicalOperatorType.OR;
                                this.additionalFilter(function(collectionsId) {
									 for (var itemsFilters = 0; itemsFilters &lt; collectionsId.length; itemsFilters++) {
										var nameFilter = "RandomName";
										var lefExprs = (nameFilter + itemsFilters);
										var rih = (lefExprs + "additional");
										var innerFilterGroup = Ext.create("Terrasoft.FilterGroup");
										innerFilterGroup.logicalOperation = Terrasoft.LogicalOperatorType.OR;
 
										innerFilterGroup.add(lefExprs, Terrasoft.createColumnFilterWithParameter(
											Terrasoft.ComparisonType.EQUAL,
											"Id", collectionsId[itemsFilters]));
										filterGroup.add(rih, innerFilterGroup);
									}
                                }, this);
 
                                return filterGroup;
                            }
                        ]
                    }
 
 
 
 
 
 
					additionalFilter: function(callback, scope) {
						   var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
								rootSchemaName: "ObjectDetail"
							});
							esq.addColumn("ObjectModuleId");
							esq.addColumn("Parameter");
							esq.addColumn("Value");
							esq.filters.add(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Parameter",
								"A"));
							esq.filters.add(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Value",
								"1"));
 
							esq.getEntityCollection(function(response) {
								var collectionId = [];
								var resultCollection = response.collection.getItems();
								for (var i = 0; i &lt; resultCollection.length; i++) {
									collectionId.push(resultCollection[i].get("ObjectModuleId"));
								});
								Ext.callback(callback, scope, [collectionId]);
 
							}, this);
						}

 

Литвинко Павел,

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

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

Смородинов Денис,

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

Смородинов Денис пишет:

не до конца понял немного, что именно фильтруется в том примере..Ищутся записи Account по заданному значению колонки SearchNumber  детали AccountCommunication в разделе Account?

Да, Вы верно поняли. Выбираются все контрагенты, у которых значение в поле SearchNumber  детали AccountCommunication равно определенному номеру.

Коллеги, всё равно не получается..

Тут ещё и связь для детали своеобразно установлена, и фильтр тоже...

Итак, объект ObjectModule. В нём есть колонка-строка Request.

Объект ObjectDetail. В нём есть другая колонка-строка RequestDetail, деталь привязана по этим колонкам-строкам (Request == RequestDetail, не через справочные колонки). Ну и колонки Parameter, Value.

Далее конструкция:

var subFilters = Terrasoft.createFilterGroup();	
subFilters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Parameter", "A"));
//subFilters.addItem(Terrasoft.createColumnInFilterWithParameters("Value", ["1","2"]));
filters.add(Terrasoft.createExistsFilter("[ObjectDetail:RequestDetail].Request", subFilters));

Вылезает ошибка: элемент коллекции с именем "ObjectDetail:RequestDetail].Request" не найден.

Кажется, разобрался.

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

Добрый день. 

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

SqlException. Cannot define foreign key constraint 'FKDLqrwK7RvllotJ6M6yTi9oYcUA' with cascaded DELETE or UPDATE on table 'Contact' because the table has an INSTEAD OF DELETE or UPDATE TRIGGER defined on it. Could not create constraint. See previous errors.

Подскажите решение.

 

Нравится

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

Если зайти в конфигурацию, открыть схему таблицы Contact и пересохранить её возникают ли какие-то ошибки или схема пересохраняется без ошибок?

Алла Савельева,

данная ошибка возникает при обновлении структуры БД, не только в Контактах, но и в Проектах и т.п.

Каждый раз при сохранении, даже если не были внесены изменения возникает данная ошибка.

 

Crystal It Admin пишет:

Каждый раз при сохранении, даже если не были внесены изменения возникает данная ошибка.

1. Это Вы сейчас пишете о работе мастера раздела?

А в конфигурации схема таблицы пересохраняется?

2. Проверьте, если скомпилировать всю конфигурацию будут возникать ошибки?

3. До того, как начала возникать ошибка, выполнялись ли какие-то действия с Вашей стороны, после которых появилась данная проблема?

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

Алла Савельева,

1. да, о мастере.

2. в конфигурации при компиляции (Контакта) ошибок не возникает. Но при обновлении структуры БД выдаёт: 

Помилка

Не удалось обновить структуру для схем: Contact

3. Да, создал поле с привязкой к справочнику Проекты. 

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

 

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

Создали связь с справочником Проекты.

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

 

Значит, при создании детали (или справочника) в её объекте у поля «Контакт» стоит галка «каскадная связь». А таблица контактов со своими триггерами таковую создать не даёт.

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

Есть ли возможность это исправить? Сейчас сохранить любые изменения возможности нет, так как выскакивает эта ошибка.

Или нужно полностью откатывать? Это песочница, если что.

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

Или же найти в недавно изменявшихся таблицах эту связь FKDLqrwK7RvllotJ6M6yTi9oYcUA и удалить добавленное поле, которое её породило.

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

Был создан бизнес-процесс, в нем создается активность типа "Выполнить задачу" с названием "Провести презентацию". В ней есть привязка процесса к обьекту. Запускается она по событию изменения стадии (в условии фильтр: "по процессу = да", "Id = Id текущей продажи". После перезагрузки страницы (чистки кэша) плитка появляется. Самое интересное что другие активности появляются нормально, до этой в предыдущем процессе и после нее нормально тоже в этом же процессе. Если отключить "по процессу = да" в сигнале - все идет нормально и появляется тоже

Изображение удалено.

 

Нравится

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

Там, где комментарий «Привязка процесса к объекту» точно всё в порядке? Может, там элемент-разветвление забыли?

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

это модифицированный стандартный процесс, в той части он так и был

Так «был создан бизнес-процесс» или таки «модифицированный стандартный процесс»?wink

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

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

 создан на основе стандартного. Таймеров нет, иногда нормально появляется иногда нет, в том и проблема что без закономерности

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

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

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

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

По тому, что удалось найти:

VwEntityObjects - Представление, не подключается, даёт ошибку при компиляции: Ошибка сохранения: Внешний ключ "FKa8AInCEe1gKbjiHdyuiD9aCSbtM" ссылается на объект "dbo.VwEntityObjects", не являющийся пользовательской таблицей.

SysModule - список объектов, есть колонка Code, но не хватает всего. В частности, объекты деталей, в него уже не попадают.

Нравится

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

Посмотри  SysSchema там по типу менеджера схемы можно выбрать то что тебе нужно (название схемы). Создать представление наложить на него созданный объект и получить справочник. 

 

 

 

 

Посмотри  SysSchema там по типу менеджера схемы можно выбрать то что тебе нужно (название схемы). Создать представление наложить на него созданный объект и получить справочник. 

 

 

 

 

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