Добрый день. Подскажите, пожалуйста, как разрешить следующую проблему.

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

 

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

Нравится

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

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

Запуск механизма массового удаления осуществляется при помощи GridUtilitiesService. метод DeleteRecordsAsync который принимает массив идентификаторов записей, название сущности и словарь, который отвечает за конфигурирование параметров, так же метод подготавливает параметры и запускает MultiDeleteExecutor. Особенностью метода является управляемый запуск операции удаления при помощи системной настройки с кодом DefaultNumberItemsReturned, которая отвечает за запуск операции в фоне или в общем потоке.

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

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

Есть задача. ЕЕ состояние завершена. Срок завершения 01.01.2018.

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

Что нужно проверить или изменить?

Нравится

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

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

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

Узнать Id процесса кейса можно следующим образом:

1. Через базу данных, в таблице SysProcessEntity найти запись где EntityId = <Id акции>. В выборке нас интересует результат колонки SysProcessId.

2. В системе перейти в Журнал процессов, открыть любую запись лога бизнес-процесса и заменить в ссылке Id карточки лога, на результат колонки SysProcessId, то есть ссылка должна заканчиваться так: SysProcessLogPageV2/edit/<SysProcessId с выборки>.

3. Откроется карточка лога кейса. Через неё можно посмотреть в каком состоянии выполнения кейс. А если есть ошибка в его выполнении - сориентироваться по ошибке.

Также следует проверить наличие прав доступа у пользователя на запись акции, может ли он изменять её.

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

Спасибо!

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

Добрый день.

В разделе с активностями не получается удалить служебную записку. Выдается сообщение "1 записей используются в других разделах" и все равно нельзя удалить. Есть какой-либо запрос для удаления активности?

Нравится

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

Добрый день!

Вы можете удалить запись с помощью sql запроса:

delete from Actitity where id '...' где вместо трех точек подставить id нужной Вам записи (если нет доступа к бд, то id можно просто скопировать из адресной строки браузера при открытии интересующей активности). Также можно удалять по заголовку и другим колонкам записи, но в таком случае нет уверенности, что запись по этим колонкам уникальна (в связи с этим удаление 1 записи лучше выполнять по id). В случае, если у Вас база размещена в облаке и нет доступа к бд, то запрос можно выполнить в разделе "Конфигурация"-"Sql-сценарии". После выполнения запроса на удаление, вероятнее всего, у Вас появится ошибка о наличии связей по ключу с другой сущностью. В таком случае нужно вывести текст ошибки (просто в реестре раздела "sql-сценарии" вывести колонку "Текст последней ошибки") и выполнить обнуление связей. Например, получили ошибку о том, что данная запись не может быть удалена, так как имеет связь с каким-то контактом. В таком случае запрос на обнуление такой связи будет выглядеть следующим образом:

update Contact set ActivityId = null where ActivityId = '...' (опять же подставляете id активности, которую хотите удалить). После чего снова можете пробовать удалить запись первым запросом. 

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

 

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

Можете подсказать в какой схеме расположена идентификация контакта в рамках входящего письма?

Нравится

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

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

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

Denys Diachenko,

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

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

 

Идентификация контакта происходит в 

private IRuleRelationModel CreateRule

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

Добрый день.

Не получается удалить заявку (служебная записка) в bpm online sales. Пишет, есть связанные заявки.

Есть какой-либо запрос для удаления заявки?

 

Нравится

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

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

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

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

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

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

Здравствуйте. Можно ли как то реализовать логику следующего рода:

1. Заместить объект MailboxSyncSettings  (Настройки синхронизации с почтовым ящиком) 

2. Добавить в MailboxSyncSettings колонку, ссылающуюся UsrLookup1 (Справочник 1).

3. Заместить объект Activity  (Активность) 

4. Добавить в Activity колонку, ссылающуюся UsrLookup1 (Справочник 1).,

5. Заместить объект Contact  (Контакт) 

6. Добавить в Contact колонку, ссылающуюся UsrLookup1 (Справочник 1).

7. Заместить объект Case  (Обращение) 

8. Добавить в Case колонку, ссылающуюся UsrLookup1 (Справочник 1).

