прайс-лист

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

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

Нравится

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

Александр,

 

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

 

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

 

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

 

С уважением,

Анастасия

Показать все комментарии
прайс-лист
в
подборе
продуктов
заказ
Studio_Creatio_enterprise_edition
7.17

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

В 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 начального элемента.
Код:
[javascript]
function Item1OnStart(StartItem) {
var ParentDiagram = GetDiagramByItem(StartItem);
var RecordID = WFGetParamValue(ParentDiagram, 'AutoID');
}
[/javascript]

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

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

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

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

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

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

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

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

Нравится

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

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

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

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

Спасибо!

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

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

Здравствуйте!
В 3.5.2 пересчет реализовано действие, по которому вызывается следующая функция:
[javascript]
function amiRecalcOfferingPriceOnExecute(ActionMenuItem, Sender) {
if (BaseWorkspace.Grid.SelectedIDs.Count == 0) {
return;
}
var OfferingIDs = GetArrayByCollection(BaseWorkspace.Grid.SelectedIDs);
var CurrentDate = GetLocalDate();
RecalcOfferingPrices(CurrentDate, OfferingIDs, 'IDs');
}
[/javascript]
, где
[javascript]
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();
}
}
[/javascript]
Адаптацию под свои версии предлагаю Вам сделать самостоятельно.

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

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

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