Доброго времени суток всем.

Версия 7.8 sales.

Задача следующая: на странице Счёта в меню "Действия" нужно добавить дополнительный пункт "Создание заказа на основе счёта", вызывающий бизнес-процесс. В целом всё по этому кейсу: https://academy.terrasoft.ru/documents/technic-sdk/7-8/dobavlenie-deystv...

Но есть одна особенность: на странице счёта есть поле "Тип счёта" и пункт должен быть доступен только при выборе определённого типа.

Сейчас в схеме InvoicePage добавлен следующий код:

getActions: function() {
                                        var actionMenuItems = this.callParent(arguments);
                                        actionMenuItems.addItem(this.getButtonMenuItem({
                             Type: "Terrasoft.MenuSeparator",
                             Caption: ""
                        }));
                        actionMenuItems.addItem(this.getButtonMenuItem({
                              "Caption": {bindTo: "Resources.Strings.CreateOrderByInvoiceCaption"},//Название пункта в Localizablestrings
                               "Tag": "CreateOrderByInvoice",//Метод
                               "Enabled": {"bindTo": "canEntityBeOperated"},
                               "Visible": {"bindTo": "FormContractVisible"}
                        }));
                                        return actionMenuItems;
                                },
                                FormContractVisible: function(){
                                        if (this.get("UsrAccountType")){
                                                var InvType = this.get("UsrAccountType").value;
                                               
                                                if (InvType == "0266a676-9801-477d-aefd-81ae4dd978bf"){
                                return true;
                            } else {
                                return false;
                            }
                                        } else {
                                                return false;
                                        }
                                },

Дополнительно функция FormContractVisible вызывается при изменении значения UsrAccountType.

А в схеме InvoiceSection - такой:

define("InvoiceSectionV2", ["ProcessModuleUtilities","BusinessRuleModule", "ConfigurationConstants","jQuery"], function(ProcessModuleUtilities,BusinessRuleModule, ConfigurationConstants) {
        return {
                entitySchemaName: "Invoice",
                details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
                methods: {
                        FormContractVisible: function(activeRowId) {
                activeRowId = this.get("ActiveRow");
                // Получение коллекции данных списочного представления реестра раздела [Заказы].
                var gridData = this.get("GridData");
                // Получение модели выбранного заказа по заданому значению первичной колонки.
                var selectedInvoice = gridData.get(activeRowId);
                // Получение свойства модели - статуса выбранного заказа.
                var selectedInvoiceType = selectedInvoice.get("UsrAccountType");
                // Значение статуса выбранного заказа сравнивается со значением типа "Исполнение", и в
                // зависимости от результата сравнения метод возвращает true или false.
                if (selectedInvoiceType){
                                        if (selectedInvoiceType.value == "0266a676-9801-477d-aefd-81ae4dd978bf"){
                        return true;
                    } else {
                        return false;
                    }
                                } else {
                                        return false;
                                }
            }
                }
        };
});

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

Но если мы открываем счёт в режиме с боковым реестром (из страницы списка счетов), то видимость определяется один раз в зависимости от выставленного типа, а изменение не влияет на этот параметр.

Возможно ли сделать отслеживание изменения во втором случае?

Нравится

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

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

"Роман Симута" написал:

Можно в схему раздела добавить атрибут - виртуальную колонку булевого типа. Метод FormContractVisible будет возвращать значение этого атрибута.

Первый раз атрибут инициализировать при полной загрузке грида и выборе активной записи.

Затем значение атрибута менять при изменении поля.


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

Заранее благодарю.

Недавно обновил примеры в документации по разработке.
Наиболее подходящий пример - здесь
https://academy.terrasoft.ru/documents/technic-sdk/7-9/kak-dobavit-knop…
В примере используется атрибут, который связан со свойством доступности кнопки. Вам надо поменять привязку на видимость. Ну и выбросить лишнее.

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

Здравствуйте!
По базовой логике в детали «Контакты контрагента» отображаются только те контакты у которых стоит признаками «Основное» и «Текущее». Проблема возникает, когда один человек является руководителем нескольких компаний. У него в карьере указано, что она работает в нескольких компаниях, а вот в деталь «Контакты контрагента» эта информация уже не попадает. Где можно исправить логику системы, чтобы она выводила в делать «Контакты контрагента» все записи касающиеся этого предприятия с детали Карьера? Реализация новой деталью не очень подходит. Ведь нам нужно выбрать контакт при телефоном звонке (или когда мы вносим новые записи в Активности) с привязкой к этому контрагенту.