9. Добавить ящик для синхронизации. Для колонки , ссылающейся на UsrLookup1 проставить Value 1

10. При синхронизации почты (создании Активностей) проставлять созданным письмам в колонку UsrLookup1 значение Value 1

11. При поиске контакта для письма учитывать значение Value 1, если создается новый контакт, то для нового контакта для колонки UsrLookup1 проставить Value 1

12. При создании обращения учитывать значение Value 1 (с этим разобраться удалось)



Не получилось найти схемы, которые при синхронизации ориентируются MailboxSyncSettings при синхронизации с MS Exchange (чтобы оттуда дополнительно подхватывать свои значения).

Нравится

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

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

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

Denys Diachenko,

Здравствуйте, а с какой версии появилась данная схема? У меня разработка происходит на версии 7.8. Схему EmailMessageHelper я там не обнаружил.

Здравствуйте, EmailMessageHelper появилась начиная с версии 7.10.0

Shevchenko Andrey,

А какая схема выполняла её функции до версии 7.10.0?

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

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

И естественно это все бы отвалилось при обновлении.

Так что ответ на вопрос “Можно ли как то реализовать логику” - да, можно, если только обновитесь до 7.9.2 или выше

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

Добрый день, Коллеги!

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

Как это реализовать? Если можно подробно, спасибо заранее!

Нравится

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

Артем, добрый день! Рекомендуем вам добавить свой пользовательский модуль с необходимыми полями, а при нажатии на действие делать переход в него с помощью PushHistoryState. Пример подобной реализации - метод openDuplicatesModule в AccountSectionV2.

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

Выдает:

ActualizeMoneyColumnsDbStructure.Base.cs / 494 / "Terrasoft.Core.Process.ActualizeMoneyColumnsDbStructure.Result" скрывает наследуемый член "Terrasoft.Core.Process.Process.Result". Если скрытие было намеренным, используйте новое ключевое слово.

Как исправить?

Нравится

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

Предупреждения не влияют на работу приложения, их можно игнорировать.

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

При проверке конфигурации выдает:

1)

SQL сценарий / pp / Предупреждение / Отсутствует аналогичный SQL сценарий для СУБД Oracle

Оракл не используется, база на MS SQL

2)

Данные / SectionDesigner_UsrPROVERKA_SysModuleInWorkplace / Ошибка / Не привязаны данные для связанного объекта "SysWorkplace" по колонке "SysWorkplace". Значение: "6c869930-fdb9-486f-9ce2-df2ac774101d"

Как исправить?

Нравится

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

В первом сообщении предупреждение, править не нужно, а во втором нужно привязать данные к SysWorkplace. 

Мотков Илья,

Был бы признателен за более подробное объяснение про привязку данных. Или за ссылку на инструкцию.

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

6c869930-fdb9-486f-9ce2-df2ac774101d. Т.е похоже, что привязка ссылается на несуществующее рабочее пространство, либо это рабочее пространство было добавлено, но его нет в привязках

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

У меня есть деталь DocumentsDetail с реестром, отображающая Grid документов. Я реализовал в ней группировку документов по типу и в качестве содержимого каждой группы отображаю Grid с набором документов соответствующего типа. Но возникает вопроса:

Как унаследовать конфигурацию Grid и столбцов из DocumentDetail, чтобы Grid каждой группы выглядел идентично гриду детали? Т.е, 1)Имел идентичный набор столбцов. 2) Имел идентичные настройки внешнего вида, стилизацию.

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

 

//diff:

            {               

                "operation": "merge",

                "name": "Detail",

                "values": {

                    }

                }

            },                        

            {

                "operation": "insert",

                "parentName": "Detail",

                "name": "DocumentsTestList",

                "propertyName": "items",

                "values": {

                    "generator": "ConfigurationItemGenerator.generateContainerList",

                    "idProperty": "Id",

                    "itemPrefix": "BorrowerDocGroup",

                    "collection": "BorrowerDocGroupsCollection",

                    "onGetItemConfig": "getDocsControlGroupConfig"

                }

            }

//methods:

