Скрипты для обработки прайсов в Прайсматрикс

Общая информация

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

Например:

  • габариты товара поставщик предоставляет в прайс листе одной строкой вида 433/66/38 , это ширина/высота/длина. И нужно это разделить на три параметра соответственно
  • сформировать строку вида артикул+бренд для построения связей по этой строке
  • отредактировать имя товара вида: Брюки сварщика Brodeks FS38-01, т.синий/черный (46), убрав текст в скобках у всех товаров
  • и много других частных случаев, которые актуальны для конкретного поставщика или продавца.

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

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

Язык программирования скриптов - JavaScript.

Скрипт запускается после загрузки данных от поставщика (неважно каким способом) перед сохранением продукта в Прайсматрикс.

Где настраиваются скрипты?

Все зависит от того, на каком этапе вам нужно поменять данные:

1. В конкретном прайсе поставщика (если нужно поправить данные только этого файла до сохранения в систему).
Переходим в нужный прайс поставщика → заходим в Свойства → ищем поле JavaScript Скрипт перед сохранением продукта → нажимаем Открыть в редакторе.

Скрипт в прайсе поставщика
2. В Главном Прайсе (если нужно изменить правила для всего вашего каталога).
Переходим в Функции → Обновить цены и остатки главного прайса → кликаем на Скрипт после обновления JS open in editor.
Обратите внимание: этот скрипт срабатывает уже ПОСЛЕ переоценки. То есть Прайматрикс сначала пересчитывает все цены и остатки, и только потом поверх них запускает ваш код.

Скрипт в Главном прайсе

Как проверить и сохранить скрипт

Чтобы убедиться, что код работает корректно и не ломает данные, обязательно протестируйте его перед сохранением:

  1. Загружаем тестовый товар (блок 1):
    Впишите артикул товара из вашего прайса и нажмите кнопку Загрузить. Справа отобразятся его исходные данные (например, текущая цена).
  2. Вставляем скрипт и запускаем тест (блок 2):
    Вставьте ваш JS-скрипт в редактор слева и нажмите кнопку Тестировать.
  3. Проверяем результат (блок 3):
    Внизу в окне Log отобразится ход выполнения скрипта, а в правом нижнем блоке - итоговый JSON товара с обновленными значениями.
  4. Сохраняем (блок 4):
    Если логи и результат в порядке, нажмите Сохранить в левом верхнем углу.

Как проверить и сохранить скрипт

Основные поля товара, с которыми будем работать

Вот самые частые названия параметров (полей), которые вы будете менять или использовать в условиях:

Поле в коде За что отвечает Поле в коде За что отвечает
product.Name Название товара product.BarCode Штрихкод
product.Sku Артикул product.Height Высота
product.SkuParent Родительский артикул product.Width Ширина
product.MPN Артикул завода product.Depth Глубина / Длина
product.Price Продажная цена product.Weight Вес
product.PriceOld Старая цена product.Manufacturer Бренд / Производитель
product.RRP РРЦ product.Description Полное описание
product.WholesalePrice Закупочная цена product.ShortDescription Короткое описание
product.Qty Количество (остаток) product.ExternalId Внешний ID

Примеры готовых решений под частые задачи

Обнулить остатки всех товаров

Полезно, если нужно временно скрыть позицию или пересчитать с нуля.

product.Qty = 0;

Обнулить остатки только для конкретной категории

Например, нужно занулить все товары в категории "Батарейки->Батарейки (тип C)":

console.log("Qty on start:" + product.Qty);
for(var i = 0 ; i < product.CategoriesFullPaths.length; i++)
{
var c = product.CategoriesFullPaths[i];
console.log("cat path:" + c);
if (c == "Батарейки->Батарейки (тип C)")
{
product.Qty = 0;
}
}
console.log("Qty on finish:" + product.Qty);

Если остаток от поставщика = 10, сделать у меня остаток = 1

console.log("product.Qty ДО : " + product.Qty);
if (product.Qty === 10) {
product.Qty = 1;
}
console.log("Результат product.Qty: " + product.Qty);

Накинуть доставку  на итоговую цену

Цену доставки грузим в любое свободное поле, в нашем случае это PriceOld, складываем еt с основной ценой и очищаем временно занятую ячейку:

if (product.PriceOld) {
  product.Price += product.PriceOld;
  product.PriceOld = 0;
}

Рассчитать стоимость товара в зависимости от Объемного веса

Сначала считаем объемный вес, и если он больше 100 - увеличиваем цену:

product.WeightVolume = (product.Height * product.Width * product.Depth) / 1000000;

if (product.WeightVolume > 100) {
  product.Price *= 1.15;
}

Добавить бренд к названию товара

console.log("старое имя товара: " + product.Name);
if (product.Manufacturer) {
  product.Name = product.Name + " " + product.Manufacturer;
}
console.log("новое имя товара: " + product.Name);

Убрать из названия все, что написано в круглых скобках

Превратит "Брюки (размер 46)" в просто "Брюки":

if (product.Name) {
  product.Name = product.Name.replace(/[^)]+/g, '').trim();
}

Обрезать слишком длинное название (например, до 100 символов)

if (product.Name && product.Name.length > 100) {
  product.Name = product.Name.substring(0, 100);
}

Рассчитать Объемный вес

