Задача следующая: при настройке прав доступа на группу статей в базе знаний, раздавать те же права на все подгруппы в ней (а так же все статьи им соответствующие).
Замещать модуль Rights или RightUtilities (и создать свой сервис, унаследовавшись от RightsHelper) не хочется, т.к. при его изменении в последующих обновлениях пришлось бы постоянно переписывать замещающий модуль.
Лучшим решением казались триггеры в БД на INSERT для таблицы [SysKnowledgeBaseFolderRight]. Я использовал два курсора (один вложен в другой) для перебора записанных строк, и подгрупп для каждой группы. Но если уровень подгрупп больше 1, триггер не отработает т.к. пытается по сути объявить курсор, который уже объявлен.
Да и каким образом с помощью триггера раздавать права на статьи в группах не имею представления.
Есть ли еще варианты, или все-таки придется замещать модуль Rights (RightUtilities)?

Нравится

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

Примерный(костыльный вариант):
1) расковырять схему Rights. В методе onSaveClick

RightUtilities.applyChanges({
	"recordRights": changedRights,
	"record": {
		entitySchemaName: this.get("entitySchemaName"),
		primaryColumnValue: this.get("primaryColumnValue")
	}
}, this.onChangesApplied, this);

т.е у нас есть список прав, название схемы с фильтрами в entitySchemaName, id фильтра в primaryColumnValue.
По идее, если entitySchemaName === "KnowledgeBaseFolder", то запускаем свою логику по изменению прав записей
2) Выбираем из KnowledgeBaseFolder вложенные папки, где ParentId = Id главной папки, получаем коллекцию, бежим по каждой записи
3) Для каждого элемента вставляем/удаляем запись в таблицу SysKnowledgeBaseFolderRight. Значения берем из переменной changedRights с п1.

Для записей еще жестче:
п1. такой же
2) Выбираем из KnowledgeBaseFolder фильтр по id, который мы знаем из предыдущего пункта, нужна колонка SearchData. Там лежит мусор) Весь вопрос как этот хлам преобразовать в сериализованый(или нет) фильтр.
3) Выбираем из KnowledgeBase все записи с фильтром из п2, получаем коллекцию, бежим по каждому элементу коллекции.
4) Для каждого элемента из базы знаний вставляем/удаляем запись в таблицу SysKnowledgeBaseRight. Значения берем из переменной changedRights с п1.

как-то так :smile:

upd. Только что проверил, в п2. берем entity по id, потом

var folderFilter = Terrasoft.deserialize(result.entity.values.SearchData);

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

Спасибо за ответ :smile:
В принципе я, не найдя другого решения, делаю примерно тоже самое. Заместил модуль RightUtilities, в котором меняю вызываемый сервис на свой в методе callServiceMethod, если вызывается метод "ApplyChanges".
Далее уже на сервере проверяю имя схемы, и если это KnowledgeBaseFolder - рекурсивно прохожусь по всем подпапкам раздавая права, а также выбираю фильтры у каждой, десериализуя их и раздавая права на статьи.
Старался максимально вынести функционал на сервер. Таким образом при обновлении версии/билда если изменится RightUtilities - придется добавить в него всего одну строку. А на сервере я создаю экземпляр класса RightsHelper и вызываю у него метод ApplyChanges, как это делается в базовом RightsService (что в принципе устойчиво к обновлениям).

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

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

Нравится

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

Здравствуйте, Мария!

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

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

Добрый день, необходимо изменить тип поиска с типа «Начинается с» на «Содержит». В системных настройках в настройке "Тип сравнения для строковых колонок" установили значение по умолчанию равное “1”, перезашли в црм, кеш очистили, но все равно тип поиска не изменился, все еще необходимо искать в таком формате: %продукт%. Подскажите пожалуйста, в чем может быть проблема?

Нравится

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

Здравствуйте, Мария!

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

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

