Вопрос

Добрый день.

Собственно, сабж: как получить свой SysAdminUnit.Id? Нашел только для старой "клиент-серверной" архитектуры. Есть какая-то доступная переменная или функция?

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

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

Здравствуйте!
Вот так:

private UserConnection UserConnection
        {
            get
            {
                if (_userConnection != null)
                {
                    return _userConnection;
                }
                _userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
                if (_userConnection != null)
                {
                    return _userConnection;
                }
                return _userConnection;
            }
 
            set { _userConnection = value; }
        }
 
var userId = UserConnection.CurrentUser.Id;

 

Здравствуйте!
Вот так:

private UserConnection UserConnection
        {
            get
            {
                if (_userConnection != null)
                {
                    return _userConnection;
                }
                _userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
                if (_userConnection != null)
                {
                    return _userConnection;
                }
                return _userConnection;
            }
 
            set { _userConnection = value; }
        }
 
var userId = UserConnection.CurrentUser.Id;

 

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

Здравствуйте! Была ли у кого-нибудь такая ситуация, когда на детали сортируешь по определённому полю, и происходит не просто сортировка, а изменяется количество записей, т.е. например до того как отсортировать записи на реестре детали, их было 8, а после - 12?

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

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

Старнное какоето поведение, может вы просто поиск не нажимали или не все записи подгружались сразу, проверьте внимательно

Старнное какоето поведение, может вы просто поиск не нажимали или не все записи подгружались сразу, проверьте внимательно

О, тоже не раз замечал клиент такое. В реестре видит одно количество записей, а в Summaries - другое. И только refresh помогает

Если в Summaries  больше то можно думать в сторону фильтрации и о каком реестре речь о Lookup справочнике или реестре раздела? 

В первом случае можно думать о фильтрации во втром права и тд. А свалов не было в консоли броузера?

Скорее всего, случайный сбой и после обновления страницы цифры должны совпасть.

Если же воспроизводится постоянно, нужно в профайлере смотреть SQL-запросы: может, какое-то хитрое условие фильтрации для этой группы в разделе или условия привязки детали к такому приводят.

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

 

 

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

При звонке из задачи нажимаю ПОЗВОНИТЬ. Звоню, звонок сохраняется, но к задаче не привязывается (не появляется на вкладке Звонки и SQL запросом видно, что ActivityId = NULL).

При этом на сервере разработки ОК, на проде - не работает привязка. 

Чего не хватает7

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

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

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

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

У меня 7.11.2 

Если дело не в доработках на тесте, попробуйте обновиться.

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

Добрый день!

Подскажите, можно ли как-то принудительно завершить подпроцесс, не дожидаясь его выполнения? Не отменить, а именно завершить.

 

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

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

На маркет плєйсе есть решение для массового закрытия БП по одному можно зайти в журнал БР выбрать нужный экземпляр и завершить!

На маркет плєйсе есть решение для массового закрытия БП по одному можно зайти в журнал БР выбрать нужный экземпляр и завершить!

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

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

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

Решение из маркет плейса не подходит по причине того что версия приложения 7.11.1, а дополнение должно работать на версии не ниже 7.11.3

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

А по поводу версий, Вы можете обновиться с 7.11.1 на 7.11.3, между минорными версиями не должно быть особо тяжело.

Шувалов Николай Юрьевич,

Да проверьте свою гипотезу. Зайдите в журнал процессов (на страничке дизайнера вверху) Найдите ваш экземпляр и попробуйте завершить подпроцессы или повторно запустить (подтолкнуть) на выполнение какого то из блоков БП

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

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

Добрый день! 
Появилась необходимость изменить базовое поле поиска, при выборе в окне справочного поля, и подставить туда своё значение.
Как это выглядит на примере:

 

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

Поиски не увенчались успехом, застопорился на схеме LookupPage.js

var primaryDisplayColumn = entitySchema.primaryDisplayColumn;
if (primaryDisplayColumn) {
	this.lookupInfo.searchColumn = {
		value: primaryDisplayColumn.name,
		displayValue: primaryDisplayColumn.caption
	};
}

