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

Как сделано в коробке:
1. Настраиваете прайсы, один делаете базовым
2. Настраиваете разные цены для разных продуктов, включая валюты и ставки НДС
3. Открываете мастер подбора и несколько удивляетесь, потому что:
- отображается та цена, которая соответствует текущему установленному в настройках прайсу
- у продуктов, для которых не установлена эта цена, отображается некая другая цена, если используется несколько валют и ставок НДС - ясно, к чему это все приведет.

По моему мнению данное поведение свидетельствует о том, при проектировании этой логики не все было продумано как следует, поэтому будем править, желательно малой кровью :)

Описано на примере заказа, но в принципе должно работать и в фактуре. То, что мы сделали в качестве обходного пути имеет несколько вводных:
1. У нас прайс-лист задается в лоб в заказе непосредственно. Если нужно задавать в клиенте, то вместо получения значения прайлиста в заказе нужно его из клиента тащить (лучше в заказ, тогда ничего нашего править не придется.
2. При изменении прайса в заказе автоматический перерасчет не осуществляется - правьте руками в позициях :)

Теперь суть изменений:
1. Основным модулем, отвечающим за работу мастера подбора является ProductSelectionViewModel. Чтобы его перестроить как нам надо, создаем замещающий пользовательский модуль, в качестве родителя указываем этот самый ProductSelectionViewModel и копируем туда все целиком из оригинала, включая Dependencies, картинки и строки локализации. Внимание - строки локализации должны быть переименованы в коде, иначе не подтянутся значения строчек. Например, в оригинале было PriceLabel: resources.localizableStrings.PriceCaption, у нас будет PriceLabel: resources.localizableStrings.ChlidPriceCaption, соответственно нужно создать новую строку локализации ChildPriceCaption, скопировать туда из оригинала текст.
2. Нужно загрузить туда заново иконки, их всего две - каталог и корзина. Это просто - сохраните в браузере и потом загрузить в наш модуль.
3. Добавляем в заказ поле "Прайслист" (справочник, прайслист), обязательное.
4. Теперь надо модифицировать код. В частности:
- в функции init: function(config) закомментить строку

this.set("BasePriceList", config.BasePriceList);

- присвоение значения this.set("BasePriceList") перетаскиеваем в функцию requestMasterEntityData: function(callback):
добавляем
select.addColumn("PriceList"); // PriceList - имя поля в объекте

добавляем
 this.set("BasePriceList", result.entity.get("PriceList"));

теперь у нас есть значение параметра схемы BasePriceList, который соответствует прайсу в заказе.
дальше переопределяем то, что должно вывестисть в мастере подбора:
- в функции loadGridData: function() переносим строку
var basePriceList = this.get("BasePriceList");
над
this.initQueryColumns(esq, basePriceList.value);

в вызов которой добавляем параметр basePriceList.value
- в самой функции initQueryColumns
вставлем новый параметр pricelist в объявление функции:
initQueryColumns: function(esq, pricelist)

комментим вот эти строки:
// esq.addColumn("Price");
// esq.addColumn("Currency");
// esq.addColumn("Tax");

вместо них вставляем
esq.addColumn("[ProductPrice:Product:Id].Price", "Price");
esq.addColumn("[ProductPrice:Product:Id].Currency", "Currency");
esq.addColumn("[ProductPrice:Product:Id].Tax", "Tax");

добвляем фильтр по прайсу (хотим только те продукты, которые имеют этот прайс)
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[ProductPrice:Product:Id].PriceList", pricelist));

функция готова :)
На этом этапе при нажатии на + в заказе у нас отобразится правильный список продуктов в правильными ценами. Проблема в том, что уже все работает, но при сохранении в позицию "продукт в заказе" пропишется базовый прайс.
Исправляем этот недочет:
- в функции saveSelectedProducts находим фрагмент:
/* if (item.get("PriceList")) {
insert.setParameterValue("PriceList", item.get("PriceList").value, Terrasoft.DataValueType.GUID);
} else if (this.get("BasePriceList")) {
insert.setParameterValue("PriceList", this.get("BasePriceList").value, Terrasoft.DataValueType.GUID);
}*/

