Всем привет!

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

Нравится

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

Да, можно бизнес-процессом, там есть специальный элемент изменения прав. Процесс будет отрабатывать на сервере при создании или изменении через веб-интерфейс, либо при синхронизации новой или изменённой записи с мобильного. Если же пользователь создал запись и ещё не синхронизировал, то она и так его и права на деталь тоже есть. 

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

Для оффлайн-режима это не актуально.

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

Установили BPM версии 7.12. БД Oracle. Настроили согласно инструкции. При входе под Supervisor возникает ошибка.

OS:Windows Server 2012 R2

IIS 8.5

Ошибка вовложенной файле.

Вчера был предоставлен ответ ниже

"Адасюк Валерий Викторович

11 июля 2018 12:23

В адресной строке после адреса сайта допишите 0/dev (например, если сайт localhost:82, то ссылка будет следующая localhost:82/0/dev). Это прямая ссылка в конфигурацию системы. На этой страницы в блоке действий выберите "компилировать все". После завершения компиляции очистите Redis и можете снова пробовать авторизоваться на сайте."

Попробовали, но ошибка также осталась.

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

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

 

Прикрепленные файлы

Нравится

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

А где вложенный файл ? невижу !

Асылан, 

Похоже что проблема с web-socket'ами.

Тут инструкция, проверьте настройки: https://academy.terrasoft.ru/documents/studio/7-12/nastroyka-vebsoketov…

 

Tsopa,

Если посмотреть инструкцию по настройке Web.config все соответствует по указанному настройки которую вы указали. Но при проверке все ли нормально настроен система, проверил через javascript команду Terrasoft.ServerChannel.ping() , результат выдал ошибку. Ниже скриншот.  

Этот же дистрибутив, развернутый локально на ноутбуке на Windows 7 работает нормально. Возможно проблема в каких-то компонентах Windows Server 2012(хотя перепроверили раза три) или в IIS.

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

Для анализа вопроса направьте, пожалуйста, в техподдержку полные логи приложения, файлы ConnectionStrings, оба web.config'а, скриншоты установленных компонентов, настройки сайта в IIS и версии .NET Framework, Redis и Visual C++.

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

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

Установили BPM версии 7.12. БД Oracle. Настроили согласно инструкции. При входе под Supervisor возникает ошибка.

текст в файле во вложение

OS:Windows Server 2012 R2

IIS 8.5

Текст ошибки :

Date: 7/11/2018 1:44:25 AM

Date (UTC): 7/11/2018 8:44:25 AM

Exception Message: Object reference not set to an instance of an object.

Exception Type: System.NullReferenceException

Exception Source: Terrasoft.Messaging.Common

Exception Stack Trace:

   at Terrasoft.Messaging.Common.ClientChannelHelper.GetConnectionParamsInitScript(Uri appUrl)

   at Terrasoft.WebApp.Nui.ViewModule.SetupWebSocketConnectionParams()

   at Terrasoft.WebApp.Nui.ViewModule.Page_Load(Object sender, EventArgs e)

   at System.Web.UI.Control.OnLoad(EventArgs e)

   at System.Web.UI.Control.LoadRecursive()

   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

SessionID: teyxvagwz43zhbinbjhx4c0u

Request URL: /0/Nui/ViewModule.aspx

Request Path: /0/Nui/ViewModule.aspx

Request UrlReferrer: http://localhost/

Request Type: GET

User Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

User Host Address: ::1

User: Supervisor

Is Authenticated: True

Authentication Type: Forms

Is Secure Connection: False

 

 

Нравится

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

В адресной строке после адреса сайта допишите 0/dev (например, если сайт localhost:82, то ссылка будет следующая localhost:82/0/dev). Это прямая ссылка в конфигурацию системы. На этой страницы в блоке действий выберите "компилировать все". После завершения компиляции очистите Redis и можете снова пробовать авторизоваться на сайте.

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

Добрый день Комрады.

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

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

https://academy.terrasoft.ru/documents/technic-sdk/7-12/kak-sozdavat-po…

В Бизнес процессе происходит следующее, стоит событие на изменение стадии Продажи.

Потом идет Скрипт-таск. Интерпретируемый.

Проблема в том что при вызове 

var remindingConfig = new RemindingConfig(campaign);