Спасибо за быстрый ответ :smile:, а как тогда можно поменять тип поиска в окне справочника, чтобы не осуществлять поиск с % ?

:smile:

Нужно заместить схему LookupPageViewModuleGenerator. Метод pushSelectFilters отвечает за тип поиска. В коробочной версии тип поиска START_WITH.

В замещающей схеме Вам необходимо заменить тип поиска на CONTAIN.

Поиск "%запрос%" отрабатывает значительно медленнее, чем поиск "запрос%".

Спасибо! :smile:
Возник еще такой вопрос по этой теме:
когда вбиваем текст просто в поле, то без % не находит туры:

а если через всплывающее окно, то нормально срабатывает:

Можно ли как-то реализовать, что бы и в поле поиск работал без % ?

Для изменения типа сравнения с первого скриншота, вам необходимо изменить возвращаемое значение метода "getLookupComparisonType" в файле all-combined, сделать это можно если у вас сайт on-site самостоятельно, если же на серверах bpm'online то через службу поддержки.

.

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

Добрый день!
Пытаюсь выполнить post запрос из консольного приложения к методу из wcf сервиса. GET запросы проходят без проблем. Но с POST запросами возникли проблемы. Возвращается ошибка " Удаленный сервер возвратил ошибку: (401) Несанкционированный.". Авторизацию прохожу как в документации https://academy.terrasoft.ru/documents/technic-sdk/7-9/autentifikaciya-v.... Тестовый сервис:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
        public class UsrTestService
        {
            [OperationContract]
            [WebInvoke(Method = "POST",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json)]
                public string TestMethod()
                {
                        return "test";

                }
}

Пытаюсь обратится к методу TestMethod:
"http://myserver.com/0/rest/UsrTestService/TestMethod"
При этом, если вызывать метод из интерфейса bpm - все работает. Можете подсказать что могло пойти не так, возможно, я какие то настройки не выполнила?

Нравится

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

Добрый день, подскажите можно ли создавать в разделах подразделы? Примерно по такой схеме?:

!

Нравится

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

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

Отличное решение для Вашей бизнес-задачи это добавление деталей на страницу - https://academy.terrasoft.ru/documents/sales-enterprise/7-9/master-deta…
В результате получиться аналогичная картина.

Наглядные примеры:

- раздел «Контрагенты» – деталь «Контакты контрагента»;
- раздел «Счет» – деталь «Продукты»;
- раздел «Контакты» - деталь «Адреса».

Скорее, это все решается группами, так как разделение по странам - это лишь один из вариантов разделения заказов

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

"Maria H" написал:чтобы при выборе продукта в поле страна из раздела Продукты соответствующему продукту сразу подставлялась страна, ранее указанная в разделе Продукты.

Так бизнес правило фильтрации с включенным "autocomplete": true, же:

https://academy.terrasoft.ru/documents/technic-sdk/7-9/primer-primeneni…

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

Необходимо, чтобы в зависимости от выбранного продукта подставлялся регион, оба поля являются справочниками.
Screenshot
Сам же регион выставлен каждому продукту в таблице "Продукты".