и комментим его. Как я понял, у этого куска кода есть неслабая проблема - item.get("PriceList") при сохранении позиции из мастера всегда null, чтобы это побороть пишем "в лоб":
// in the original script there's no pricelist chosen, so we've pushed it from master entity
insert.setParameterValue("PriceList", this.get("BasePriceList").value, Terrasoft.DataValueType.GUID);

В принципе все :) НДС и валюты тоже тянутся, понятное дело.
еще мы от греха добавили
basePriceListProductEsq.addColumn("[ProductPrice:Product:Id].PriceList", "PriceList"); //new line, isn't required

в запрос для новой позиции в функции loadGridData, но особой разницы не заметили.
И последнее - на фактуре (счете) не проверяли, но по идее, если туда тоже вставить поле "Прайс-лист" работать должно.

Во вложении исправденный модуль для 7.8.x - 7.10.x

Нравится

Поделиться

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

Добрый день, Дмитрий!

Спасибо за обратную связь. Мы передали Ваше пожелание на добавление этой функциональности. Это пожелание будет рассмотрено командой разработки продукта для включение данной функции в будущих релизах в рамках проблемы 4896.
Что касается отображение продуктов в подборе, то в базовой функциональности продукта они всегда отображаются согласно одному только прайс-листу - "Базовый прайс лист" и суммы отображаются всегда в базовой валюте (так как в большинстве случаев продажа товара ведется в единой валюте). В данном случае при кастомизации схемы подбора продуктов будет более логичным вывод дополнительных колонок (стоимость в других валютах).

"Дмитрий Степанов" написал:Суть проблемы - методические ошибки в штатной работе подбора продуктов в мастере в sales commerce и enterprise может потенциально привести к указанию в заказе неправильных цен, неправильных ставок НДС или продать то, что данному клиенту вообще продать нельзя.

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

Валерий, приветствую! Спасибо за реакцию. Под методическими ошибками я подразумевал кривизную постановки задачи а не ее реализации. Вот вам наглядный пример:

1. В компании есть клиенты из разных стран (разные валюты и ставки НДС)
2. Некоторые продукты доступны к продаже в одних странах (по одному прайсу), иные - в других странах (по другому прайсу).

В коробе последовательность такая:

1. Набираем продукты в соответствии с базовым прайсом, не обращая внимание на цены, валюты и т.д. и выходим из мастера.
2. Открываем карточку клиента и смотрим, какой у него прайс (невыведенное по умолчанию поле "Pricelist").
3. Открываем раздел продуктов и выписываем на бумажку какие продукты для какого прайса вообще доступны
3. Возвращаемся в заказ и начинаем ручками проходиться по списку продуктов. Если продукт доступен для данного прайса, меняем ручками базовый прайс на нужный. Если не доступен - позицию удаляем.

Как вы сами понимаете это нонсенс. Если же менеджер по продажам не имеет доступа к теущему прайсу клиента, т.е. не знает какой он, то задача вообще не решаемая. Я уж помолчу о количестве ошибок в этом случае.

PS. В единой валюте прайсы как раз ведутся достаточно редко. Как пример - вы сами. Вот попробуйте мне выставить счет на 10 лицензий например используя типовой мезанизм, после этого отпадут все вопросы :)

Дмитрий, спасибо за детализацию.
Информация рассматривается командой разработки продукта. По факту анализа мы дадим Вам полный roadmap по реализации этого функционала.

Добрый день, Дмитрий!

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

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

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

PS. С БП тут не очень оптимальное решение.

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

Доброго времени суток!
Есть задача по которой нужно скрыть вкладки, детали и поля по определенному условию.
На данный момент скрытие реализовано, но есть некая двух-секундная задержка.
Скрытие идет как-то так:

this.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=1]").setStyle("display", "none");

Собственно вопрос. Как избежать этой задержки? Может есть метод аналогичный onEntityInitialized, но который срабатывает быстрее него чтобы допустим все сущности уже были отрисованы на странице.

Нравится

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

Здравствуйте,
Ваша задача сводится к определению создания нового div элемента, уже после которой вы выполните свою логику, сделать это можно следующим образом:
http://stackoverflow.com/questions/4780822/how-can-i-detect-when-a-new-…
В Bpmonline это будет выглядеть так:

define("ContactPageV2", [], function() {
            return {
                        entitySchemaName: "Contact",
                        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                        diff: /**SCHEMA_DIFF*/[
                        ]/**SCHEMA_DIFF*/,
                        methods: {
                                   init: function() {
                                               this.callParent(arguments);
                                               var scope = this;
                                               require(["jQuery"], function() {
                                                           scope.test();
                                               });
                                   },
                                   test: function() {
                                               var scope = this;
                                               $(document).bind("DOMNodeInserted", function(e) {
                                                           // тут, вместо логирования создания каждого элемента в консоль
                                                           window.console.log(e.target, " was inserted");
                                                           // делаете проверку на свой, и вызываете метод выполнения  своей DOM логики через scope
                                               });
                                   }
                        },
                        rules: {}
            };
});
Показать все комментарии

Если выбирать справочник/объект из типовой конфигурации при наведении курсора и удержании его над справочным или гиперссылчоным (в коленке детали/реестра) полем, появляется тултип с дополнительный информацией

Вопрос: Откуда есть пошло ? Как реализовывать правильно ?

Нравится

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

"Севостьянов Илья Сергеевич" написал:тултип

Насколько я помню, это - миникарточка. Ещё в версии 7.7 ввели, однако добавлять её было проблематично.
В 7.8 они намешали каши: в разделе по кнопке добавить теперь открывается не нормальная страница создания, а миникарточка. Только в другом режиме. И для этого режима отдельные поля в диффе.

Итого сейчас у нас в одном проекте миникарточка контрагента раздулась до неприличия, дифф занимает кучу места + чтобы передвинуть поля надо ниипические кренделя выделывать. Вьюмоуд, нотВьюМоуд блин...

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

Данная функциональность является базовой.
Уточните, что именно Вы хотите реализовать?

Раздел созданный через мастера,
чтобы над гиперссылочными полями этого раздела: в справочных полях карточек (на записи из него ссылающиеся), колонках реестров/деталей в которые выведены поля установленные в нем как "Отображаемое значение" - Показывался такой-же тултип(миникарточка), ну и естественно, чтобы можно было хотя-бы список выводимых туда полей определить, как максимум иметь возможность там какую-то логику реализовывать свою, в том числе расширять возможности отображения.
Например, я создаю раздел "Запросы" для главной схемы объекта раздела, "Отображаемым значением" устанавливаем его поле "Номер запроса", таким образом получаем следующее

Если бы я например имел дело не со своим разделом, а со стандартными Контактами, то завесив курсор над каждым из приведенных вариантов гиперссылки (в справочном поле, в колонке реестра/детали) - демонстрировался бы тултип/миникарточка, с доп.информацией.
Я хотел бы реализовать то же самое для своего раздела

Вот как-то так...

"Севостьянов Илья Сергеевич" написал:Я хотел бы реализовать то же самое для своего раздела

Полагаю, вам сюда - ссылка

PS: Оффтоп
Я видел эту статью "пробегом", но как-то свято наивно уверовал в то, что там речь идет о другом
А что тогда за карточка которая в разделе, устанавливается на добавление записи.
н/п у Активностей

Это в системных настройках, по крайне мере называют "мини-карточкой"
Как тогда - такие "Средне-карточки" мутить ? Есть статья ?