Значение для данной колонки берётся отсюда, но как его подменять для определённого поля - не сообразил

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

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

В lookupListConfig просто укажи searchValue, пример:

columns: ["Id", "Name"],
searchValue: "Вериф",
columnName: "Name",
orders: [{
   columnPath: "Name",
   direction: Terrasoft.OrderDirection.ASC
}],

 

В lookupListConfig просто укажи searchValue, пример:

columns: ["Id", "Name"],
searchValue: "Вериф",
columnName: "Name",
orders: [{
   columnPath: "Name",
   direction: Terrasoft.OrderDirection.ASC
}],

 

Григорий Чех, columnName упорно изменяться не хочет. А именно значение в списке слева на первом скрине

Покажите свой код

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

"Gun": {
   "dataValueType": Terrasoft.DataValueType.LOOKUP,
   "lookupListConfig": {
      columns: ["LkpGauges", "UsrConfigProduct"],
      searchValue: "Вериф", // Вот это работает, в инпуте value заполняется
      columnName: "UsrConfigProduct",
      orders: [{
          columnPath: "UsrConfigProduct"
          direction: Terrasoft.OrderDirection.ASC
      }],
      "filters": [ //Фильтры ]
   }
}

 

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

Это справочное поле, не уверен, что сыграет роль. Но на всякий случай скажу. 

И еще, поле над которым производится действие, является полем в детали с редактируемым реестром

Это интересно. Т.е. теоретически можно прокинуть searchColumn в lookupInfo, но если у объекта есть колонка для отображения - всё перетрется.

варианта 2:

- Доделывать Lookup-модуль

- Оставить как есть, убрать в схеме детали отображаемое поле.

 

Попробуйте так

"Gun": {
   "lookupListConfig": {
      searchValue: "Вериф",
      searchColumn: "UsrConfigProduct"
   }
}

 

Варфоломеев Данила,

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

Самое интересное в том, что у меня получалось прокинуть значения. Но при обращении к lookupinfo он забирает все равно свои значения, которые получил из схемы ConfItem.js (куда ссылается справочное поле). И там прописано поле для отображения
(PrimaryDisplayColumnName)

 

Варфоломеев Данила,

пробовал и так - не работает... 

Попробуй переопределить loadVocabulary как то так\:

loadVocabulary: function(args, tag) {
    var column = this.getColumnByName(tag);
    args.schemaName = column.referenceSchemaName; //подставь свой
     this.callParent(arguments);
 }

Если не получится отпишись, вечером смогу проєксперементировать.

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

не совсем понял, что менять. Однако там все равно схема (ConfItem) по которой открытие справочника производится, я думаю, что её подменить можно, но это не то, что мы ищем

Прокинуть как-то туда primaryDisplayColumnName, у меня не увенчалось успехом

VadimCh пишет:
Однако там все равно схема (ConfItem) по которой открытие справочника производится

 Я немного неправильно описал.
Схема ConfItem генерится на основании объекта в конфигурации. На ConfItem ссылается справочное поле, которое вы пытаетесь открыть. Соответственно и берется PrimaryDisplayColumnName из ConfItem. Те 2 варианта так и остаются: либо менять PrimaryDisplayColumnName в null в каждом объекте на которое ссылается нужное вам справочное поле, либо переделать логику LookupPage.

Варфоломеев Данила,

В рамках реализации задачи, заместил LookupPage, и переработал тот кусок кода, который скидывал в посте, и присоединил новую схему

"lookupListConfig": {
  lookupPageName: "KmFiltrationBaseLookup",
}

Как по мне, про два варианта вы правы, но первый не подходит - если этот объект используется по всей системе не единожды. И везде требуется разная колонка, либо существует множество старых записей на основе колонки для отображения. При изменении колонки - старые записи будут отображаться не корректно

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

Здравствуйте. *bpm'sales
Есть ли возможность реализовать на практике следующее:
1. В форме фильтрации отчета, раздела аналитика, сделать поле выбора значений из справочника который выглядит следующим образом - 

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

Есть идеи?

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

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

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

var config = [

          {

                name: 'FormingMethod',

                dataValueType: 'FormingMethod'

            }

]

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

var config = [

          {

                name: 'FormingMethod',

                dataValueType: 'FormingMethod'

            }

]

Солонко Олег Иванович,

Можете детальней описать что нужно менять? Схему карточки выбора записи из справочника?

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

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

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

Как вариант, можно смотреть на создание карточки параметров отчёта в интерфейсе 5.Х. Там включение множественного выбора включатся одной галочкой. Но тогда нужно будет разбираться, как данные из 5.Х-карточки передаются в отчёт.

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

Здравствуйте. Как реализовать в форме отчета, поле выбора несколько значений из справочника и корректно передать/обработать выбранные Id в сам отчет?
При поиске наткнулся на примеры с Ответственным, но там выбор только 1 записи.

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

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

Можно сделать как в стандартных отчётах в разделе, которые вызываются из режима итогов, например, «Data entry compliance» в разделе контрагентов. Для построения отчёта в реестре фильтруют или помечают галочками нужные записи, переключаются в итоги, выбирают этот отчёт, а потом строят по выделенным, по отфильтрованным или по всем:

Схема этого отчёта AccountDataCompletenessReport, привязка таких отчётов к разделам задаётся в таблице SysModuleAnalyticsReport. Для выбора вариантов формирования используется страница BaseReportParameterInModulePageFilter.

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

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

Можно добавить отчёт именно в тот раздел, записи из которого нужно Вам фильтровать.

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

суть в том что такого раздела не существует это справочник. Ладно давайте конкретнее. У меня есть раздел Складские документы где ведется учет прихода/ухода Продуктов по складам(справочник) и мне нужно что бы в каком-то  отчете раздела Складские документы было окно выбора несколько складов на каких будет проверяться количество конкретного продукта. Это без проблем можно реализовать в тройке (TS 3) через MultiSelectWindow.

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

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

Здравствуйте. Интересует способ использования "Group By"  в entitySchemaQuery (сервер). При поиске наткнулся на топик - https://community.terrasoft.ru/questions/gruppirovka-v-entityschemaquery , но увы, ссылка с ответом битая. 

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

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

Пример использования на C#, документацию нашел только для клиентских запросов, но по аналогии все понятно

var query = new EntitySchemaQuery(_userConnection.EntitySchemaManager, schemaName);
var columnCount = query.AddColumn(query.CreateAggregationFunction(AggregationTypeStrict.Count, query.PrimaryQueryColumn.Name));
var countEntity = query.GetEntityCollection(UserConnection)[0];
var count = countEntity.GetTypedColumnValue<int>(comnCount.Name);
return count;

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

var esq = new Order(UserConnection);
esq.AddColumn(esq.CreateAggregationFunction(AggregationTypeStrict.Count, "Customer.Name").All());
	esq.AddColumn("Description");
	esq.AddColumn("Name");
	esq.AddColumn("Customer");

Добавит в запрос 
GROUP BY Order.Description, Document.Name, Order.CustomerId, Customer.Name;

 

 

 

 

 

Пример использования на C#, документацию нашел только для клиентских запросов, но по аналогии все понятно

var query = new EntitySchemaQuery(_userConnection.EntitySchemaManager, schemaName);
var columnCount = query.AddColumn(query.CreateAggregationFunction(AggregationTypeStrict.Count, query.PrimaryQueryColumn.Name));
var countEntity = query.GetEntityCollection(UserConnection)[0];
var count = countEntity.GetTypedColumnValue<int>(comnCount.Name);
return count;

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

var esq = new Order(UserConnection);
esq.AddColumn(esq.CreateAggregationFunction(AggregationTypeStrict.Count, "Customer.Name").All());
	esq.AddColumn("Description");
	esq.AddColumn("Name");
	esq.AddColumn("Customer");

Добавит в запрос 
GROUP BY Order.Description, Document.Name, Order.CustomerId, Customer.Name;

 

 

 

 

 

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

Спасибо большое!

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

EntitySchema entitySchema = UserConnection.EntitySchemaManager.GetInstanceByName("SysProcessElement");
var query = new EntitySchemaQuery(entitySchema);
EntitySchemaQueryColumn elementUIdColumn = query.AddColumn("SchemaElementUId");
EntitySchemaQueryColumn executeCountColumn = query.AddColumn(query.CreateAggregationFunction(AggregationTypeStrict.Count,
	entitySchema.PrimaryColumn.Name));
 
EntityCollection entities = query.GetEntityCollection(UserConnection);

 

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

Я для серверного кода пример и приводил :) От клиентского только документация :)