rules: {
                "UsrRegion": {
                    "FiltrationRegionByProduct": {
                        "ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
                        "autocomplete": true,
                        "autoClean": true,
                        "baseAttributePatch": "Product",
                        "comparisonType": Terrasoft.ComparisonType.EQUAL,
                        "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                        "attribute": "UsrRegion"
                    }
                },

"Maria H" написал:Необходимо, чтобы в зависимости от выбранного продукта подставлялся регион, оба поля являются справочниками.

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

rules: {
"Product": {
"FiltrationRegionByProduct": {
"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
"autocomplete": true,
"autoClean": true,
"baseAttributePatch": "UsrRegion",
"comparisonType": Terrasoft.ComparisonType.EQUAL,
"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
"attribute": "UsrRegion"
}
},

спасибо, не помогло :sad:, может необходимо как-то конкретно в коде указать что фильтрация идет по полю UsrRegion из раздела продукты, в зависимости от выбранного продукта в данном разделе, как это можно сделать?

"Maria H" написал:спасибо, не помогло , может необходимо как-то конкретно в коде указать что фильтрация идет по полю UsrRegion из раздела продукты, в зависимости от выбранного продукта в данном разделе, как это можно сделать?

Нужно очень точно указать имена колонок, так как они указаны в объектах.
Проще будет написать вам в поддержку support@terrasoft.ru с указанием доступа к сайту, сотрудники поддержки уже все на месте поправят, а то предугадывать возможные названия колонок на форуме сложно.

Большое спасибо! :smile: Перепроверили еще раз наименования полей и с вашим вариантом сработало.

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

Добрый день!

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

Буду очень признателен Вашей помощи.

Нравится

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

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

Если через DCM, то нужно создать подпроцесс.

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

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

[quote="Демьяник Алексей"]
Благодарю за ответ.

"Демьяник Алексей" написал:

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

Алексей, добрый день!

У меня похожий вопрос. Из карточки контакта перехожу в пользовательскую активность и не получается унаследовать ФИО и пр. из карточки контакта.

Процесс запускаю по сигнальному элементу, в котором отслеживаю добавление записи с конкретными типом активности. Далее, по ID читаю Активность и читаю Контакт. Затем записываю ФИО из Контакта в нужное поле активности. И,... ничего не записывается. Прошу подсказать, что нужно изменить?
Заранее благодарен!

Сергей, здравствуйте!

Алгоритм решения:
А. Создать процесс, условно CreateActivity:
1. Добавить в процесс параметр с типом Уникальный идентификатор – условно ParamContactId.
2. Добавить данные в объект Активность. Заполнить интересующие поля, указать [Тип = Выставка], [Контакт – ФИО = ParamContactId].
3. Элемент [Открыть страницу редактирования], открыть страницу существующей активности, где Id = Пункт 2.Id созданной записи.

Б. Заместить страницу редактирования контакта:
1. Добавить пользовательское действие.
2. Добавить обработчик. Обработчик будет:
- запускать процесс CreateActivity
- в параметр процесса ParamContactId – передавать Id текущего контакта

Пример создания пользовательской кнопки/действия и обработчика (запуск процесса) есть на академии и community:
https://academy.terrasoft.ua/documents/technic-sdk/7-9/zapusk-processa-…
http://www.community.terrasoft.ru/forum/topic/10554
http://www.community.terrasoft.ru/forum/topic/14042

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

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

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

Вот код из академии:

define("OrderPageV2", [], function() {
return {
// Название схемы объекта страницы редактирования.
entitySchemaName: "Order",
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
// Свойство attributes модели представления.
attributes: {
// Название атрибута модели представления.
"UsrBalance": {
// Тип данных колонки модели представления.
dataValueType: Terrasoft.DataValueType.FLOAT,
// Массив конфигурационных объектов, определяющих зависимости колонки [UsrBalance].
dependencies: [
{
// Значение колонки [UsrBalance] зависит от значений колонок [Amount]
// и [PaymentAmount].
columns: ["Amount", "PaymentAmount"],
// Метод-обработчик, который вызывается при изменении значения одной из колонок [Amount]
// и [PaymentAmount].
methodName: "calculateBalance"
}
]
}
},
// Коллекция методов модели представления страницы редактирования.
methods: {
// Переопределение базового метода Terrasoft.BasePageV2.onEntityInitialized, который
// срабатывает после окончания инициализации схемы объекта страницы редактирования.
onEntityInitialized: function() {
// Вызывается родительская реализация метода.
this.callParent(arguments);
// Вызов метода-обработчика, который рассчитывает значение колонки [UsrBalance].
this.calculateBalance();
},
// Метод-обработчик, который рассчитывает значение колонки [UsrBalance].
calculateBalance: function() {
// Проверка, проинициализованы ли в момент открытия страницы редактирования
// колонки [Amount] и [PaymentAmount]. Если нет, то для них устанавливаются нулевые значения.
if (!this.get("Amount")) {
this.set("Amount", 0);
}
if (!this.get("PaymentAmount")) {
this.set("PaymentAmount", 0);
}
// Расчет разницы между значениями в колонках [Amount] и [PaymentAmount].
var result = this.get("Amount") - this.get("PaymentAmount");
// Результат расчета присваивается в качестве значения колонке [UsrBalance].
this.set("UsrBalance", result);
}
},
// Визуальное отображение поля [Остаток для оплаты] на странице редактирования.
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"parentName": "Header",
"propertyName": "items",
"name": "UsrBalance",
"values": {
"bindTo": "UsrBalance",
"layout": {"column": 12, "row": 2, "colSpan": 12}
}
}
]/**SCHEMA_DIFF*/
};
});