Добрый день, Илья!

"Средне-карточка" - мини-карточка, открытая в другом режиме. Физически это одна и та же схема, просто ее viewGenerator отображает различно в зависимости от того, в каком режиме она отображается. Можете посмотреть по коробочным схемам, там есть примерно следующее: "visible": {"bindTo": "isViewMode"}. Статьи, к сожалению, нету, вроде обещают скоро добавить мастер для мини-карточек.

Спасибо за информацию, будем смотреть.

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

Как динамически задавать значение текстового поля в Terrasoft.utils.inputBox, когда он уже открыт?

Нравится

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

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

К сожалению, динамически выполнить изменение данного поля не получится.

Через Ext.JS можно все :)

var controls = {
	content: {
		customConfig: {
			className: "Terrasoft.MemoEdit",
			height: "200px",
			markerValue: "html-edit"
		},
		dataValueType: Terrasoft.DataValueType.TEXT,
		value: ""
	}
};
Terrasoft.utils.inputBox(
	"Заголовок",
	function(){},
	["ok", "cancel"],
	this,
	controls
);
 
Ext.get("t-comp0-wrap").select("textarea").update("Some text 2")

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

Достучаться до компонента и повеситься на его рендер конечно не получится... ну только если "оверрайдить" ашь от самого "Ext.dom.AbstractElement"

Но если вы можете как либо событийно завязаться на показ инпутбокса - то как заменить я показал.

Спасибо :)

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

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

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

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

Далее в деталях часто выводятся какие либо колонки, и хочется чтобы они были гиперсылками на карточку объекта связанного с деталью... как этого добиться, почему одни поля гиперссылки другие - нет ?

Нравится

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

Сам отвечаю на свой вопрос,
За это отвечает поле "Отображаемое значение" в доп.настройках объекта, секция "Системные настройки"


Важно: Именно объекта - корневого элемента в дереве, а не его колонок

А вот теперь вопрос...
Можно ли все таки управлять сим на уровне схем (карточки раздела)
В исходных кодах было обнаружено свойство в values конфигурационном объекте вьюхи

