Добрый день!

Необходимо получить список обращений с фильтрацией по колонке Status. Но поскольку это поле не заполнено, беру колонку StatusId в которой указаны справочные ID статусов обращения.

Отправляю запрос в следующем виде:

https://mysite/0/odata/Case?$filter=StatusId eq guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38'

получаю ответ:

{
    "error": {
        "code": "",
        "message": "The query specified in the URI is not valid. Unrecognized 'Edm.String' literal 'guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38'' at '12' in 'StatusId eq guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38''."
    }
}

 

Какие комбинации я только не пробовал:

https://mysite/0/odata/Case?$filter=StatusId/Id eq guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38'

https://mysite/0/odata/Case?$filter=StatusId eq guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38'

https://mysite/0/odata/Case?$filter=StatusId eq '7e9f1204-f46b-1410-fb9a-0050ba5d6c38'

и т.д. - результат один и тот же - ошибка 400

 

При этом если я делаю запрос по колонке с данными типа string - запрос отрабатывает корректно и возвращает ответ 200, например так:

https://mysite/0/odata/Case?$filter=Number eq 'SR00000262'

 

Что я делаю не так?

Нравится

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

Должно работать так:

https://mysite/0/odata/Case?$filter=Status/Id eq 7e9f1204-f46b-1410-fb9a-0050ba5d6c38

 

Должно работать так:

https://mysite/0/odata/Case?$filter=Status/Id eq 7e9f1204-f46b-1410-fb9a-0050ba5d6c38

 

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

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

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

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

Как правильно организовать решение такого кейса?

Нравится

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

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

 

Можно в мастере раздела открыть раздел «Заказ» и добавить требуемое дробное поле в основную часть карточки или на вкладку «Доставка». Но нужно учесть, что в объекте этого раздела много логики на встроенных БП разных пакетов и в отдельных схемах (вроде ProductEntryUtils, OrderCalculator, OrderAmountHelper и др.), нужно будет всё это проанализировать и при необходимости доработать с учётом нового поля. Например, сейчас состояние заказа меняется в зависимости от ненулевого значения «Сумма оплаты» или совпадения его с «Итого».

public virtual bool ChangeStatus() {
	if (Entity.StoringState == StoringObjectState.New) {
return true;
	}
	List<string> changedColumnNames = Entity.GetChangedColumnValues()
	.Where(cv=>cv.Value != cv.OldValue)
	.ToList().ConvertAll(cv => cv.Column.Name);
	NeedFinRecalc = changedColumnNames.Intersect(new[] {"CurrencyRate", "Currency"}).Any();
	var securityEngine = UserConnection.DBSecurityEngine;
	bool hasRight = securityEngine.GetIsEntitySchemaColumnEditingAllowed("Order", "PaymentStatus");
	if (changedColumnNames.Intersect(new[] {"Amount", "PaymentAmount"}).Any() && hasRight) {
		var amount = Entity.GetTypedColumnValue<decimal>("Amount");
		var paymentAmount = Entity.GetTypedColumnValue<decimal>("PaymentAmount");
		if (amount > 0 && amount == paymentAmount) {
			Entity.SetColumnValue("PaymentStatusId", OrderPackage.Constants.Order.OrderPaymentStatus.Paid);
		} else if (paymentAmount > 0) {
			Entity.SetColumnValue("PaymentStatusId", OrderPackage.Constants.Order.OrderPaymentStatus.PartiallyPaid);
		}
	}
	return true;
}

Если появится новое поле, стоит либо в «Итого» и подобных полях считать сумму по продуктам уже вместе с добавленной доставкой, или сравнивать с суммой двух полей.

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

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

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

из-за чего есть необходимость обновить страницу справочника с Бизнес процесса.

Подскажите как это можно реализовать.

Спасибо.

Нравится

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

Добрый вечер.

 

Для передачи сообщений из серверной логики на клиент используется механизм ClientMessageBridge.

 

Также посмотрите обсуждение в этом посте.

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

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

спасибо за вариант, но уже все реализовано по другому, осталось проблему с рефрешем страницы решить.

попытался реализовать через ClientMessageBridge, хочу повторить пример со статьи, но опять есть вопрос, с Процесса сообщение уходит, в ClientMessageBridge попадает, но потом хочу получить сообщение в нужной мне схеме, 