Нравится

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

Добрый день.

Для того что бы менять поле Состояние оплаты, Вам необходимо добавить свою логику в метод calculateBalance. На основании добавленной логики необходимо менять значение атрибута PaymentStatus.
Поскольку данный атрибут содержит справочное значение, передавать ему необходимо объект следующего вида: {value: "Id записи", displayValue: "Отображаемое значение"}.

Пример:

this.set("PaymentStatus", {value: "448d1338-d3a5-4fd4-9a6e-769403f89896", displayValue: "Оплачен полностью"});
this.set("PaymentStatus", {value: "309e5219-114d-4a6e-b5b0-fe33caeca4dd", displayValue: "Отменен"});

Спасибо, попробую.
П.С. Перед этим ID надо узнать, этот указан как пример, вообще там же будет параметр, который перед этим достану?

id статусов, Вы можете получить из таблицы OrderPaymentStatus или же посмотреть в справочнике.
Получить текущее значение статуса возможно следующим кодом:

var statusId = this.get("PaymentStatus").value

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

Добрый день!

Коллеги, подскажите, пожалуйста, какой наиболее корректный способ массово (в цикле) удалять записи в БД с помощью ESQ?

Вариант с foreach:

EntitySchema schemaDeleteEntity =userConnection.EntitySchemaManager.GetInstanceByName(EntityName);
EntitySchemaQuery esqDeleteEntity = new EntitySchemaQuery(schemaDeleteEntity);
esqDeleteEntity.AddAllSchemaColumns();
esqDeleteEntity.Filters.Add(esqDeleteEntity.CreateFilterWithParameters(FilterComparisonType.Equal, AccountIdField, AccountId));
EntityCollection entitiesDeleteEntity = esqDeleteEntity.GetEntityCollection(userConnection);
  foreach (Entity deleteentity in  entitiesDeleteEntity)
  {
      deleteentity.Delete();
  }

возвращает exception "Коллекция была изменена после создания экземпляра перечислителя."

Если заменить на простой for:

for(int i = entitiesDeleteEntity.Count-1;i>=0;i--)
{
        entitiesDeleteEntity[i].Delete();
}

Код отрабатывает корректно, но при нагрузке удаление периодически вызывает exception о незавршённых транзакциях вида:
Данный SqlTransaction завершен; его повторное использование невозможно.   в System.Data.SqlClient.SqlTransaction.ZombieCheck()
   в System.Data.SqlClient.SqlTransaction.Rollback()
   в Terrasoft.Core.DB.DBExecutor.RollbackTransaction()
   в Terrasoft.Core.Entities.Entity.ExecuteDelete(Delete delete, Object keyValue)
   в Terrasoft.Core.Entities.Entity.Delete(Object keyValue)
   в Terrasoft.Core.Entities.Entity.Delete()

Как всё-таки правильнее?

Спасибо!

Нравится

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