Ругается на ошибку 

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
   в Terrasoft.Core.Entities.Entity.get_PrimaryColumnValue()
   в Terrasoft.Configuration.RemindingConfig..ctor(Entity entity)
   в Terrasoft.Core.Process.UsrProcess4MethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

 

var id = Get<Guid>("ProcessSchemaParameter1");
Set("Par2",id.ToString());
var userConnection = context.UserConnection;
 
var campaignESQ = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Opportunity");
var campaignTitle = campaignESQ.AddColumn("Title").Name;
var campaignid = campaignESQ.AddColumn("Id").Name;
var campaign = campaignESQ.GetEntity(userConnection, id);
 
 
if (campaign == null) 
{
   return false;	
}
DateTime remindTime = DateTime.Now;
 
IRemindingTextFormer textFormer = ClassFactory.Get<UsrLeadRemindingTextFormer1>(
	                                 new ConstructorArgument("userConnection", userConnection));
 
string leadName = campaign.GetTypedColumnValue<string>(campaignTitle);
string subjectCaption = textFormer.GetBody(new Dictionary<string, object> {
            {"LeadName", leadName}
        });
 
string popupTitle = textFormer.GetTitle(null);
 
var remindingConfig = new RemindingConfig(campaign);
remindingConfig.AuthorId = userConnection.CurrentUser.ContactId;
remindingConfig.ContactId = userConnection.CurrentUser.ContactId;
remindingConfig.NotificationTypeId = RemindingConsts.NotificationTypeRemindingId;
remindingConfig.RemindTime = remindTime;
remindingConfig.Description = subjectCaption;
remindingConfig.PopupTitle = popupTitle;
var remindingUtilities = ClassFactory.Get<RemindingUtilities>();
remindingUtilities.CreateReminding(userConnection, remindingConfig);
 
 
return true;

 

Может кто  нибудь сделать внятную инструкцию как отправлять уведомления через БП скриптом ???

Нравится

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

Добрый день!

Судя по call stack у вас campaign == null

Проверьте

Артем Гура,

А нет, не заметил проверку :)

Для того, чтобы понять что не так, нужно произвести debug. С виду все нормально. Обратитесь в поддержку, но для отладки нужна будет ссылка на обезличенную копию БД. Только таким образом можно будет установить причину, т.к. отладка по картинке сложная штука :)

Спасибо!

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

Заметил такую особенность, что при переносе не-компилируемых БП с C# сценариями через экспорт-импорт не понятно как их скомпилировать.

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

Может я что-то не так делаю?

Нравится

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

Я обычно переношу БП, ПКМ (по схеме бп)-> сгенерировать для выбранных, потом компилирую для изменённых. Вроде срабатывает

Варфоломеев Данила, тут скорее интересно, почему через сохранение не срабатывает компиляция? Неужели система не видит, что процесс ни разу не компилировался?

Алексей-Карягин,

¯\_(ツ)_/¯ Ну тут мои полномочия всё) Надо спрашивать разрабов ядра(?).

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

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

Нравится

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

Самое простое что приходит в голову:

старт = добавление активности —> таймер(на, допустим 5 часов) —> считывание активности —> если активность не завершена, то элемент отправить письмо (ответственному по активности) и выход. Если завершена, то выход.

Варфоломеев Данила, это получается, что читается одна активность которую добавили, а хотелось что бы все просроченные активности считывались

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

старт-триггер по времени ежедневно в 9:15 -> чтение выборки по обращениям (ну, тут, что вам необходимо) с отбором по состоянию и флагу "просрочен по разрешению"  и ответственному -> если больше 0, то отправка письма ответственному, что у него есть просроченные обращения.

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

Никульшина Алёна,

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

Насчёт считывания активностей: не знаю ни одного адекватного способа работать с циклами в БП с помощью польз. средств.

Единственный вариант — написать скрипттаск с esq запросом, который сделает выборку кол-ва просроченых задач по каждому пользователю, потом отправка письма каждому. Но это программирование логики.

Плотников ДИ пишет:

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

Вот вот. всё упирается в "перебор" =) Эх если бы они это реализовали, а не пилили конструкторы из версии в версию...

Сделайте VIEW, который считает количество просроченных активностей по ответственным. На базе этого VIEW объект. 

И уже его используйте в БП.

Владимир Соколов, проблема в том что я не знаю как правильно его сделать

