Привет. Подскажите, есть ли готовое приложение, которое расширяет возможности прайс листов?

печать прайс-листа по шаблону, с фильтрами на определённую дату, по определённым продуктов, и т.д.

Нравится

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

Александр,

 

Спасибо за обращение!

 

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

 

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

 

С уважением,

Анастасия

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

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

В Sales в разделе Заказы есть подбор продуктов. Стандартная логика позволяет в карточке контрагента в поле прайс-лист выбрать прайс-лист и тогда, при подборе товаров в заказ будет видна цена согласно этого прайс-листа. Система как-то пробрасывает его туда. Я бы хотел подменить эту логику на передачу туда прайс-листа из карточки самого заказа (я поле создал справочное). Где искать? Какой метод подменить или использовать?

Нравится

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

Прайс-лист из таблицы контрагента используется в С#-схеме AccountPriceListPicker (там обычный Select), её вызывает тоже С#-схема веб-сервиса PriceListService:

/// <summary>
/// Get Price List using account. Took from account, if there is no Price List,
/// then took it from partnership
/// </summary>
/// <param name="accountId">Account identifier.</param>
/// <returns>PriceList identifier</returns>
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
	ResponseFormat = WebMessageFormat.Json)]
public Guid GetPriceList(Guid accountId) {
	var priceListPicker = ClassFactory.Get<IPriceListPicker>(new ConstructorArgument("userConnection",
UserConnection));
	var	preSetPriceList = priceListPicker.GetPriceList(accountId);
	return preSetPriceList != default(Guid)
? preSetPriceList
: priceListPicker.GetPriceList(UserConnection.CurrentUser.AccountId);
}

А уже к нему обращаются из JS в странице заказа BaseOrderPage пакета Order:

/**
 * Sets predefined price list.
 * @protected
 * @virtual
 */
initializePredefinedPriceList: function() {
	if (this.isPredefinedPriceListsEnabled()) {
		this.$PredefinedPriceList = this.$Account && this.$Account.PriceList;
		if (this.isEmpty(this.$PredefinedPriceList)) {
			const config = this.getPriceListServiceConfig();
			this.callService(config, this.onPredefinedPriceListInitialized, this);
		}
	}
},
...
/**
 * Sets predefined price list.
 * @protected
 * @virtual
 */
initializePredefinedPriceList: function() {
	if (this.isPredefinedPriceListsEnabled()) {
		this.$PredefinedPriceList = this.$Account && this.$Account.PriceList;
		if (this.isEmpty(this.$PredefinedPriceList)) {
			const config = this.getPriceListServiceConfig();
			this.callService(config, this.onPredefinedPriceListInitialized, this);
		}
	}
},

 

 

Прайс-лист из таблицы контрагента используется в С#-схеме AccountPriceListPicker (там обычный Select), её вызывает тоже С#-схема веб-сервиса PriceListService:

/// <summary>
/// Get Price List using account. Took from account, if there is no Price List,
/// then took it from partnership
/// </summary>
/// <param name="accountId">Account identifier.</param>
/// <returns>PriceList identifier</returns>
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
	ResponseFormat = WebMessageFormat.Json)]
public Guid GetPriceList(Guid accountId) {
	var priceListPicker = ClassFactory.Get<IPriceListPicker>(new ConstructorArgument("userConnection",
UserConnection));
	var	preSetPriceList = priceListPicker.GetPriceList(accountId);
	return preSetPriceList != default(Guid)
? preSetPriceList
: priceListPicker.GetPriceList(UserConnection.CurrentUser.AccountId);
}

А уже к нему обращаются из JS в странице заказа BaseOrderPage пакета Order:

/**
 * Sets predefined price list.
 * @protected
 * @virtual
 */
initializePredefinedPriceList: function() {
	if (this.isPredefinedPriceListsEnabled()) {
		this.$PredefinedPriceList = this.$Account && this.$Account.PriceList;
		if (this.isEmpty(this.$PredefinedPriceList)) {
			const config = this.getPriceListServiceConfig();
			this.callService(config, this.onPredefinedPriceListInitialized, this);
		}
	}
},
...
/**
 * Sets predefined price list.
 * @protected
 * @virtual
 */
initializePredefinedPriceList: function() {
	if (this.isPredefinedPriceListsEnabled()) {
		this.$PredefinedPriceList = this.$Account && this.$Account.PriceList;
		if (this.isEmpty(this.$PredefinedPriceList)) {
			const config = this.getPriceListServiceConfig();
			this.callService(config, this.onPredefinedPriceListInitialized, this);
		}
	}
},

 

 

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

Существует задача создать автоматический бизнес-процесс для создания прайс-листа контрагента, который запускается после создания контрагента.
В моем представлении это БП на одно действие (создание –прайса), а условие можно задать в настройках автоматического запуска.
Я использую действие чтение /запись данных. Здесь возникает первый вопрос – какая разница между «чтение /запись» и «открытие окна»? И в том и в другом случае ми можем сохранить информацию.
Основная проблема – перенос ID контрагента и создание ID новой записи (прайса). Как я догадываюсь, здесь нужно использовать параметры действия и здесь я уже ничего не понимаю.
Описание в руководстве администратора очень скудное, а на форуме не нашла понятного мне пошагового объяснения.

Нравится

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

Наталия,

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

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

Что касается

"Фащук Наталия Тарасовна" написал:Основная проблема – перенос ID контрагента и создание ID новой записи (прайса).

пример есть здесь

Спасибо. Есть ли решение с помощью MS SQL?

Не понимаю я логики этих действий.
Объясните пожалуйста наглядно на моем примере.
Цель: создать БП с автоматическим запуском. После создания контрагента создание прайс-листа к нему (с деталей).
Буду очень признательна.

Наталия, пример реализации Вашей задачи:

1. Создать БП, состоящий из 3-х элементов:
Начало - элемент [Открытие окна] - Завершение

/system/files/21-01-2015_16-17-25.png

2. Создать в БП строковый параметр, который будет содержать идентификатор создаваемого контрагента:

/system/files/21-01-2015_16-22-46.png

Заполнение параметра реализовать в теле функции обработки события OnStart начального элемента.
Код:

function Item1OnStart(StartItem) {
    var ParentDiagram = GetDiagramByItem(StartItem);
    var RecordID = WFGetParamValue(ParentDiagram, 'AutoID');
}

3. В моем примере создание прайс-листа для контрагента выполняется посредством элемента [Открытие окна]. Свойства окна:

/system/files/21-01-2015_16-28-04.png

Код окна, которое будет открываться на добавление прайс-листа - wnd_AccountPriceEdit

4. Настроить автоматический запуск БП (через Файл - Настройки - Автоматический запуск процессов).

Во вложении прилагаю БП, который я построила для примера.

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

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

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

Нравится

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 смотреть.
Всегда пожалуйста!

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