Добрый день!
Для массового удаления лучше не использовать EntitySchemaQuery, так как ESQ накладывает права на запрос. Лучше всего использовать либо класс Delete, или же использовать хранимую процедуру.
Единственный случай, когда нужно использовать ESQ - это если вам нужно запускать процессы, которые настроенны на сигнал "удаления записи", но и в этом случае лучше найти альтернативу по запуску доп логики после удаления

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

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

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

define("AccountSectionV2", ["ProcessModuleUtilities"], function(ProcessModuleUtilities)

Сделал так, теперь не загружается даже страница контрагента. (Кэш чистил и компилировал все)

Вот код:

define("AccountSectionV2", [ProcessModuleUtilities], function(ProcessModuleUtilities) {
return {
// Название схемы объекта страницы редактирования.
entitySchemaName: "Account",
methods: {
runProcess: function() {
var activeRowId = this.get("Id");
var args = {
sysProcessName: "UsrMyProcess",
parameters: {
OppID: activeRowId
}
};
ProcessModuleUtilities.executeProcess(args.sysProcessName, args.parameters, this);
}
},
//Настройка визуализации кнопки на странице редактирования.
diff: [
// Метаданные для добавления на страницу пользовательской кнопки.
{
// Указывает на то, что выполняется операция добавления элемента на страницу.
"operation": "insert",
// Мета-имя родительского элемента управления, в который добавляется кнопка.
"parentName": "CombinedModeActionButtonsCardLeftContainer",
// Указывает на то, что кнопка добавляется в коллекцию элементов управления
// родительского элемента (мета-имя которого указано в parentName).
"propertyName": "items",
// Мета-имя добавляемой кнопки.
"name": "runProcessButton",
// Дополнительные свойства элемента.
"values": {
// Тип добавляемого элемента — кнопка.
"itemType": Terrasoft.ViewItemType.BUTTON,
// Привязка заголовка кнопки к локализуемой строке схемы.
"caption": "Запустить БП",
// Привязка метода-обработчика нажатия кнопки.
"click": {bindTo: "runProcess"},
// Стиль отображения кнопки.
"style": Terrasoft.controls.ButtonEnums.style.GREEN,
"enabled": true
}
}
]
};
});

Нравится

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

"Калушка Д." написал:define("AccountSectionV2", [ProcessModuleUtilities], function(ProcessModuleUtilities)

Во-первых: ProcessModuleUtilities должен быть в кавычках в []
Во-вторых: executeProcess принимает лишь 1 аргумент

executeProcess: function(args) {...}

либо можно использовать метод runProcess из того же ProcessModuleUtilities

runProcess: function(processName, processParameters, callback, scope) {...}

Ну и Id активной записи берется через this.get("ActiveRow")

Данила, большое спасибо!

Кому интересно, вот рабочий код :

define("AccountSectionV2", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) {
return {
// Название схемы объекта страницы редактирования.
entitySchemaName: "Account",
methods: {
runProcess: function() {
var activeRowId = this.get("ActiveRow");
var args = {
sysProcessName: "UsrMyProcess",
parameters: {
OppID: activeRowId
}
};
ProcessModuleUtilities.executeProcess(args);
}
},
//Настройка визуализации кнопки на странице редактирования.
diff: [
// Метаданные для добавления на страницу пользовательской кнопки.
{
// Указывает на то, что выполняется операция добавления элемента на страницу.
"operation": "insert",
// Мета-имя родительского элемента управления, в который добавляется кнопка.
"parentName": "CombinedModeActionButtonsCardLeftContainer",
// Указывает на то, что кнопка добавляется в коллекцию элементов управления
// родительского элемента (мета-имя которого указано в parentName).
"propertyName": "items",
// Мета-имя добавляемой кнопки.
"name": "runProcessButton",
// Дополнительные свойства элемента.
"values": {
// Тип добавляемого элемента — кнопка.
"itemType": Terrasoft.ViewItemType.BUTTON,
// Привязка заголовка кнопки к локализуемой строке схемы.
"caption": "Запустить БП",
// Привязка метода-обработчика нажатия кнопки.
"click": {bindTo: "runProcess"},
// Стиль отображения кнопки.
"style": Terrasoft.controls.ButtonEnums.style.GREEN,
"enabled": true
}
}
]
};
});

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

define("AccountPageV2", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) {
return {
// Название схемы объекта страницы редактирования.
entitySchemaName: "Account",
methods: {
runProcess: function() {
var activeRowId = this.get("ActiveRow");
var args = {
sysProcessName: "UsrMyProcess",
parameters: {
OppID: activeRowId
}
};
ProcessModuleUtilities.executeProcess(args);
}
},
//Настройка визуализации кнопки на странице редактирования.
diff: [
// Метаданные для добавления на страницу пользовательской кнопки.
{
// Указывает на то, что выполняется операция добавления элемента на страницу.
"operation": "insert",
// Мета-имя родительского элемента управления, в который добавляется кнопка.
"parentName": "LeftContainer",
// Указывает на то, что кнопка добавляется в коллекцию элементов управления
// родительского элемента (мета-имя которого указано в parentName).
"propertyName": "items",
// Мета-имя добавляемой кнопки.
// родительского элемента (мета-имя которого указано в parentName).
"name": "runProcessButton",
// Дополнительные свойства элемента.
"values": {
// Тип добавляемого элемента — кнопка.
"itemType": Terrasoft.ViewItemType.BUTTON,
// Привязка заголовка кнопки к локализуемой строке схемы.
"caption": "Запустить БП",
// Привязка метода-обработчика нажатия кнопки.
"click": {bindTo: "runProcess"},
// Стиль отображения кнопки.
"style": Terrasoft.controls.ButtonEnums.style.GREEN
}
}
]
};
});

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