Я делал через С# сценарий, так проще всего. Пример отправки отчёта по просроченным задачам

DataTable table = GetDataTableOnSql(context, @"
  SELECT Title
	  , COALESCE(Contact.Name, '') AS [Исполнитель]
	  , DATEADD(hour, 3, Activity.CreatedOn) AS [Дата создания задачи]
	  , DATEDIFF(day, Activity.CreatedOn, GETUTCDATE()) AS [Дней в задаче]
  FROM Activity WITH (NOLOCK)
  LEFT JOIN Contact WITH (NOLOCK) ON Activity.OwnerId = Contact.Id
  WHERE Activity... = Как вы считаете, что задача просрочена???
  ORDER BY Title
"
);
 
string prevTitle = "";
StringBuilder html = new StringBuilder(@"&lt;html&gt;&lt;head&gt;&lt;style&gt;
table {
  border-collapse: collapse;
}
 
th {
	font-weight:bold;
	border: solid 1px #DDDDDD;
}
 
td {
  border: solid 1px #DDDDDD;
}
&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;strong&gt;" + DateTime.Now.ToShortDateString() + "&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;");
 
html.Append("&lt;table&gt;&lt;tr&gt;");
for (int i = 1; i &lt; table.Columns.Count; i++)
	html.Append("&lt;th&gt;&amp;nbsp;&amp;nbsp;" + table.Columns[i].Caption + "&amp;nbsp;&amp;nbsp;&lt;/th&gt;");
html.Append("&lt;/tr&gt;");
 
foreach (DataRow row in table.Rows)
{
		string title = (string)row[0];
		if (prevTitle != title)
		{
			html.Append("&lt;tr&gt;&lt;th style=\"text-align:left;\" colspan=\"" + (table.Columns.Count-1).ToString() + "\"&gt;"+title+"&lt;/th&gt;&lt;/tr&gt;");
			prevTitle = title;
		}
		html.Append("&lt;tr&gt;");
		for (int i = 1; i &lt; table.Columns.Count; i++)
			html.Append("&lt;td&gt;" + row[i].ToString() + "&lt;/td&gt;");
		html.Append("&lt;/tr&gt;");
}
html.Append("&lt;/table&gt;&lt;br/&gt;&lt;br/&gt;С уважением,&lt;br/&gt;Робот ВРМ&lt;br/&gt;&lt;/body&gt;&lt;/html&gt;");
 
// Send report

Метод GetDataTableOnSql - просто читает DataTable по запросу

public DataTable GetDataTableOnSql(ProcessExecutingContext context, string sqlScript)
{
	DataTable table = new DataTable();
	CustomQuery customQuery = new CustomQuery(context.UserConnection, sqlScript);
	using (DBExecutor dbExecutor = context.UserConnection.EnsureDBConnection())
	{
		using (IDataReader dr = customQuery.ExecuteReader(dbExecutor))
		{
			table.Load(dr);
		}
	}
 
	return table;
}

 

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

Коллеги, добрый день! Может быть подобный вопрос уже обсуждали, но не нашел ссылок.



Необходимо сделать авторизацию в bpm через учетные данные Яндекс паспорта и Facebook. Подозреваю, что тут нужно делать авторизацию через oauth 2.0



Может быть есть у кого-то подобный опыт и сможете подсказать основные моменты и возможные проблемы? 

Нравится

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

Насколько понимаю, поддержки OAuth ещё нет, возможно, в новых версиях сделают. Сейчас есть вход через Single Sign-On. Там есть примеры для провайдеров ADFS и OneLogin.

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

Всем привет.

Ввиду не внятности документации прошу помощи.

Как составить такой запрос используя ESQ на клиенте?

SELECT account.UsrINN,(SELECT TOP(1) ModifiedOn FROM Activity activity WHERE activity.AccountId=account.Id ORDER BY ModifiedOn) AS LastComunicationDate  FROM Account account  WHERE account.UsrINN = '7730616959' 

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

Изображение удалено.

 

 

Нравится

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

Последовский Роман,

А так?

var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Account" });
esq.addColumn("UsrINN");
esq.addAggregationSchemaColumn("[Activity:Account].ModifiedOn", 5, "MaxModifiedOn");
esq.filters.addItem(esq.createColumnFilterWithParameter(3, "UsrINN", "7730616959"));
esq.getEntityCollection(function (result) {
	if (result.success &amp;&amp; result.collection.getCount() &gt; 0) {
		result.collection.collection.each(function(item) {
			//some logic
		}, this);
	}
}, this);

 

Роман, приветствую,

А у вас проблема в подзапросе или в сортировке?

Есть в сортировке, то возможно вам поможет вот это: https://community.terrasoft.ru/questions/entityschemaquery-order

Если в подзапросе, то можно

1. Сделать один запрос, а в его колбэке (или в цикле foreach, если это C# сделать еще один запрос).

2. Судя по всему подзапрос можно заменить обычным джойном.

На клиенте? Тогда как-то так:

var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Activity" });
 
esq.addColumn("Account.UsrINN", "AccountINN");
var column = esq.addColumn("ModifiedOn");
column.orderDirection = Terrasoft.OrderDirection.ASC; //asc по modifiedOn
 
esq.rowCount=1; //top1
 
esq.filters.addItem(esq.createColumnFilterWithParameter(3, "Account.UsrINN", "7730616959")); //фильтр по INN
 
esq.getEntityCollection(function (result) {
	if (result.success &amp;&amp; result.collection.getCount() &gt; 0) {
		var item = result.collection.getByIndex(0);
		var INN = item.get("AccountINN");
		var modOn = item.get("ModifiedOn");
	}
}, this);

 

Мне кажется, тут сам SQL-запрос надо вывернуть наизнанку:

SELECT max(ModifiedOn) FROM Activity activity
left join Account account on activity.AccountId=account.Id 
WHERE account.UsrINN = '7730616959'

То есть получим запрос с одной колонкой и одним фильтром по прямой связи. Заодно вместо TOP 1 можно просто максимум при помощи addAggregationSchemaColumn. А затем фильтруем, применив createColumnFilterWithParameter к колонке «Account.UsrINN».

 

Спасибо большое, вариант Данилы работает, но

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

 

 

 

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

Это часть системы поиска дублей.

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

ИНН:123

10 контрагентов, но у 5ти из них есть активности.

Если я сначала полезу в таблицу активности, то мне выведется на экран только 5ть контрагентов, а реально их 10.

В самом начале я указал именно тот SQL запрос, который нужно изобразить с помощью ESQ.

Конечно можно это сделать двумя циклами, но хочется понять можно ли это сделать одним запросом

 

Такое есть смысл делать на сервере. В классе Select можно делать почти то же, что в SQL-запросах, плюс дубли могут быть недоступны через ESQ из-за прав доступа текущего пользователя, а Select работает в обход них.

Последовский Роман,

А так?

var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Account" });
esq.addColumn("UsrINN");
esq.addAggregationSchemaColumn("[Activity:Account].ModifiedOn", 5, "MaxModifiedOn");
esq.filters.addItem(esq.createColumnFilterWithParameter(3, "UsrINN", "7730616959"));
esq.getEntityCollection(function (result) {
	if (result.success &amp;&amp; result.collection.getCount() &gt; 0) {
		result.collection.collection.each(function(item) {
			//some logic
		}, this);
	}
}, this);

 

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

Памятник поставить мало! Спасибо)

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

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

Начал решать задачу создания активностей на основании поставок в паспорте заказа.

Почитал этот форум, создал процесс 

Изображение удалено.

В задании-сценарии код:

EntityCollection entities = Get<EntityCollection>("ReadSupply.ResultEntityCollection");
var result = new Collection<string>();
foreach(Entity entity in entities) {
	var supply = entity.GetTypedColumnValue<string>("Name");
	string temp = supply.ToString();    
	result.Add(temp);    
}
string displayValue = result.ConcatIfNotEmpty(",");
Set("Supply", supply);

Пример взял отсюда 

При запуске процесса на переборе коллекции ошибка:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в Terrasoft.Core.Process.ZLOrderProcessingMethodsWrapper.SupplyCycleExecute(ProcessExecutingContext context) в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Через отладку выяснил, что вылетает на первой строке задания-сценария EntityCollection entities = Get("ReadSupply.ResultEntityCollection");

Все таки, существует способ получить коллекцию элемента "Читать данные" в задании-сценарии?

 

Нравится

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

У меня на версии 7.12.1 получилось(процесс компилируемый ):

Сигнал на изменение контакта, в "Читать данные 1", считываю измененную запись из "Контакта"

 

Изменил Supervisor:

 

 

Есть подозрение, что нет.

Я пытался и с компилируемым скрипт-таском и нет - всё время null. Кстати, получение коллекции - в роадмапе, чуть ли не в след. релизе.

У меня на версии 7.12.1 получилось(процесс компилируемый ):

Сигнал на изменение контакта, в "Читать данные 1", считываю измененную запись из "Контакта"

 

Изменил Supervisor:

 

 

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

Добрый день! Коллеги, помоги с решением проблемы. 



Есть функционал работы со счетами (правда от базового там мало что осталось).

При формировании счета можно выбрать продукты. У продукта есть Название и Артикул, при этом по Названию можно искать (lookup), а по Артикулу нет (текстовое поле).



Хочу, что бы поиск о​​​​​​можно было осуществлять не только по Названию, но и по Артикулу. Что для этого нужно сделать? 



 

Изображение удалено.

 

Нравится

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

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

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

Также передал данное обращение разработчикам поддержки для дальнейшего анализа и предоставления решения.

Denys Diachenko,

Спасибо! 



Правильно ли я понимаю, что в логике BPM у сущности не может быть две колонки с типом lookup? Или тут сложность в чем-то другом? 

Andrey Aleksandrov пишет:

Или тут сложность в чем-то другом

По-умолчанию поиск работает по "главной" колонке, которая указывается в объекте.

Если вам надо переделать поиск по конкретно в том элементе, который у вас на скриншоте - то в принципе это сделать легко (откопать getLookupQuery, да и изменить фильтрацию)

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

мне нужно реализовать поиск по двум колонкам - Название и Артикул.

Если искали по названию, то автоматически заполняется артикул и наоборот

Andrey Aleksandrov пишет:

мне нужно реализовать поиск по двум колонкам - Название и Артикул.

Ох уж эти неявные описания задач...

Перефразирую (поправьте, если что не так): У вас есть деталь. На делали 2 поля: 1-lookup, ссылка на продукт, 2 - Артикул, текстовое. Задача: из текстового поля "артикул" сделать справочное (со ссылкой на продукты, но фильтрация по артикулу), и сделать заполняемость полей (артикул - продукт).

Если всё так, то вот решения:

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

2) Если всё-таки нужно видеть поле, то тип поля "артикул" меняем на справочник со ссылкой на продукт. Опять же перегружаем getLookupQuery, настраиваем нужную фильтрацию и список выдаваемых значений. Плюс потом надо событийные функции (через attributes) доделать, чтобы поля заполнялись по зависимостям. Или через бизнес правила.

