Добрый день!

1. В академии есть хороший материал по добавлению вычисляемых полей https://academy.terrasoft.ru/documents/technic-sdk/7-9/dobavlenie-vychis...
Но можно ли маленький пример как можно обратится к полю из другого объекта. Например: я хочу чтобы в поле объекта Заказ "Затраты" суммировались все поля "Затраты" объекта "продукты в заказе", которые в данном заказе. По аналогии с тем как сейчас меняется Итого заказа при добавлении продуктов в нем.

2. Еще на эту тему вопрос, мне необходимо чтобы в Заказе поле рассчитывалось в зависимости от другого поля в этом же разделе (тут понятно) но и от поля в карточке контрагента. Как обратиться к данному поле при добавлении атрибутов. this.get("Amount") обращаюсь к полю Итого текущего объекта, то к контрагенту необходимо так - Account.get("мое поле") ?

Нравится

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

"Калушка Д." написал: как можно обратится к полю из другого объекта

Скорее всего только через esq запрос. Либо (для данного примера) можно сделать простенький бп, который обновляет поле "затраты" при добавлении/изменении/удалении связанных продуктов.
Или можно сделать вьюшку, и, опять же, через esq оттуда подтягивать данные. Много вариантов.
"Калушка Д." написал: от поля в карточке контрагента

Через сообщения (sandbox.publish). Или можно вообще запилить сервис, который будет пересчитывать поле в зависимости от кучи факторов, и тогда уже вызывать его при изменении поля. Снова, есть варианты

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

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

В объекты [Продукт в заказе] и [Продукт в счете] добавилось вычисляемое поле [Цена со скидкой]. Встала задача перенесения значения этого поля из продукта в заказе в продукт в счете при создании счета на основе заказа. Подскажите, пожалуйста, как это сделать? Заранее благодарю!

Нравится

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

Попробуйте с помощью бизнес процесса, который стартует по сигналу создания счета:
https://academy.terrasoft.ru/documents/technic-bpms/7-8-0/obzor-vozmozh…

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

перенос продуктов из Заказа в Счет происходит при выполнение бизнес-процесса "CreateInvoiceFromOrder". Если вы Дмитрий добавили новые вычисляемые поля в таблицы продуктов Заказа и Счета и вам требуется их переносить. Тогда мой совет скопировать бизнес-процесс "CreateInvoiceFromOrder" с новым названием и отредактировать элемент бизнес-процесса "Добавить продукты в счет", добавив свои новые созданные поля. После сохранить и опубликовать процесс. Далее вам требуется заместить страницу редактирования OrderPageV2 и добавить в Методы следующий замещающий код: (пример)

     /**
     * Запускает процесс создания счета по заказу.
     * @private
     */
     createInvoice: function() {
          ProcessModuleUtilities.executeProcess({
               sysProcessName: "NewCreateInvoiceFromOrder",
                    parameters: {
                                          CurrentOrder: this.get("Id")
                                     }
          });
     }

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

Благодарю, Михаил! Но данный способ подходит, если счет создается из действия "Создать счет на основании заказа". В нашем случае счет создается со вкладки "Паспорт заказа" с детали "График поставок и оплат": "+"-> 100% предоплата -> "Создать" счет на строке "Полная оплата товара". Как запустить процесс в этом случае?

В этом случае Дмитрий процесс запускать не требуется, а требуется заместить и отредактировать схему "SupplyPaymentDetailV2", метод "getInvoiceInsertQuery". В данном методе происходит создание счета и копирование продуктов из заказа в счет. так же требуется не забыть заместить метод "getSupplyPaymentProductEntitySchemaQuery" и добавить в него свой новые созданные колонки.

"Дмитрий Д." написал:В нашем случае счет создается со вкладки "Паспорт заказа" с детали "График поставок и оплат": "+"-> 100% предоплата -> "Создать" счет на строке "Полная оплата товара". Как запустить процесс в этом случае?

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

Спасибо, Михаил! Действительно, рабочее решение, только вместо метода getInvoiceInsertQuery() правильнее переопределить getInvoiceProductInsertQuery(). Вот что у меня получилось в SupplyPaymentDetailV2:

getSupplyPaymentProductEntitySchemaQuery: function() {
	var esq = this.callParent(arguments);
 
	esq.addColumn("Product.UsrPriceWithDiscount", "UsrPriceWithDiscount");
	return esq;
},
 
getInvoiceProductInsertQuery: function(config, i) {
	var insert = this.callParent(arguments);
 
	var product = config.products.getByIndex(i);
	insert.setParameterValue("UsrPriceWithDiscount", product.get("UsrPriceWithDiscount"), this.Terrasoft.DataValueType.MONEY);	
	return insert;
}