я беру (BaseLookupConfigurationSection) так как этот функционал мне нужен при добавлении строки, но туда сообщение NewUserSet не доходит, как понять в чем ошибка?

Так же появляется ошибка:

Приведите Ваш код, который Вы разработали для этой функциональности.

1. В процессе добавил в Задание-сценарий:

string messageText = "{\"name\": \"" + "TestName" + "\"}";

string sender = "NewUserSet";

MsgChannelUtilities.PostMessageToAll(sender, messageText);

return true;

 

2. вот код замещающей схемы ClientMessageBridge :

 /**

 * @class ClientMessageBridge.ELBase

 * @extends ClientMessageBridge.NUI

 */

define(

    "ClientMessageBridge",

    ["ConfigurationConstants"],

    function(ConfigurationConstants) {

        return {

            messages: {

                "NewUserSet": {

                    "mode": Terrasoft.MessageMode.BROADCAST,

                    "direction": Terrasoft.MessageDirectionType.PUBLISH

                }

            },

            methods: {

                /**

                 * @inheritDoc ClientMessageBridge.UIv2#init

                 * @override

                 */

                init: function() {

                    this.callParent(arguments);

                    this.addCustomMessages();

                },

                

                addCustomMessages: function() {

                    this.addMessageConfig({

                        sender: "NewUserSet",

                        messageName: "NewUserSet"

                    });

                },

                afterPublishMessage: function(

                    sandboxMessageName,

                    webSocketBody,

                    result,

                    publishConfig) {

                    if (sandboxMessageName === "NewUserSet") {

                        var name = webSocketBody.name;

                        window.console.info("Опубликовано сообщение: " + sandboxMessageName +". Данные: name: " + name);

                    }

                }

            }

        };

    }

);

 

3. и код замещающей схемы BaseLookupConfigurationSection:

/**

 * @class BaseLookupConfigurationSection.ELBase

 * @extends BaseLookupConfigurationSection.UIv2

 */

define(

    "BaseLookupConfigurationSection",

    [],

    function(BusinessRuleModule, ConfigurationConstants) {

        return {

             messages: {

                "NewUserSet": {

                    "mode": Terrasoft.MessageMode.BROADCAST,

                    "direction": Terrasoft.MessageDirectionType.PUBLISH

                }

            },

            methods: {

                /**

                 * @inheritDoc GridUtilitiesV2.NUI#checkCanDelete

                 * @override

                 */

                checkCanDelete: function(items, callback, scope) {

                    this.callGetLookupDisabledActionsService(this.getParentMethod(this, arguments));

                },

                

                callGetLookupDisabledActionsService: function(callback) {

                    this.showBodyMask();

                    this.callService(

                        this.getGetLookupDisabledActionsServiceConfig(),

                        this.handleGetLookupDisabledActionsServiceResponse.bind(this, callback),

                        this

                    );

                },

                

                getGetLookupDisabledActionsServiceConfig: function() {

                    return {

                        serviceName: "GetUserRolesService",

                        methodName: "GetLookupDisabledActions",

                        data: {

                            lookupEntitySchemaUId: (this.getGridEntitySchema() || {}).uId

                        }

                    };

                },

                

                handleGetLookupDisabledActionsServiceResponse: function(callback, response) {

                    this.hideBodyMask();

                    if (response &&

                        response.success &&

                        !(response.data || []).includes(EL.const.db.EL_RECORD_ACTION.DELETE)) {

                        callback();

                    } else {

                        this.showInformationDialog(this.get("Resources.Strings.ForbiddenToEditLookupMessage"));

                    }

                },

// Инициализация схемы.

                init: function() {

                    this.callParent(arguments);

                    this.sandbox.subscribe("NewUserSet", this.onNewUserSet, this);

                },

// Обработчик события получения сообщения NewUserSet.

                onNewUserSet: function(args) {

                    var name = args.name;

                    window.console.info("Получено сообщение: NewUserSet. Данные: name: " + name);

                }

            }

        };

    }

);

 

А почему у Вас на странице, где будет ловиться сообщение, указано «"direction": Terrasoft.MessageDirectionType.PUBLISH», а не «"direction": Terrasoft.MessageDirectionType.SUBSCRIBE», как в примере? Не в этом ли дело?

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