3) Если надо оставить "артикул" в текстовом виде - то придётся дописывать подгружаемый list для элемента и кучу других обработчиков. Где-то в конфигурации уже есть SearchableTextEdit... Вообщем, лучше не стоит.

Ну и во всех вариантах придётся писать гору кода и логики. 

Варфоломеев Данила пишет:

Ох уж эти неявные описания задач...

:-) давайте со стороны пользователя пойдем.



Я, как пользователь системы,  должен сформировать счет (или заказ поставщику) добавив туда определенный перечень товаров. Бывает, что названия товаров отличаются в одну букву\цифру:

Сервер HP HPE DL20 Gen9 E3-1240v6 SFF 900WPerf Svr

Сервер HP HPE DL20 Gen9 ES3-1240v6 SFF 900WPerf Svr



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



Но в целом вы все и так правильно поняли. 



 

Варфоломеев Данила пишет:

Ну и во всех вариантах придётся писать гору кода и логики. 

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

Andrey Aleksandrov пишет:

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

 ¯\_(ツ)_/¯

Я так понимаю официально это можно охарактеризовать как: "Возможность не была запланирована изначально, поэтому программно не реализована".

В одном проекте нам партнеры реализовали в поле lookup поиск контактов не только по имени, но и по его средствам связи, например.



То есть, вводим телефон, а система нам отфильтровывает список контактов с такими номерами



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

Владимир Соколов, вот и я в это верю :-)

Andrey Aleksandrov,

Данила правильно ответил. Нужно переопределить метод "getLookupQuery" в странице редактирования детали. Базовый метод находится в "BasePageV2", так что можно отладится и посмотреть как все работает.

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