Вопрос

Создаю деталь по инструкции 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.<anonymous> (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.<anonymous> (require.js:1136)
    at require.js:134
    at require.js:1186
    at each (require.js:59)

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

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

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

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

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

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

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

Всем доброго времени суток. Версия 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]));
				}
			}

 

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

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

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

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

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

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

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

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

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

Из доступных только пакет 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 < 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 < 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 там по типу менеджера схемы можно выбрать то что тебе нужно (название схемы). Создать представление наложить на него созданный объект и получить справочник. 

 

 

 

 

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

Была создана кнопка (на основе кнопки "добавить заказ") в продажах "Добавить проект". Все работатет отлично, только при создании проекта не проставляется номер проекта. Номер с автоникриментом проставляется на основе статьи https://academy.terrasoft.ru/documents/technic-sdk/7-12/primer-ispolzov…, но там он только при создании проекта из меню и копировании его там, а как сделать что бы при создании проекта через бизнес-процесс проставлялся этот номер?

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

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

Можно как вариант так

В Этой же статье (по ссылке) есть ниже пример "Алгоритм реализации кейса на стороне сервера"  получение номера в событийного подпроцессе.

В этого случая не важно как будет создан объект через клиента или БП, он получит номер в любом случае. Если что то неясно опишите более подробно что вам нужно.

согласно этому коду - номер генерится при наступлении одного из событий "добавление" или "копировании", но процесс создает проект через элемент "добавить данные" а потом открывается на редактирование и при этом не isAddMode() не isCopyMode() не срабатывает и указывают на false, не давая пройти if для генерации номера

"

Прочитайте внимательно мой первый пост.

if (this.isAddMode() || this.isCopyMode()) 
- это относится к варианту когда нумерация сделана
 на клиенте (тобишь при нажатии кнопки сохранить копировать в карточке или реестре)

 Вам нужно посмотреть вторую часть статьи (Листать вниз пока не увидите раздел "Алгоритм реализации кейса на стороне сервера")

 

Те формирование номера можно делать в карточке (на клиенте) при первом сохранении  (this.isAddMode() || this.isCopyMode()) или в событийном БП объекта (При любом создании нового экземпляра объекта) Но не одновременно - это избыточно и не нужно!!!

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

1) сделать 2 сист настройки

2) сделать событийный процесс объекта

3) Опубликуйте 

4) Тестируй

В примере в событийном процессе объекта вы настраиваетесь на событие добавление записи! Она наступает при любом добавлении записи в объект. через механизмы ESQ в том числе через элемент БП добавить данные (как у вас в принскрине все должно быть нормально)!!!!!!

 

Если не получится или не поймещ что делать пиши что сделал по пунктам с принскринами.

 

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

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

 не работает почему-то

 

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

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

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

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

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

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

 есть один большей минус этого способа по причине него он не подходит "

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

"

1) Напишите как называется ваш проект и какие сис. настройки вы сделали (их имена). Имя системных настроек жестко привязано к имени объекта.

2) В примере для хранения номера  используется поле Code объекта. Если у тебя поле для номера называется по другому UsrNumber в БП должно быть

string.IsNullOrEmpty(Entity.GetTypedColumnValue<string>("UsrNumber "))

 

Entity.SetColumnValue("UsrNumber ", UserTask1.ResultCode);

См статью для понимания где произвести замены

3) В сам объект проект ты добавил событийный процесс в котором перед добавлением записи сделали все по инструкции? Обращаю внимание что все объекты событийного  подпроцесса должны находится в контейнере событийный субпроцесс (Это элемент БП внизу списка найдеш!) На картинке не видно что у тебя подпроцесс в событийном контейнере

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

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

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

Можно как вариант так

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