Вот документация по серверной. Ещё в этом документе есть информация.

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

У меня запускается некоторый БП, в котором почти на старте открывается страница на редактирование, соответственно там создается задача с заголовком, который я прописываю.

Необходимо отлавливать момент, когда пользователь, не сохранив страницу пытается еще раз запустить этот же БП.

Я пытался сделать это по задаче, но она никак не ссылается на страницу/объект редактирования. 

Как быть?

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

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

БП запускается как по сигналу по какому то действию оператора?

Самое простое решение перед открытием окна менять статус задачи (как вариант добавить в объект какой то признак Передан в работу) И не запускать (или завершать) БП у которых этот признак установлен.

Те

старовый сигнал

проверка что признак не установен

и либо выход

либо установка признака и затем открытие  странички редактирования!

БП запускается как по сигналу по какому то действию оператора?

Самое простое решение перед открытием окна менять статус задачи (как вариант добавить в объект какой то признак Передан в работу) И не запускать (или завершать) БП у которых этот признак установлен.

Те

старовый сигнал

проверка что признак не установен

и либо выход

либо установка признака и затем открытие  странички редактирования!

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

по меню Действия. Хотелось как проще, ведь система как-то видит какая задача связана с этой страницей и завершает ее после сохранения? Почему мы не можем это увидеть?