Нравится

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

Мы исправляли Rules для каждой страницы, где это нужно использовать (Активности, Продажи, Инциденты и т.п.)

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

Как сказал Владимир, действительно необходимо переопределить бизнес-правила на странице редактирования. Пример переопределения бизнес-правила для страницы раздела "Активности":

define("ActivityPageV2", ["BusinessRuleModule"],
   function(BusinessRuleModule) {
      return {
         entitySchemaName: "Activity",
         mixins: {},
         messages: {},
         attributes: {},
         details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
         methods: {},
         diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
         rules: {
            "Contact": {
               "FiltrationContactByAccount": {
                  "ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
                  "autocomplete": true,
                  "autoClean": true,
                  "baseAttributePatch": "[ContactCareer:Contact].Account",
                  "comparisonType": Terrasoft.ComparisonType.EQUAL,
                  "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                  "attribute": "Account"
               }
            }
         }
      };
});

Спасибо за оперативный ответ.
Проблема заключается в том, что этот сотрудник появляется только в одной компании в детали «Контакты контрагента». Если менять параметры «Основное» и «Текущее», то они исчезает из первой компании и появляется во второй. Соответственно получается что в карьере у него 10 записей, а в «Контакты контрагента» он отображается только в одной компании. Возможно нужно поменять правило по которому система отображает в «Контакты контрагента» только тех у которых есть оба параметра: «Основное» и «Текущее»?

Виталий, здравствуйте!

Для решения нужно создать деталь на основании объекта "Карьера контакта". В логике детали нужно установить доп. фильтрацию - отображать только те записи, у которых признак "Текущее" - true.

Созданную деталь необходимо добавить в раздел "Контрагенты", связав деталь с разделом следующим образом:
Контрагент.Id = Карьера контакта.Контрагент.

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

Коллеги, доброго времени суток! Подскажите пожалуйста ответ на данный вопрос.
Какую из этих схем предпочтительней использовать в качестве родителя для схемы карточки раздела? BasePageV2 или BaseModulePageV2?
Все время без проблем использовал в качестве родителя BasePageV2. Но недавно заметил что мастер при создании схемы карточки указывает родителя - BaseModulePageV2, плюс к этому в ней реализовано несколько полезных методов и миксинов...единственное что раньше меня сбивало с толку это заголовок данной схемы: "Страница активности V2".:exclaim:
И все таки, какую схему рекомендуется использовать? Спасибо!

Нравится

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

Добрый день, Влад!

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

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

Спасибо!

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

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

Нравится

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

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

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

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

Можно ли в Активностях менять цвет строки записи в зависимости от типа «Состояния задачи»?

Нравится

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

Добрый день!

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

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

https://community.terrasoft.ru/forum/topic/13096

Нравится

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

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

Описанное поведение может возникать, если некорректно настроен пул приложения в IIS:
- неверно указан путь к папке
- несколько сайтов исопльзуют один и тот же пул
- некорректная аунтификация

спасибо за ответ!

все пункты внимательно перепроверила. К сожалению, не работает таймер.

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

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

Добрый день, Светлана.

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

таймер никогда не работает и не работал. это нерабочая функция и это будет всегда

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

Добрый день!

А по каким правилам bpm'online 7.9 может или не может найти данные о компании в публичном доступе?

enrich data

Нравится

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

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

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

"Новак Руслан" написал:берутся с внешних источников

Просто интересно, какие именно это источники.

Говорят, Clearbit.

А свои локальные можно подключать?

В данный момент такой возможности нет.

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

Здравствуйте.
Использую версию системы 5.4.1.1034

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

Я так понимаю, что логику нужно накладывать на событие DataSourceActiveRowChanged.
А дальше что делать?
Пробовала удалять меню кодом, потом подпихивать новые пункты и скриптом и просто хиденом:

var button = Page.Print;
var menu = button.Menu;
menu.RemoveAll();
               
