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

Нравится

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

Эта логика реализована во встроенном БП объекта «Продукт в продаже» (OpportunityProductInterest). Там в обработчике событий сохранения и удаления записей в объекте детали запускается функция CalckOpportunityAmount с кодом:

var oppotrunityAmountSelect = new Select(UserConnection)
	.Column("Amount")
	.From("OpportunityProductInterest")
	.Where("OpportunityId").IsEqual(Column.Parameter(opportunityId)) as Select;
double opportunityAmount = 0.0;
using (var dbExecutor = UserConnection.EnsureDBConnection()) {
	using (IDataReader dr = oppotrunityAmountSelect.ExecuteReader(dbExecutor)) {
		while (dr.Read()) {
			if(!dr.IsDBNull(0)){
				opportunityAmount += (double)UserConnection.DBTypeConverter.DBValueToDecimal(dr[0]);
			}
		}
	}
}
var update = new Update(UserConnection, "Opportunity")
		.Set("Amount", Column.Parameter(opportunityAmount))
		.Where("Id").IsEqual(Column.Parameter(opportunityId));
	update.Execute();

 

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

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

У страницы OpportunityPageV2 есть много версий в разных пакетах.

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

Я смотрел сразу через дебагер в chrome, что бы видеть все версии сразу

Не оно ли:

details: /**SCHEMA_DETAILS*/{
...
OpportunityProduct: {
	schemaName: "OpportunityProductDetailV2",
	filter: {
		masterColumn: "Id",
		detailColumn: "Opportunity"
	},
	subscriber: {methodName: "onOpportunityProductChanged"}
},
...
methods: {
 
/**
 * Reloads current record.
 * @private
 */
onOpportunityProductChanged: function() {
	this.loadEntity(this.get("Id"));
	this.sendSaveCardModuleResponse(this);
},

 

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

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

Нравится

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

День добрый! 

Скрипт по апдейту значений из продукта в заказе продуктов в счете (через график поставок и оплат) лежит в схеме OrderAmountHelper.

Удачи!

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

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

Нравится

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

Добрый день!

Абсолютно аналогичным образом.
Создайте новый ActionMenuItem в wnd_OpportunityWorkspace.

Код-пример для обработки нового действия продаж Вы можете взять из функции amiRecalcAmountOnExecute скрипта scr_InvoiceWorkspace.

Сама логика пересчета реализована в функции RecalcAmount того же скрипта.

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

В контекстном меню Счета в Действиях отсутствует опция "пересчитать сумму". Есть только "Сгенерировать номер". Как добавить "пересчитать сумму"? Версия 3.3.0.42 x15

Нравится

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

Т.е. в самом разделе в действиях он есть, а в контекстном меню грида нет? Или ни там ни там нет?

Ни там, ни там нет.

Тогда добавьте в окно раздела в меню, которое соответствует меню действий пункт amiRecalcAmount и повесьте на него

function amiRecalcAmountOnExecute(ActionMenuItem) {
    var Dataset = BaseWorkspace.GridDataset;
    if (IsDatasetEmpty(Dataset)) {
	    return;
	}
	Dataset.DisableEvents();
	try {
		var GridWindow = wndGridData.Window;
		var grdData = GridWindow.ComponentsByName('grdData');
		var ArrayIDs = GetArrayByCollection(grdData.SelectedIDs);
		var Passed = 0;
		for (var i = 0; i < ArrayIDs.length; i++) {
			var InvoiceID = ArrayIDs[i];
			Dataset.Locate('ID', InvoiceID);
 
			var CanUpdateInvoice =
				(GetCanUpdateTableGroup(Dataset)) &&
				(Dataset.GetCurrentRecordAccessLevel() == tfalFullAccess);
			if (!CanUpdateInvoice) {
				Passed++;
				continue;
			}
			RecalcAmount(InvoiceID);
		}
		var PassedMessage = '';
		if (Passed > 0) {
			PassedMessage = ' ' + "Пропущено %1 записей.";
			PassedMessage = FormatStr(PassedMessage, Passed);
		}
		var Message = "Выполнен пересчет для %1 записей." + PassedMessage;
		var Message = FormatStr(Message, ArrayIDs.length - Passed);
	    ShowInformationDialog(Message);
	} finally {
		Dataset.EnableEvents()
	}
}

Посмотрите, в скрипте раздела есть функция RecalcAmount?

Не могу найти раздел действий.
Где искал: Файл - Справочники - Настройка Справочников - Счет и там выбрал окно реестра (wnd_InvoiceGridArea).
Открывается Terrasoft Administrator, там захожу на невизуальные. На невизуальных есть amGrid и amDelete. Если добавлять элемент на amGrid, то действие добавиться в корень контекстного меню (не в действия).
Подскажите,пожалуйста, как правильно добраться до соотвествующего меню действий

Андрей, Вам необходимо добавить действие в сервис окна воркспейса wnd_InvoicesWorkspace.

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

Осваиваю функциональность TS CRM вер.3.2.1.4. Сегодня столкнулся с ситуацией, набор продуктов в счете есть, сумма по продуктам считается, но попытка пересчитать сумму дает стабильно 0.00, вопрос куда смотреть?
Я раньше я сделал несколько счетов, начал по классической технологии -
1. Создал договор.
2. Созадал счет.
3. Набрал продукты в счет.
4. Нажал кнопку пересчет суммы.
самый первый счет тоже страдал аналогичной болезнью, я его удалил. Сделал заново, все сработало нормально, думал, може че не туда ткнул по неопытности... Потом два счета сделал, все отработало предсказуемо, а сегодня начал делать счет - опять 0-сумма. Я грешил на то что попробовал счет просто без договора создать, удалил его, создал договор, на детали счета добавил счет, добавил туда продукты и опять сумма -0.0 если надо могу скрин экрана прислать...

Нравится

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

Добрый день, Руслан!
1. Наличие значения в поле "Договор" карточки Счета на результат пересчета суммы не влияет.
2. Пересчет суммы означает:
а) суммирование значений поля "Итого (б.в.)" записей на детали Продукты в разделе счета,
б) помещение результата в поле "Сумма (б.в.)" для текущей записи в разделе Счета,
в) и вычисление значения поля "Сумма" исходя из значений полей "Сумма (б.в.)" и "Курс валюты" для текущей записи в разделе Счета.

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

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

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