Можно, но очень не советую вам на них завязыватся. Они активно изменяются от версии к версии.

Добрый день, как отметил Григорий лучше иметь признак запуска процесса, но вы можете просматривать текущие задачи по процессам они отображаются у клиента из таблицы  SysProcessElementToDo или через js найти и распарсить элемент(если он есть) такого типа там вшит id записи к которой относится страница редактирования id="ProcessDashboardSchemaNotificationContainer-cce9076d-fa47-49a3-bec5-e53450fc421b-ViewModule_RightSideBarModule_ProcessDashboardModule"

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

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

Добрый день. 

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

Далее идет элемент Задание-сценарий(точно выполнился без ошибок на основе логирования), в котором устанавливается параметр процесса, и от него развилка на основе данного параметра либо на выход либо на отправку сигнала

Причем элемент Задание-сценарий выполен в Журнале процессов, а новый элемент не создается, процесс остался в статусе Выполняется.

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

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

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

Посмотрите все ветвления возвращают true

(Те в конце стоит return true)

да, в конце задание-сценария стоит логирование и потом return true

Евгений В.,

А выходов раньше нет? Логирование срабатывает?  Может на нем сваливается. 

Какой статус экземпляра БП если завершен то у вас не идет на генерацию сигнала а идет на выход! Смотрите в сторону с определением условия и его проверке в условном потоке.

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

элементы выполнены, но процесс завис на скринею

В условии [#EmailRequestItsalive#]==true, EmailRequestItsalive тоже булевый. 

Не видя логики скрипта, сложно сказать. Можно попробовать добавить ещё один блок скрипта после первого, пустой (только return true;). И посмотреть, застревает на нём или на предыдущем.

Если дело не в скрипте, то что-то не то в условиях. Может, не нужно «[#EmailRequestItsalive#]==true»? Например, в стандартном процессе «Поиск данных в соц. сетях» проверка параметра  делается просто как «GotoMessage» и «!GotoMessage».

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

Добавил после Задание-сценария элемент Читать данные (Активности) по Id из сигнала. 

В результате БП завис на элементе отправить сигнал. (сигнал произвольный).

Также в Журнале процессов есть тот же процесс в статусе Завершен, причем сигнал отправил спустя 6 часов после чтения данных. 

 

Нужно отлаживаться или дальше экспериментировать со структурой процесса. Свои предположения оставил в комментарии выше.

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