var esquery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, Page.DataSource.Schema.Name);
esquery.AddAllSchemaColumns();
var entity = esquery.GetEntity(UserConnection, SelectedNodePrimaryColumnValue);

if(entity == null){
        //button.Hidden = false;
        return true;
}

Guid DocumentId = entity.GetTypedColumnValueGuid>("Id");

Guid documentCategoryId = entity.GetTypedColumnValueGuid>("CategoryId");
Guid DocumentCategory_SPokupatelem = (Guid)Core.Configuration.SysSettings.GetValue(UserConnection, "DocumentCategory_SPokupatelem");


if(documentCategoryId == DocumentCategory_SPokupatelem) {
string script = string.Empty;
var menuItem1 = Page.MenuItem1;
var menuItem2 = Page.MenuItem2;
menu.Add(menuItem1);
menu.Add(menuItem2);   
                script = string.Format("window.{0} = {1};\n", menuItem1.ClientID, menuItem1.GenerateControlScript(true, null));
                script += string.Format("{0}.getMenu().addItem(window.{1});\n", button.ClientID, menuItem1.ClientID);
                //script += string.Format("{0}.getMenu().addSeparator();\n", button.ClientID);
       
                                script = string.Format("window.{0} = {1};\n", menuItem2.ClientID, menuItem2.GenerateControlScript(true, null));
                                script += string.Format("{0}.getMenu().addItem(window.{1});\n", button.ClientID, menuItem2.ClientID);
Page.AddScript(script);
                Page.MenuItem1.Hidden = false;
                Page.MenuItem2.Hidden = false;
                Page.MenuItem3.Hidden = false;
                Page.MenuItem4.Hidden = false;
                Page.MenuItem5.Hidden = false;
                Page.MenuItem6.Hidden = false;
                Page.MenuItem7.Hidden = false;
}

Нравится

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

Антонина, а если заранее добавить все возможные пункты меню, а потом лишние скрывать при помощи свойства «Hidden»?

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

var esquery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, Page.DataSource.Schema.Name);
esquery.AddAllSchemaColumns();
var entity = esquery.GetEntity(UserConnection, SelectedNodePrimaryColumnValue);
 
if(entity == null){
	Page.Print.Hidden = false;
	return true;
}
 
Guid DocumentId = entity.GetTypedColumnValue<Guid>("Id");
 
Guid documentCategoryId = entity.GetTypedColumnValue<Guid>("CategoryId");
Guid DocumentCategory_SPokupatelem = (Guid)Core.Configuration.SysSettings.GetValue(UserConnection, "DocumentCategory_SPokupatelem");
 
 
if(documentCategoryId == DocumentCategory_SPokupatelem) {
		Page.MenuItem1.Hidden = true;
		Page.MenuItem2.Hidden = true;
		Page.MenuItem3.Hidden = true;
		Page.MenuItem4.Hidden = true;
		Page.MenuItem5.Hidden = true;
		Page.MenuItem6.Hidden = true;
		Page.MenuItem7.Hidden = true;
}	
else{
		Page.NewItem.Hidden = true;
		Page.New2Item.Hidden = true;
}

А если попробовать скрывать не через свойство «.Hidden», а методом «.SetVisible(false)»?

Александр, добрый день.
И метод «.Hidden» и метод «.SetVisible(false)» в данном случае работают одинаково, т.е. скрывают/отображают пункты меню при необходимости. Но делают они это при загрузке страницы реестра.
Т.е. когда я открываю раздел документооборот, загружается страница реестра и отображает тот список меню кнопки, в соответствии с первой строкой реестра, т.к. она выделена. Затем же при переходе на другие строки реестра, меню кнопки не обновляется.

Получается тут 2 варианта:
- либо я использую не тот сигнал. А использую я DataSourceActiveRowChanged, вроде как все правильно.
- либо меню кнопки не перестраивается при смене активной позиции в реестре. Значит вопрос как это делать?
Или я не правильно мыслю?

Антонина, ваше первое предположение можно проверить, установив отладчик в скрипте-обработчике события. Если при смене строки срабатывает — сигнал тот.

По второму, посмотрел в кодах всех конфигураций, которые были под рукой, и нигде сходу не нашёл такого примера работы с пунктами меню. Возможно, действительно есть какие-то ограничения. Кроме двух ранее использованных способов, можно попробовать скрывать ещё в клиентском скрипте по ClientId, вызывая там «.setVisible(false)» (с маленькой «s»).