вы правы, получилось, с этим спасибо, сообщение я получил.

но изначально я же хотел обновить страницу, и для этого я заменил вывод на this.reloadEntity();

получилось так:

// Инициализация схемы.

                init: function() {

                    this.callParent(arguments);

                    this.sandbox.subscribe("NewUserSet", this.onNewUserSet, this);

                },



                onNewUserSet: function(args) {

/*                   var name = args.name;

                   window.console.info("Получено сообщение: NewUserSet. Данные: name: " + name);*/

                    

                    this.reloadEntity();

                }

 

Но теперь я вижу что reloadEntity - undefined,

и получаю такую ошибку:

Функция reloadEntity задана в BasePageV2. Видимо, BaseLookupConfigurationSection, куда Вы добавляете обработчик, не наследуется от неё.

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

а возможно есть еще какие то варианты как обновить страницу?

Видимо, разобраться в логике этой функции и реализовать аналогичное для этой страницы? Она такая:

reloadEntity: function(callback, scope) {
	Terrasoft.chain(
		this.initEntity,
		function(next) {
			this.onEntityInitialized();
			this.actualizeDcmActionsDashboard(next, this);
		},
		function() {
			this.updateDetails();
			this.sandbox.publish("CardRendered", null, [this.sandbox.id]);
			this.hideBodyMask();
			Ext.callback(callback, scope);
		},
		this
	);
},

 

ок, спасибо, буду что то думать.

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

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

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

Использую BPM 7.15

 

Нравится

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

Добрый день!

В среде разработки команда ClassFactory.Get("Word"); вылетает с ошибкой. 

Команда ClassFactory.Get(); успешно выполняется.

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

Нравится

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

Подскажите, пожалуйста, можно ли добавить в панель, появляющуюся при нажатии на иконку с вопросом, ссылку на свою пользовательскую инструкцию? Как это можно сделать?

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

Нравится

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

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

 

Например, так добавил обработчик со ссылкой на Google:

define("ContextHelpSchema", ["AcademyUtilities", "ContextHelpSchemaResources", "ContextTipManager", "RightUtilities",
	"HoverMenuButton"], function(AcademyUtilities, resources, ContextTipManager, RightUtilities) {
		return {
		methods: {
			google: function() {
				window.open("http://google.com");
			}
		},
			diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "googleMenuItem",
				"parentName": "HelpButton",
				"propertyName": "menu",
				"values": {
					"caption": {"bindTo": "Resources.Strings.Google"},
					"markerValue": {"bindTo": "Resources.Strings.Google"},
					"itemType": this.Terrasoft.ViewItemType.MENU_ITEM,
					"click": {"bindTo": "google"},
					"tag": "google",
					"imageConfig": resources.localizableImages.ImageGoogle
				}
			}
			]/**SCHEMA_DIFF*/
		};
	});

Выглядит так:

При желании, можно сделать более сложную логику формирования URL в зависимости от каких-либо условий, как это сделано у существующих пунктов.

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

 

Например, так добавил обработчик со ссылкой на Google:

define("ContextHelpSchema", ["AcademyUtilities", "ContextHelpSchemaResources", "ContextTipManager", "RightUtilities",
	"HoverMenuButton"], function(AcademyUtilities, resources, ContextTipManager, RightUtilities) {
		return {
		methods: {
			google: function() {
				window.open("http://google.com");
			}
		},
			diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "googleMenuItem",
				"parentName": "HelpButton",
				"propertyName": "menu",
				"values": {
					"caption": {"bindTo": "Resources.Strings.Google"},
					"markerValue": {"bindTo": "Resources.Strings.Google"},
					"itemType": this.Terrasoft.ViewItemType.MENU_ITEM,
					"click": {"bindTo": "google"},
					"tag": "google",
					"imageConfig": resources.localizableImages.ImageGoogle
				}
			}
			]/**SCHEMA_DIFF*/
		};
	});

Выглядит так:

При желании, можно сделать более сложную логику формирования URL в зависимости от каких-либо условий, как это сделано у существующих пунктов.

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

 спасибо Вам!

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

Добрый день!

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

Нравится

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

Денис, о каких именно уведомлениях речь?

 