define("AccountPageV2", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) {
return {
// Название схемы объекта страницы редактирования.
entitySchemaName: "Account",
methods: {
runProcess: function() {
var activeRowId = this.get("ActiveRow");
var args = {
sysProcessName: "UsrMyProcess",
parameters: {
OppID: activeRowId
}
};
ProcessModuleUtilities.executeProcess(args);
}
},
//Настройка визуализации кнопки на странице редактирования.
diff: [
// Метаданные для добавления на страницу пользовательской кнопки.
{
// Указывает на то, что выполняется операция добавления элемента на страницу.
"operation": "insert",
// Мета-имя родительского элемента управления, в который добавляется кнопка.
"parentName": "LeftContainer",
// Указывает на то, что кнопка добавляется в коллекцию элементов управления
// родительского элемента (мета-имя которого указано в parentName).
"propertyName": "items",
// Мета-имя добавляемой кнопки.
// родительского элемента (мета-имя которого указано в parentName).
"name": "runProcessButton",
// Дополнительные свойства элемента.
"values": {
// Тип добавляемого элемента — кнопка.
"itemType": Terrasoft.ViewItemType.BUTTON,
// Привязка заголовка кнопки к локализуемой строке схемы.
"caption": "Запустить БП",
// Привязка метода-обработчика нажатия кнопки.
"click": {bindTo: "runProcess"},
// Стиль отображения кнопки.
"style": Terrasoft.controls.ButtonEnums.style.GREEN
}
}
]
};
});

"Калушка Д." написал:но что-то она никак не появляется

Все вроде как правильно. Проверьте в адресной строке, находитесь ли вы в AccountPage.
+ На схеме редактирования страницы Id берется через this.get("Id");

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

//Вот так вот

"Варфоломеев Данила" написал:И ради все богов, используйте для кода теги (кнопочка js)

Так, вроде, стоят практически повсюду )
В AccountSectionV2 кнопка есть, а тут AccountPageV2 не появляется