product.WeightVolume = product.Height*product.Width*product.Depth/10000;
console.log("Объемный вес = " + product.WeightVolume);

Разделить габариты на Высоту, Ширину, Глубину

К примеру, вот такую строку "1.4/31.3/6.1" нужно разделить на составляющие - Высота, Ширина, Глубина.
Для решения этой задачи габариты загружаем в поле Code. И уже поле Code с помощью скрипта разбиваем на части.

if (product.Code) {
  var parts = product.Code.split('/');
  product.Height = parts[0];
  product.Width = parts[1];
  product.Depth = parts[2];
}

Очистить поле Родительский артикул (SkuParent)

product.SkuParent = "";

Очистить поле Внешний ID (ExternalId)

Когда нужно обновление делать по артикулу по какой то причине, актуально для Мойсклад, insales, маркетплейсов.

product.ExternalId = "";

Оставить только первую картинку (остальные удалить)

if (product.Images && product.Images.length > 1) {
for (var i = product.Images.length - 1; i >= 1; i--) {
product.Images.RemoveAt(i);
}
}

Добавить расширение .png к ссылке на фото

product.Images[0].OriginalUrl = product.Images[0].OriginalUrl + ".png";
console.log(product.Images[0].OriginalUrl);

Получить значение характеристики

const minOrderFeature = product.FeatureValueGet("Минимальная партия");

Создать новую характеристику

product.FeatureAdd("цвет", "красный")

Первое значение в скобках - это название характеристики,
второе значение - значение характеристики.

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

Например, заменяем кривое название "Высота общая" на понятное "Высота":

if (product.Features) {
  for (var i = 0; i < product.Features.length; i++) {
    if (product.Features[i].Name === "Высота общая") {
      product.Features[i].Name = "Высота";
    }
  }
}

К значению характеристики добавить название товара

const features = product.Features;
function  findFeatureByName(features, name) {
const feature = features.find(item => item.Name === name);
return feature;// ? feature.Value : null;
}
const nameToFind = "Размер";
let f = findFeatureByName(features, nameToFind);
if (f)
{
f.value = f.value + " " + product.Name;
}

Удалить мусорные характеристики со значением #NULL!

if (product.Features) {
  var count = product.Features.Count || product.Features.length;
  for (var i = count - 1; i >= 0; i--) {
    if (product.Features[i].Value === "#NULL!") {
      product.Features.RemoveAt(i);
    }
  }
}

Скрипт для Обновления ГП, который ищет по связям поставщика "Поставщик_1" и копирует его остаток в Qty2

var refs = ReferencesHelper.ReferedProductsForMainProduct(Database, product);
var t = JsonConvert.SerializeObject(refs);

product.Qty2 = 0;
for(var i = 0 ; i < refs.Count;i++)
{
var ref = refs[i];
t = JsonConvert.SerializeObject(ref);

if (ref.PriceName == "Поставщик_1")
{
product.Qty2 = ref.Quantity;
console.log("Qty2 was set to " + product.Qty2);
}
}

Скрипт для Обновления ГП, который складывает остатки всех связанных поставщиков

var refs = ReferencesHelper.ReferedProductsForMainProduct(Database, product);
var t = JsonConvert.SerializeObject(refs);

product.Qty = 0

for (var i = 0; i < refs.Count; i++) {
var reference = refs[i];
t = JsonConvert.SerializeObject(reference);
var refProd = Product.LoadFlat(Database, reference.ProductId);
trefProd = JsonConvert.SerializeObject(refProd);

product.Qty += refProd.Qty;

console.log("Qty now is " + product.Qty);
}

Как написать скрипт с помощью ChatGPT

Если вы не владеете JavaScript, можно попросить ChatGPT подготовить скрипт для вашей задачи. Чем подробнее вы опишете исходные данные и желаемый результат, тем проще будет получить подходящий код.

Как правильно сформулировать запрос

Укажите:

  • Что нужно изменить: название, артикул, цену, остаток, характеристики или другое поле.
  • В каком поле находятся исходные данные.
  • Как должен выглядеть результат.
  • Нужно ли учитывать условия и исключения.
  • Где будет запускаться скрипт: в прайсе поставщика или при обновлении Главного прайса.

Пример запроса

"Напиши JavaScript-скрипт для Прайсматрикс. Задача: есть название товара в поле product.Name и бренд в поле product.Manufacturer. Нужно добавить бренд в конец названия через дефис. Если бренд отсутствует, название не изменять. Добавь вывод исходного и итогового названия в лог. "

После получения кода:

  1. Скопируйте его в редактор скриптов Прайсматрикс.
  2. Запустите тестирование.
  3. Проверьте выходные данные и лог.
  4. Если возникла ошибка, передайте ChatGPT полный текст ошибки и уточните, что скрипт запускается в Прайсматрикс.
  5. Сохраните код только после проверки результата.

Примеры использования ChatGPT при создании скриптов:

Как написать скрипт с помощью ChatGPT

Готовый пример загрузки из API поставщика

Посмотрите также пример создания скрипта для загрузки данных из API поставщика Svarog RF:

Пишем скрипт с помощью ИЛИ: загрузка из API поставщика Svarog RF

Нужна помощь со скриптом?

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

Свяжитесь с поддержкой Прайсматрикс, если у вас появились вопросы.