Если это записи в таблице Reminding (Уведомление), можно включить администрирование по записям и нужным записям сразу выдавать права на чтение только тем, кому надо. Это можно в БП на событии создания (проверяя, что именно по активности с определёнными названием или связями с обращением) или, если возможно, доработать сам код, где запись создают.

 

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

 

Аналогично для записей в ленте в таблице ESNNotification (Уведомление ленты).

 

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

 

Или речь о уведомлениях в виде писем, которые отправляет система? Они отсутствуют стандартно и добавлены в дополнениях. Соответственно, поможет удаление такого дополнения или отключение ненужного БП, которые входят в устанавливаемый пакет.

Добрый день!

Аналогичный вопрос!

Как можно ограничить видимость отдельного элемента коммуникационной панели для определённых групп?

 

Создать операцию, выдать группам права на неё, а в коде страницы, где эта кнопка, привязать видимость к проверке на эту операцию.

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

Подскажите как вывести следующую аналитику с типом "Показатель" (можно каким либо другим):

Есть объект, в котором 2 поля с типом данных "дата": "Плановая дата" и "Фактическая дата".

Нужно вывести следующую информацию:

1) Количество записей, которые не были просрочены ("Фактическая дата"< "Плановая дата")

2) Количество записей, которые были просрочены ("Фактическая дата"> "Плановая дата")

 

Я предполагал, что можно в разделе "Как отфильтровать" указать поле "Фактическая дата" знак "<" и выбрать поле: "Плановая дата", но там можно выбрать только текущий год/месяц/ день.... :((((((

Нравится

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

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

 

Тут нужны обходные подходы: либо через view, как выше советует Алла, либо сделать дополнительное поле (логическое или числовое) и на уровне БП (обычного или встроенного) писать туда признак, что первая дата больше или разницу в днях. БП запускать на событии вставки записи или изменения одного из полей с датами. И затем итоги строить по этому полю.

Добрый вечер.

 

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

 

Как создать такое представление подробнее читайте в этом посте.

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

 

Тут нужны обходные подходы: либо через view, как выше советует Алла, либо сделать дополнительное поле (логическое или числовое) и на уровне БП (обычного или встроенного) писать туда признак, что первая дата больше или разницу в днях. БП запускать на событии вставки записи или изменения одного из полей с датами. И затем итоги строить по этому полю.

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

Алла Савельева,

Спасибо за ответы

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

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

 

Требуется ваша помощь. 

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

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

Как поправить, куда посмотреть? 

Нравится

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

Слишком мало информации, непонятно даже, какого типа печатная форма, Word, FR или ещё как.

 

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

 

Дело только в самодельной, аналогичные стандартные отчёты работают?

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

Коллеги, добрый день. Версия 7.15.4.

 

При создании страницы редактирования (в разделе используется несколько страниц редактирования в зависимости от типа) была создана новая схема карточки. Как правильно её переименовать в данной версии?

 

Ранее можно было просто изменить название в конфигурации (в define схемы и в названии), но теперь возникает ошибка:

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

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

Нравится

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

Я в таких случаях делал стоп/старт iis. Актуально для onsite.

Добрый день.

 

Мне в таких случаях помогала полная компиляция конфигурации, хотя это очень напрягает из-за того, что много времени уходит на выполнение этой операции.

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

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

Соглашусь с Коллегами, помогает либо генерация ИК, либо полная компиляция конфигурации. Обычно хватает второго, да и занимает меньше времени.

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

Владимир Соколов,

 

Да, раньше было достаточно только генерации исходного кода для выбранных элементов, но где-то с версии 7.15.4 у меня это не работало.

 

У Вас на какой версии достаточно генерации исходных кодов?

Титаев Александр Николаевич пишет:

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

После предыдущих 2х пунктов пересохранение уже точно не нужно. 

Алла Савельева пишет:

Мне в таких случаях помогала полная компиляция конфигурации, хотя это очень напрягает из-за того, что много времени уходит на выполнение этой операции.

Специально проверила на версии 7.16.0, достаточно выполнить только компиляцию измененных (такая компиляция обычно выполняется значительно быстрее). Но при этом появится ошибка, что схема не найдена, однако, если зайти в саму схему и сохранить ошибка уже не появится.

Надеюсь, что для кого-то эта информация будет полезной.

Я в таких случаях делал стоп/старт iis. Актуально для onsite.

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