define("AccountPageV2", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) {
return {
// Название схемы объекта страницы редактирования.
entitySchemaName: "Account",

diff: [
// Метаданные для добавления на страницу пользовательской кнопки.
{
// Указывает на то, что выполняется операция добавления элемента на страницу.
"operation": "insert",
// Мета-имя родительского элемента управления, в который добавляется кнопка.
"parentName": "LeftContainer",
// Указывает на то, что кнопка добавляется в коллекцию элементов управления
// родительского элемента (мета-имя которого указано в parentName).
"propertyName": "items",
// Мета-имя добавляемой кнопки.
// родительского элемента (мета-имя которого указано в parentName).
"name": "runProcessButton",
// Дополнительные свойства элемента.
"values": {
// Тип добавляемого элемента — кнопка.
"itemType": Terrasoft.ViewItemType.BUTTON,
// Привязка заголовка кнопки к локализуемой строке схемы.
"caption": {bindTo: "Resources.Strings.runProcessButtonCaption"},
// Привязка метода-обработчика нажатия кнопки.
"click": {bindTo: "runProcess"},
"visible": true,
"enabled": true,
// Стиль отображения кнопки.
"style": Terrasoft.controls.ButtonEnums.style.GREEN,
"layout": {
"column": 1,
"row": 6,
"colSpan": 1
}
}
}
]
};
});

"Калушка Д." написал:AccountPageV2 не появляется

триждыдолбаный layout во всем виноват.... если его не указать даже debugger в onEntityInitialized не отрабатывает. 11/8 would add button again, как говорится.

{
	"operation": "insert",
	"parentName": "LeftContainer",
	"propertyName": "items",
	"name": "customBtn",
	"values": {
		"itemType": Terrasoft.ViewItemType.BUTTON,
		"caption": "RunProcess",
		"click": {"bindTo": "runProcess"},
		"visible": true,
		"layout": {
            "column": 1,
            "row": 7,
            "colSpan": 1
        }
	}
}

Сорян, но нет *(
По прежнему не видно.

Вот эта демка -https://005176-crm-bundle.bpmonline.com
Supervisor
Если будет желание узнать в чем причина. Только надо открывать не из раздела (там все ок), а по ссылке, например из контакта.

"Калушка Д." написал:По прежнему не видно.

Сегодня с утра еще раз перепроверил, вот такой код сработал локально на последней демке:

define("AccountPageV2", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) {
	return {
	// Название схемы объекта страницы редактирования.
	entitySchemaName: "Account",
	methods: {
		runProcess: function() {
			alert("Работай, чертова кнопка >:-(");
		}
	},
	//Настройка визуализации кнопки на странице редактирования.
	diff: [
		{
			"operation": "insert",
			"parentName": "LeftContainer",
			"propertyName": "items",
			"name": "customProcessButton",
			"values": {
				"itemType": Terrasoft.ViewItemType.BUTTON,
				"caption": "RunProcess",
				"click": {"bindTo": "runProcess"},
				"visible": true,
				"style": "red"
			}
		},
		{
			"operation": "insert",
			"parentName": "LeftContainer",
			"propertyName": "items",
			"name": "customProcessButtonSecondary",
			"values": {
				"itemType": Terrasoft.ViewItemType.BUTTON,
				"caption": "KNOPKA #2",
				"click": {"bindTo": "runProcess"},
				"visible": true,
				"style": "blue"
			}
		}
	]};
});

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

Ребята, большое спасибо за помощь!!!

В итоге, вот рабочий код :

