Обновление прайс-листа в соответствии с курсом валюты

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

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

Нравится

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

Здравствуйте, Алексей!
Такой функционал реализован в версии 3.5.2.
Могу выслать метод, реализующий пересчет цены.

Андрей, можете и мне выслать.

Т.е. при изменении курса валют в справочнике автоматически пересчитывается базовая цена в карточке продукта и соответствующие цены в прайс листах?

Спасибо!

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

К сожалению, у нас версия 3.3.2
Если не сложно - вышлите, пожалуйста. Вы меня очень выручите.

Здравствуйте!
В 3.5.2 пересчет реализовано действие, по которому вызывается следующая функция:

function amiRecalcOfferingPriceOnExecute(ActionMenuItem, Sender) {
	if (BaseWorkspace.Grid.SelectedIDs.Count == 0) {
		return;
	}
	var OfferingIDs = GetArrayByCollection(BaseWorkspace.Grid.SelectedIDs);
	var CurrentDate = GetLocalDate();
	RecalcOfferingPrices(CurrentDate, OfferingIDs, 'IDs');
}

, где

function RecalcOfferingPrices(CurrentDate, SelectedIDs, FilterName) {
	var RecordsCount = SelectedIDs.length;
	if (RecordsCount == 0) {
		ShowWarningDialog("Не выбрано ни одной записи");
		return;
	}
	var OfferingDataset = GetSingleItemByCode('ds_Offering', 'RecalcOfferingPrices');
	EnableDatasetFields(OfferingDataset, false);
	EnableDatasetFields(OfferingDataset, true, ['ID', 'CurrencyID', 'Rate']);
	ApplyDatasetIncludeFilter(OfferingDataset, 'IDs', SelectedIDs, true);
	OfferingDataset.Close();
	OfferingDataset.Open();
 
	var PriceCategoryDataset = GetSingleItemByCode('ds_PriceCategory', 'RecalcOfferingPrices');
	EnableDatasetFields(PriceCategoryDataset, false);
	EnableDatasetFields(PriceCategoryDataset, true, ['ID', 'IsBase', 
		'PriceCalcMethodID', 'Name', 'DiscountPercent', 'CurrencyID']);
	ApplyDatasetFilter(PriceCategoryDataset, 'IsDefault', true, true);
	PriceCategoryDataset.Close();
	PriceCategoryDataset.Open();
 
	var OfferingID;
	var PriceCalcMethodID;
	var PrimeCost;
	var PriceCategoryID;
	OfferingDataset.GotoFirst();
	while (!OfferingDataset.IsEOF) {
		OfferingID = OfferingDataset('ID');
		PriceCategoryDataset.GotoFirst();
		while (!PriceCategoryDataset.IsEOF) {
			PriceCategoryID = PriceCategoryDataset('ID');
			PriceCalcMethodID = PriceCategoryDataset('PriceCalcMethodID');
			PrimeCost = GetOfferingPrimeCost(OfferingID, PriceCalcMethodID) *
				(1 + PriceCategoryDataset('DiscountPercent') / 100);
 
			if (!IsZeroValue(PrimeCost)) {
				var OfferingPriceObject = GetOfferingPriceData(OfferingID, 
					CurrentDate, PriceCategoryID, true);
				var Dataset = OfferingPriceObject.Dataset;
				if (IsEmptyValue(OfferingPriceObject.ID) ||
					GetDateDiff(OfferingPriceObject.StartDate, CurrentDate) != 0) {
					OfferingPriceObject.PriceKindID = opk_PriceList;
					OfferingPriceObject.PriceCategoryID = PriceCategoryID;
					OfferingPriceObject.PriceCategoryName = PriceCategoryDataset('Name');
					if (IsEmptyValue(OfferingPriceObject.ID)) {
						OfferingPriceObject.CurrencyID = PriceCategoryDataset('CurrencyID');
					}
					OfferingPriceObject.Rate = GetCurrencyRate(
						OfferingPriceObject.CurrencyID, CurrentDate, false);
					OfferingPriceObject.StartDate = CurrentDate;
					OfferingPriceObject.DueDate = CurrentDate;
					OfferingPriceObject.ID = null;
					FillOfferingPriceObjectDefault(OfferingPriceObject, CurrentDate);
					OfferingPriceObject.IsPriceWithTaxCalc = false;
				}
 
				OfferingPriceObject.BasicPrice = PrimeCost;
				OfferingPriceObject.Price = RoundFloatValue(CalcNonBasicPrice(
					OfferingPriceObject.BasicPrice, OfferingPriceObject.CurrencyID, 
					OfferingPriceObject.Rate), 2);
				OldIsPriceWithTaxCalc = OfferingPriceObject.IsPriceWithTaxCalc;
				OfferingPriceObject.IsPriceWithTaxCalc = false;
				OfferingPriceDataChange('Price', OfferingPriceObject.Price,
					OfferingPriceObject);
				OfferingPriceObject.IsPriceWithTaxCalc = OldIsPriceWithTaxCalc;
 
				if (IsEmptyValue(OfferingPriceObject.ID)) {
					AppendOfferingPriceByObject(OfferingID, OfferingPriceObject);
				} else {
					Dataset.Edit();
					CopyOfferingPriceObjectToDataset(OfferingPriceObject, Dataset);
					Dataset.Post();
				}
			}
 
			PriceCategoryDataset.GotoNext();
		}
		OfferingDataset.GotoNext();
	}
}

Адаптацию под свои версии предлагаю Вам сделать самостоятельно.

Здравствуйте!
Оказалось, такая функция реализована ещё в 3.3.2.290 в действиях над продуктами
(раздел "Продукты" ->"Действия ->"Пересчитать и добавить новые цены по прайс-листам").
В любом случае - Андрей, спасибо Вам! :twisted:

Алексей, действительно, не подумал, что надо в Distribution смотреть.
Всегда пожалуйста!

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