Если и это не даст результатов, придётся использовать другие подходы в интерфейсе, вроде отдельного диалогового окна со списком пунктов или заглушек при попытке запустить неподходящий пункт меню. Кстати, если менять не видимость, а доступность пунктов, не реагирует так же само?

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

Здравствуйте, как можно скрыть не активных пользователей из списка ответственных, к примеру когда ставишь задачу эти пользователи не отображались в списке? bpmonline 7.8.0

Нравится

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

Здравствуйте, Дмитрий!

За фильтрацию ответственного отвечает метод OwnerFilter:

"Owner": {
	dataValueType: Terrasoft.DataValueType.LOOKUP,
	lookupListConfig: {filter: BaseFiltersGenerateModule.OwnerFilter}
},

Данный метод можно найти в схеме BaseFiltersGenerateModule. Вам необходимо создать свой метод на странице редактирования раздела "Активности" ActivityPageV2 и в атрибутах страницы сослаться на созданный вами метод.

Альтернативный вариант решения - переопредлить метод OwnerFilter, заместив схему BaseFiltersGenerateModule, однако не рекомендую этого делать, поскольку модули не поддерживают наследование.

"Новак Руслан" написал:Вам необходимо создать свой метод на странице редактирования раздела "Активности" ActivityPageV2

А если необходимо изменить везде, где есть Owner?

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

Но так делать не рекомендуется поскольку модули не поддерживают наследование.

"Новак Руслан" написал:

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

Но так делать не рекомендуется поскольку модули не поддерживают наследование.


Спасибо Руслан, сделал через атрибуты

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

Добрый день! При обновлении с версии 7.8.0.3374 до 7.8.1.1035 возникает ошибка. Вот лог:

Error: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
at System.Reflection.RuntimeModule.GetTypes()
at System.Reflection.Assembly.GetTypes()
at Terrasoft.Core.SchemaManagerItem`1.get_TypeName()
at Terrasoft.Core.SchemaManager`1.AddCoreSchema(Guid uid, String name, Guid parenSchemaUId, Assembly assembly, Guid[] referenceSchemaUIds)
at Terrasoft.Core.SchemaManager`1.AddCoreSchema(Guid uid, String name, Guid parentSchemaUId, Guid[] referenceSchemaUIds)
at Terrasoft.Core.Entities.SystemEntitySchemaManager.InitializeItems()
at Terrasoft.Core.Entities.EntitySchemaManager.Initialize(SchemaManagerProvider provider, SchemaManagerProviderConfigurationElement configuration)
at Terrasoft.Core.SchemaManagerProvider.InitializeSystemSchemaManager(String systemSchemaManagerName)
at Terrasoft.Core.SchemaManagerProvider.InitializeSchemaManager(String managerName)
at Terrasoft.Core.SchemaManagerProvider.GetManager(String managerName)
at Terrasoft.Core.UserConnection.get_SystemEntitySchemaManager()
at Terrasoft.Core.SystemUserConnection.InitializeCurrentUser(String userName, TimeZoneInfo timeZone, String clientIP, String agent, Boolean logSessionStart)
at Terrasoft.Core.UserConnection.Login(String userName, TimeZoneInfo timeZone, Boolean logSessionStart)
at Terrasoft.Core.AppConnection.Initialize(ConfigurationSectionGroup appConfigurationSectionGroup)
at Terrasoft.Tools.WorkspaceConsole.WorkspaceConsoleApplication.Initialize(ConfigurationSectionGroup appConfigurationSectionGroup)
at Terrasoft.Tools.Common.BaseConsoleApplication`2.Run(String[] args)

Utility finished working.

=== 14:26:25.4607 (UTC) ===

Нравится

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

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

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

Для исправления в каталог с исполняемым файлом(Terrasoft.Tools.WorkspaceConsole.exe) необходимо скопировать:
- все содержимое каталога ..\Terrasoft.WebApp\bin\ (именно содержимое, а не сам каталог)
- все содержимое каталога ..\Terrasoft.WebApp\DesktopBin\WorkspaceConsole\x64\

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