define("AccountPageV2", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) {
return {
entitySchemaName: "Account",
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
diff: /**SCHEMA_DIFF*/[
{
// Указывает на то, что выполняется операция добавления элемента на страницу.
"operation": "insert",
// Мета-имя родительского элемента управления, в который добавляется кнопка.
"parentName": "LeftContainer",
// Указывает на то, что кнопка добавляется в коллекцию элементов управления
// родительского элемента (мета-имя которого указано в parentName).
"propertyName": "items",
// Мета-имя добавляемой кнопки.
// родительского элемента (мета-имя которого указано в parentName).
"name": "runProcessButton",
// Дополнительные свойства элемента.
"values": {
// Тип добавляемого элемента — кнопка.
"itemType": Terrasoft.ViewItemType.BUTTON,
// Привязка заголовка кнопки к локализуемой строке схемы.
"caption": "Запустить БП",
// Привязка метода-обработчика нажатия кнопки.
"click": {bindTo: "runProcess"},
// Стиль отображения кнопки.
"style": Terrasoft.controls.ButtonEnums.style.GREEN
}
}
]/**SCHEMA_DIFF*/,
methods: {
runProcess: function() {
var activeRowId = this.get("Id");
var args = {
sysProcessName: "UsrMyProcess",
parameters: {
OppID: activeRowId
}
};
ProcessModuleUtilities.executeProcess(args);
}
},
rules: {}
};
});

Калушка Д. пишет:

Ребята, большое спасибо за помощь!!!

В итоге, вот рабочий код :

define("AccountPageV2", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) {

return {

entitySchemaName: "Account",

details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,

diff: /**SCHEMA_DIFF*/[

{

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

"operation": "insert",

// Мета-имя родительского элемента управления, в который добавляется кнопка.

"parentName": "LeftContainer",

// Указывает на то, что кнопка добавляется в коллекцию элементов управления

// родительского элемента (мета-имя которого указано в parentName).

"propertyName": "items",

// Мета-имя добавляемой кнопки.

// родительского элемента (мета-имя которого указано в parentName).

"name": "runProcessButton",

// Дополнительные свойства элемента.

"values": {

// Тип добавляемого элемента — кнопка.

"itemType": Terrasoft.ViewItemType.BUTTON,

// Привязка заголовка кнопки к локализуемой строке схемы.

"caption": "Запустить БП",

// Привязка метода-обработчика нажатия кнопки.

"click": {bindTo: "runProcess"},

// Стиль отображения кнопки.

"style": Terrasoft.controls.ButtonEnums.style.GREEN

}

}

]/**SCHEMA_DIFF*/,

methods: {

runProcess: function() {

var activeRowId = this.get("Id");

var args = {

sysProcessName: "UsrMyProcess",

parameters: {

OppID: activeRowId

}

};

ProcessModuleUtilities.executeProcess(args);

}

},

rules: {}

};

});

Спасибо вот это вот работает!!!!

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

Я бы хотел сделать такую кастомизацию. Мне нужны два параметра, используемые в объектах недвижимости и листингах, по которым происходит подбор заявок. Эти параметры справочные и связаны друг с другом.
По аналогии со справочником Источник лида, в котором 3 поля. Источник, канал и описание. При этом в поле Канал – это значения из справочника Канал.

Хочу сделать справочник Районы с такими полями:
Название поля Описание
Город Это поле ссылается на справочник Город
Район Это поле, которое наполняется значением районов для конкретного города

Второй справочник такой:
Название поля Описание
Район Это поле ссылается на справочник Районы
Массив Это поле, которое наполняется значением массивов (микрорайонами) для
конкретного района
Границы В этом поле хранятся координаты точек (широта, долгота) полигона,
задающего границы массива

Когда я выбираю значение в поле Город при создании объекта – поле Район фильтруется по колонке Город (тот, что указан в поле Город объекта)
Когда я выбираю значения поля Массив – его значения тоже фильтруются по полю Район.

Подскажите, пожалуйста, какими инструментами можно это реализовать?

Нравится

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

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

Данная задача может быть реализована бизнес-правилами на странице.
Подробнее о бизнес-правилах можно прочитать по ссылке:
https://academy.terrasoft.ru/documents/technic-sdk/7-9/primer-primeneni…

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