getDocsControlGroupConfig: function (itemConfig, item) {             

               

                var itemId = item.get("Id");

                var testItemGroupConfig = {

                    "className": "Terrasoft.ControlGroup",                    

                    "caption": {

                        "bindTo": "Caption"

                    },

                    "collapsed": true,

                    "id": "DocsGroup" + itemId,

                    "items": [{                        

                        "className": "Terrasoft.Grid",

                        "type": "listed",                        

                        "id": itemId,

                        "idProperty": "Id",

                        "itemPrefix": "Id",

                        "collection": {

                            "bindTo": "Collection"

                        },

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

//здесь мне хотелось бы написать "columnsConfig": { "bindTo: "...?????"}

                        "columnsConfig": [                            

                            {

                                cols: 1,

                                key: [

                                    {

                                        "name": {

                                            "bindTo": "MDocument"

                                        }

                                    } 

                                ]

                            }

                        ],

                        "captionsConfig": [

                            {

                                cols: 1,

                                name: "document caption"

                            }                            

                        ],

                        //"onGetItemConfig": {

                        //    "bindTo": "getDocItemViewConfig"

                        //},                                               

                        "dataItemIdPrefix": "document-item"                        

                    }]

                };               

                itemConfig.config = testItemGroupConfig;                

            },

   

Нравится

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

Ты создаешь внутри одной детали несколько гридов?

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



 

Ext.define("Terrasoft.controls.Название_твоего_грида", {

    alternateClassName: "Terrasoft.Название_твоего_грида",

    extend: "Terrasoft.ConfigurationGrid", // или Terrasoft.Grid

и переопределить методы 

/**
	 * Инициализирует начальное значение конфигурации колонок.
	 * @param {Object} gridConfig
	 * @return {Array}
	 */
	initColumnsConfig: function(gridConfig) {
		var type = gridConfig.type;
		var config = this[type + "Config"];
		var columnsConfig = (config ? config.columnsConfig : gridConfig.columnsConfig) || [];
		if (!gridConfig.columnsConfig) {
			gridConfig.columnsConfig = columnsConfig;
		}
		return columnsConfig;
	},

	/**
	 * Инициализирует начальное значение конфигурации заголовков.
	 * @param {Object} gridConfig
	 * @return {Array}
	 */
	initCaptionsConfig: function(gridConfig) {
		var type = gridConfig.type;
		var config = this[type + "Config"];
		var captionsConfig = (config ? config.captionsConfig : gridConfig.captionsConfig) || [];
		if (!gridConfig.captionsConfig) {
			gridConfig.captionsConfig = captionsConfig;
		}
		return captionsConfig;
	}

Если хочешь ещё и из детали получить конфигурацию, то встроенной реализации механизма сообщений нет. Придется в зависимостях прописать sandbox и инициализировать его в методе конструктора

constructor: function (config) {
    this.sandbox = new sandbox();
    this.sandbox.moduleName = "имя_модуля";

    this.sandbox.registerMessages({
        "имя_сообщения": {
            "direction": Terrasoft.MessageDirectionType.PUBLISH,
            "mode": Terrasoft.MessageMode.PTP
        }

    });

    this.callParent(arguments);
},

Как вариант, можно попробовать перехватить Profile в котором находятся конфиги на отображение в списочном и плиточном отображении (listedConfig и tiledConfig).

К примеру в методе initProfile после вызова this.callParent(arguments) взять this.get("Profile") и динамически изменить listedConfig и tiledConfig для изменения конфигуарации колонок грида.

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

Для примера вот как можно добавить колонку ответсственного в запрос детали с документами (DocumentDetailV2):

addProfileColumns: function(esq) {
  //берем колонки
  var profileColumns = this.getProfileColumns();
  //добавляем новую
  profileColumns.Owner = {
    aggregationType: undefined,
    caption: "Ответстсвенный",
    dataValueType: undefined,
    path: "Owner",
    subFilters: undefined,
    type: "text"
  };
  //а это взято из метода addProfileColumns из GridUtilitiesV2
  Terrasoft.each(profileColumns, function(column, columnName) {
    if (!esq.columns.contains(columnName)) {
      if (column.aggregationType) {
        this.addProfileAggregationColumn(esq, column, columnName);
      } else {
        esq.addColumn(columnName);
      }
    }
  }, this);
}

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

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

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