"values": {
		"itemType": this.Terrasoft.ViewItemType.HYPERLINK,
                 ...

Может быть это оно ?

юзкейс который нужен:
Допустим у нас есть сущность с каким-то номером, пусть это будет сферический в ваккуме "Тендер"
У объекта есть поля "Номер тендера" и "Наименование".
Так вот на уровне объекта в "Отображаемое значение" мы устанавливаем "Номер тендера"
для того чтобы во всех справочных полях системы которые ссылаются на этот объект во въюхе гиперлинк-поля отображаемым значением (displayValue) был "Номер тендера"
А вот в само реестре объекта, колонка "Номер тендера" - скрывается за ненадобностью, но выводится колонка "Наименование", и вот конкретно в реестре хочется чтобы оно выводилось гиперлинком, как выводится поле "Номер проекта".
Надеюсь смысл понятен.

"Севостьянов Илья Сергеевич" написал:Надеюсь смысл понятен.

Гиперлинком то сделать можно, но обработку нажатия и открытие чего либо прийдется делать самому.
Пример ниже для детали, но суть понятна, текстовую колонку "UsrString" делаю ссылочной, и обрабатываю клик по ней в замещении linkClicked:

define("UsrSchema1Detail", [], function() {
 return {
  entitySchemaName: "UsrTest",
  details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
  diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
  attributes: {
  },
  methods: {
   init: function() {
    this.callParent(arguments);
    document.scope = this;
   },
   getIsLinkColumn: function(entitySchema, column) {
    if (column.columnPath === "UsrString") {
     return true;
    }
    return this.callParent(arguments);
   },
   addColumnLink: function(item, column) {
    this.callParent(arguments);
   },
   linkClicked: function(recordId, columnName) {
    if (columnName === "UsrString") {
     console.log("UsrString column clicked! and recordId is " + recordId);
    }
    this.callParent(arguments);
   }
  }
 };
});

"Максим Шевченко" написал:текстовую колонку "UsrString" делаю ссылочной

вот это не понятно как вы делаете ?
Где этот diff или генератор с "itemType": this.Terrasoft.ViewItemType.HYPERLINK

Далее... гиперссылочное поле оно же в сути должно содержать href т.е. при наведении на А-тег должны быть все браузерные "Копировать ссылку" и "Открыть в новой вкладке" и т.д. работать
А как-же это методом обработаешь... а как ссылку формировать, а куда ложить ?
Какая-то не гиперссылка получается а ее полу-имитация.

так... немного начинаю разбираться

   getIsLinkColumn: function(entitySchema, column) {
    if (column.columnPath === "UsrString") {
     return true;
    }
    return this.callParent(arguments);
   }

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

   addColumnLink: function(item, column) {
    this.callParent(arguments);
   },

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

Вы обрабатываете клик... встает вопрос, а как же клик по ссылке от браузера (или там вообще в итоге не будет ссылки в понятии тега A)?
Или может он прерывается на уровне приложения ? (клик по ссылке)
Если мне непосредственно нужен переход по целевой ссылке (к связанной сущности), мне надо руками openCardInChain реализовывать, или есть другой подход ?

"Севостьянов Илья Сергеевич" написал:вот это, что это за метод ?

Метод из, GridUtilitiesV2 замещение не нужно, но может быть полезен для формирования браузерного линка, на случай если будут открывать через контекстное меню, см. FileDetailV2
"Севостьянов Илья Сергеевич" написал:а как же клик по ссылке от браузера

прерывается
"Севостьянов Илья Сергеевич" написал:openCardInChain

если в рамках bpmonline, то openCardInChain, либо переходом по линку в формате:
http://сайт/0/Nui/ViewModule.aspx#CardModuleV2/AccountPageV2/edit/40594…

"Максим Шевченко" написал:Метод из, GridUtilitiesV2 замещение не нужно, но может быть полезен для формирования браузерного линка

Т.е. я так понимаю именно в этом методе надо формировать линк, чтобы он был в теге A целевого поля/колонки ?
его нужно возвращать в return или куда-то устанавливать ?

"Севостьянов Илья Сергеевич" написал:его нужно возвращать в return или куда-то устанавливать ?

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

Спасибо, за подробный ответ.

PS: В целях исторической ценности этой темы - озвучить этот вопрос и получить от Вас на него ответ, важнее чем побежать дебагером и проверить самому :)

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

Добрый день, сегодня ночью BPMonline обновилась до версии 7.10 и перестала работать авторизация: 403 - Forbidden: Access is denied. You do not have permission to view this directory or page using the credentials that you supplied.
Раньше осуществляли авторизацию по примеру из данной темы (https://community.terrasoft.ru/forum/topic/9613).
Можете, пожалуйста скинуть пример авторизации на php c добавлением CSRF-токена в заголовок запроса.

Нравится

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

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

Готового запроса нет - его нужно писать. Если у вас получится, пожалуйста, поделитесь.

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

$file = "cookie.txt";
$lines = file( $file ); 
$str =  $lines[6]; 
$prefix = "BPMCSRF";
$index = strpos($str, $prefix) + strlen($prefix);
$token = trim(substr($str, $index));

и добавили в заголовок:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json;odata=verbose',
		'BPMCSRF:' .  $token,
        'Content-Length: ' . strlen($json))
);

После обновления необходимо теперь добавить CSRF токен
Есть пакет который уже предоставляет интерфейс для BPM

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