Пожалуйста Дмитрий. Сейчас все получилось, что вы хотели? или еще остались вопросы?

Да, есть еще вопрос. При добавлении к заказу продукта у него автоматически рассчитывается [Сумма], [Сумма налога] и [Итого]. Мне нужно сюда же добавить логику расчета поля [Цена со скидкой]. Где я могу это сделать? Можно, конечно, в методе onEntityInitialized() карточки редактирования OrderProductPageV2, но мне кажется, что этим занимается какой-то бизнес-процесс.

"Дмитрий Д." написал:

Да, есть еще вопрос. При добавлении к заказу продукта у него автоматически рассчитывается [Сумма], [Сумма налога] и [Итого]. Мне нужно сюда же добавить логику расчета поля [Цена со скидкой]. Где я могу это сделать? Можно, конечно, в методе onEntityInitialized() карточки редактирования OrderProductPageV2, но мне кажется, что этим занимается какой-то бизнес-процесс.

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

Если я правильно вас понял Дмитрий, то речь идет об обновление полей Заказа, после добавления продукта в Заказ, весь расчет перечисленных вами полей происходит в бизнес-процессе схемы таблицы Продукты в заказе ("OrderProduct"), метод "RecalculateOrderAmount".

Если нужно пересчитывать поля в продукте заказа после сохранение заказа, то за это отвечает бизнес-процесс схемы таблицы Заказы метод "SetOrderProductCurrency"

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

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

"Дмитрий Д." написал:не совсем понятно, в какой схеме искать указанный вами метод?

Как выше написал Михаил, в схеме [OrderProduct].
Прикрепил скриншот для наглядности.

У нас в схеме [OrderProduct] нет такого метода, зато он есть в схеме [Order]. Каким образом возможно переопределить и дополнить этот метод в кастомном пакете?

Нужно просто заместить нужный Вам объект (в Вашем случае это [Order]). А уже в замещенном объекте можете переопределять этот метод в зависимости от своих потребностей. Если уже есть замещенный объект в пакете Custom, то просто открыть двойным кликом по методу и переопределить нужным Вам образом.

Давайте еще раз по порядку. Я переопределил схему [OrderProduct], открыл соответствующий ей процесс. Там есть методы UpdatePrimaryAmounts() и RecalculateOrderAmount() (как на скриншоте). Куда я могу вставить логику расчета кастомного поля объекта [OrderProduct], которая должна сработать при создании объекта (то есть при добавлении продукта в заказ)?

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

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

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

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

Доброго времени суток!
Столкнулся с проблемой - есть запрос с вычисляемыми полями, заказчик захотел подбивать итоги по этим полям. Я определил событие OnDatasetCalcSummary, в котором по этим полям подвожу итоги. Непосредственно сама математика выполняется верно, итог присваивается верно, но в конце концов - итог пустой. На сколько помню, в SDK написано Использование данного события решает проблему подсчета итогов в реестрах по вычисляемым полям но почему же итог пустой??
Попробовал на XRM 3.4.0.92 - все прекрасно работает, у заказчика стоит XRM 3.4.0.144, такая же история и с 3.4.0.136.
Как-то, мягко скажем, корявенько решается проблема подсчета итогов в реестрах по вычисляемым полям. Возможно, есть более новые сборки, в которых эту проблему уже победили?

Нравится

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

Здравствуйте!
Выгрузите сервисы, укажите изменения, мы посмотрим на указанных Вами версиях.

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

Добрый день!

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

"Гакало Игорь Александрович" написал:

Добрый день!

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


Письмо отправил - готов продемонстрировать на вышеуказанных билдах

Константин, предлагаю Вам изучить тему http://www.community.terrasoft.ua/forum/topic/8468 и проделать нечто похожее как я пишу.

"АльфаКрыса" написал:

Константин, предлагаю Вам изучить тему http://www.community.terrasoft.ua/forum/topic/8468 и проделать нечто похожее как я пишу.


АК, спасибо большое за совет! Нечто похожее реализовано и у меня, но проблема кроется не в реализации переопределения подсчета итогов, а именно в отработке этих событий. Можете сами попробовать переопределить подсчет итогов на вышеуказанных билдах - переопределенное событие срабатывает, происходит вычисление, итог помещается в SummaryValues, НО, если подсчет происходил именно по вычисляемым полям - в гриде ничего не отображается. И именно для вычисляемых, для полей подзапросов или обычных - все отлично. Продемонстрировал тех поддержке эту проблему - ответили, что обращение передано в отдел разработки

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