Это было и в 7.8 и ныне в 7.10
Манипуляции с мастером страницы создают постоянно в данных текущего пакета данные в формате "SysImage_{хешь}" причем внутри данных нет никаких условий, там просто затаскивается вся таблица SysImage, уже сразу после создания данные в них не проходят проверку с предупреждениями о том что такие-то записи уже включены в другие данные (что не удивительно).
Да и вообще что это за "кунг-фу" и зачем это надо ?
Потому что логически вообще таскать везде и всюду по несколько раз таблицу с изображениями в полном составе, особенно странно когда эти данные появляются как грибы, каждый раз после того как ты колонку в карточке подвинул.

Нравится

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

Добрый день, Илья!

По данной проблеме уже работают наши разработчики ядра, ориентировчно в 7.10.1-7.10.2 будет фикс.

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

добрый день.

обнаружили проблему, может кто-то сталкивался и подскажет.

мы интегрируемся с bpm online по API. примерно неделю назад перестала работать выборка данных из системы (при этом логин работает).

отдает 403 ошибку, а именно:

403 - Forbidden: Access is denied.

You do not have permission to view this directory or page using the credentials that you supplied.

есть подозрение что bpm online обновился и не обновил документацию как к нему обращаться.

спасибо заранее

Нравится

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

Добрый день!

Техподдержка прислала набор ссылок для последовательного обновления до 7.10.0.

До 7.9.0.1228 обновления проходили без видимых проблем. После попытки обновления с 7.9.0.1228 до 7.9.1.3284 вывалилась ошибка. Может быть какая-то промежуточная конфигурация/версия пропущена? Подскажите, кто что знает, плиззз.

Нравится

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

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

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

Логи прикрепил

"Андрей Шеленговский" написал:вывалилась ошибка.

"Ошибка: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information."

Насколько я помню решается копированием вручную содержимого папки bin в WorkspaceConsole, ибо батник иногда не может в копипасту

"Варфоломеев Данила" написал:
Андрей Шеленговский пишет:

вывалилась ошибка.

"Ошибка: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information."

Насколько я помню решается копированием вручную содержимого папки bin в WorkspaceConsole, ибо батник иногда не может в копипасту


Чтоб не сглазить, вроде пошел процесс после копирования вручную.

Спасибо, Данила!

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

Хотелось бы реализовать такую деталь, которая будет отображать некоторый набор информации, без возможности взаимодействия (создания/удаления), просто демонстрация данных, причем не хочется раздувать базу создавая под это дело реестрище.
Хочется при инициализации детали - сделать запрос, получить данные из которых сформировать несколько записей и отобразить их в этой детали, это возможно ?
Как бы виртуальные, динамические записи реестра в детали...
Просто предыдущий опыт показывает что добавление записей в реестр детали - напрямую связано с записью в БД, некий объект-реестр. Как собственно и первичное ее отображение связано с чтением из БД объекта-реестра.

Нравится

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

Добрый день, Илья!

К сожалению, реализовать такую деталь Вы не сможете, так как в любом случае деталь завязана на какой-то объект, то есть на таблицу в БД. Рекомендую посмотреть в сторону детали Средства связи контакта, она формируется динамически, возможно это поможет решить Вашу бизнес-задачу.

"Севостьянов Илья Сергеевич" написал:отобразить их в этой детали, это возможно ?

Создать коллекцию, в коллекцию ложить данные (каждая строка - baseviewmodel), выбранные esq запросом, всю коллекцию биндить в ContainerList, написать ручками генератор ряда, натянуть стили.
Не Grid, конечно, но тоже сойдёт

Добрый день, Илья! Получилось ли у вас это выполнить?

Добрый день. Что Вы имеете в виду, получилось ли посмотреть на деталь средств связи? Вы сами можете это сделать, это схемы BaseCommunicationDetail, AccountCommunicationDetail или ContactCommunicationDetail. 

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

Как  вариант, можно использовать обычную деталь, но использующую объект на основе view. Запрос в базу будет, но данные не хранятся в одной конкретной таблице, а берутся из нескольких или вычисляются. Можно, наверно, и к веб-сервису обратиться из скриптов на стороне сервера MS SQL.

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