Що писати у формулі поля прайсу: макроси, функції, приклади

10 хв

Формула поля прайсу збирає значення з інших полів: колонок прайсу, вашого каталогу, картки постачальника, курсу валют. Тут — що можна підставити у вираз, які функції працюють, готові приклади і що буде з результатом у полі.

Коли це знадобиться:

  • Не знаєте, як звернутися до поля — макрос із довідника «Поля для формул» вставляється подвійним кліком.
  • Ціна в доларах — макрос курсу підставляє курс разом із націнкою до курсу з довідника валют.
  • Значення береться з каталогу — обгортка IFNULL не дасть обнулити незіставлені товари.
  • Потрібна знайома задача — готові формули для РРЦ, назви, артикула й «дев'яток» вставляються як є.

З чого почати: звідки формула бере значення.

Що є в довіднику

Де це і хто має доступ

Вікно
«Формули для полів» → кнопка «Поля для формул» над редактором
Право доступу
право «Формули для полів» у правах груп

Як створити формулу, запустити її й перевірити на одному товарі — Як заповнювати поля прайс-листа формулою.

Звідки формула бере значення

З чого почати, залежить від того, звідки братиметься значення.

Макрос виглядає як назва поля у фігурних дужках із префіксом: {Прайс: Ціна}. Префікс — це відповідь на питання «звідки брати».

ПрефіксЩо підставляєСкільки полів доступно
{Прайс: …}поле цього ж товару з прайсу102
{Товар БК: …}поле зіставленого товару вашого каталогу171
{Контрагент: …}поле картки постачальника, чий це прайс156
{Атрибут прайс: …}значення характеристики, яка прийшла в прайсіза переліком характеристик
{ПрайсКонкурентівТП: …}поле товару на сайті торгового майданчикатільки всередині блокового макроса

Довідник полів відкривається кнопкою «Поля для формул». У ньому чотири колонки — «Поле», «Група», «Макрос» і «Код», — а рядки згруповані за колонкою «Група», щоб не шукати ціну серед характеристик. Клік по рядку показує опис поля внизу, подвійний клік вставляє макрос у формулу.

Довідник полів для формул із колонками «Поле», «Група», «Макрос», «Код»
1Стовпець «Макрос» зі значенням у фігурних дужках
2Підказка про подвійний клік для вставки макросу
  1. У колонці «Макрос» вказано код підстановки в фігурних дужках, який вставляється у формулу.
  2. Підказка над списком пояснює: клік по рядку показує опис поля внизу, подвійний клік вставляє макрос у редактор формули.

Старі формули з російськими назвами полів — {Прайс: Цена} замість {Прайс: Ціна} — працюють і далі: програма розпізнає назву будь-якою з увімкнених мов. Переписувати їх не треба. Подвійний клік у довіднику вставляє назву тією мовою, якою у вас інтерфейс.

Поля самого прайсу і картки постачальника

Найчастіший випадок: усе потрібне вже є в рядку, просто не в тому полі. Ціна є, а рекомендованої немає — рахуємо її від ціни. Назви немає, а бренд і модель є — склеюємо. Артикул є, але з нулями попереду — обрізаємо.

Поля картки постачальника доступні тим самим способом, з префіксом {Контрагент: …}. Це стає в пригоді, коли значення однакове для всього прайсу й уже записане в картці контрагента, — тоді його не треба дублювати в кожній формулі.

Як узяти значення з каталогу, курсу валюти чи чужого прайсу

Поля товару вашого каталогу

Макрос {Товар БК: …} бере значення з картки товару вашого каталогу — того, з яким зіставлено рядок прайсу. Так, наприклад, підставляють у прайс ваш власний артикул виробника замість того, що надіслав постачальник.

Це працює тільки для тих рядків, у яких з каталогом уже зроблено.

У незіставленого товару поля каталогу порожні, і формула перезапише приймач порожнім значенням.

Як цього уникнути — у розділі про порожнє значення; як зіставити товари — Зіставлення товарів прайсу з каталогом.

Є і друга умова, про яку згадують рідше: формули мають рахуватися після зіставлення, а не до нього. Порядок дій усередині одного завантаження задається окремо — у порядку операцій. Якщо формули стоять там раніше за зіставлення товарів, макрос {Товар БК: …} відпрацює на ще не зіставлених рядках і запише порожнє значення, хоча зіставлення через крок таки відбудеться.

Курс валюти

Курс підставляється окремим макросом виду {CURRENCY_RATE_USD}, де останні три літери — код валюти з довідника валют. У формулі це звичайне число, на яке можна множити або ділити.

Якщо у валюти в довіднику заповнено націнку до курсу, підставиться курс уже з нею — не той, що показує банк.

Значення з прайсу іншого постачальника

Для цього є блокові макроси — вони пишуться у подвійних квадратних дужках і всередині містять звичайний макрос поля.

  • [[FromContractor_N{Прайс: Ціна}]] — бере значення того самого товару з прайсу контрагента з номером N.
  • [[ОтГруппыКонтрагента_1 MIN(IF({Прайс: Цена}=0, NULL, {Прайс: Цена}))]] — бере значення від цілої групи контрагентів. Усередині такого блока дозволені підсумкові функції: у цьому прикладі береться найменша ненульова ціна по групі.
  • [[ОтКонкурентаТПСтрока_N{ПрайсКонкурентовТП: Цена}]] — значення з N-ї за зростанням пропозиції на торговому майданчику.

Усі три є в довіднику полів: «Взяти значення від зазначеного контрагента», «Взяти значення від групи контрагентів» і «Взяти значення з рядка прайсу конкурента». Довідник вставляє їх латиницею — FromGroupContractor_N, RowFromCompetitorTP_N; обидва написання працюють однаково.

Що можна писати у формулі

Формула — це один вираз, який дає одне значення. Не послідовність кроків, не «спочатку зроби те, потім те». Якщо потрібні два кроки, робіть дві формули й розставляйте їм порядок.

Гарантований набір функцій зібраний у довіднику полів, і подвійний клік вставляє готовий шаблон.

Назва в довідникуЩо вставляєтьсяЩо робить
Логічна умова CASECASE {поле} WHEN 'books' THEN 'New Books' … ELSE '' ENDкілька варіантів значення на вибір
Логічна умова IFIF(умова, значення_якщо_так, значення_якщо_ні)розвилка на два варіанти
Об’єднання рядківCONCAT_WS(" ", "Рядок1", "Рядок2", …)склеює значення, перший параметр — роздільник між ними
Округлення числа у велику сторонуCEIL(число)CEIL(1.23) дає 2
Округлення числа в меншу сторонуFLOOR(число)FLOOR(1.23) дає 1
Округлення числа з десятковими знакамиROUND(число, 1)ROUND(1.298, 1) дає 1.3
Відсікання від кількості десяткових знаківTRUNCATE(число, 2)TRUNCATE(1.2100743, 2) дає 1.21

Крім них, працюють і інші функції роботи з текстом і числами — у живих базах зустрічаються заміна фрагмента тексту, обрізання пробілів і нулів, пошук підрядка. Але це вже на свій ризик: у довіднику їх немає, і помилка в написанні означає, що формула не виконається зовсім.

Чого писати не можна

Підсумкові функції прямо у виразі — MIN, MAX, SUM, AVG, COUNT. Формула рахується для кожного товару окремо, підсумовувати їй нема чого, і такий вираз не виконається. Підсумки дозволені лише всередині блокового макроса від групи контрагентів.

Формула приймає лише дозволені функції:

  • математика — ROUND, CEIL, FLOOR, GREATEST…;
  • умови — IF, CASE, IFNULL;
  • текст — CONCAT, REPLACE, SUBSTRING, TRIM, REGEXP_REPLACE…;
  • дата — CURDATE, NOW, DAYOFWEEK, DATE_ADD….

Будь-яка інша функція, а також слова SELECT, UNION, INTO, VALUES, TABLE, WITH вимикають формулу: програма її пропускає, поле не змінюється, решта формул застосовується. Пропущена формула потрапляє до вікна «Помилки у формулах», а під час завантаження прайсу — рядком «Формулу пропущено…» в «Журнал операцій».

Текст у лапках не перевіряється, тож CONCAT({Прайс: Найменування}, " (select)") працює.

Готові приклади

Це формули з довідки продукту й із живих налаштувань. Їх можна вставляти як є, замінивши назви полів на свої.

Що потрібноФормула
Зменшити ціну на 12 %{Прайс: Ціна} - ({Прайс: Ціна} * 12) / 100
Порахувати відсоток прибутку(({Прайс: Ціна} - {Прайс: Ціна собівартість}) / {Прайс: Ціна}) * 100
Не продавати дорожче за рекомендовану цінуIF({Прайс: Ціна} > {Прайс: Ціна РРЦ} AND {Прайс: Ціна РРЦ} > 0, {Прайс: Ціна РРЦ}, {Прайс: Ціна})
Прибрати нулі на початку артикулаTRIM(LEADING '0' FROM {Прайс: Артикул виробника})
Прибрати назву бренда з категорії постачальникаTRIM(REPLACE({Прайс: Категорія з прайсу}, CONCAT('/ ', {Прайс: Виробник}), ''))
Рекомендована ціна мінус 5 %, а якщо її немає — звичайна цінаCASE WHEN {Прайс: Ціна РРЦ} > 1 THEN {Прайс: Ціна РРЦ} - ({Прайс: Ціна РРЦ} * 5) / 100 ELSE {Прайс: Ціна} END
Зібрати назву з виробника й артикулаCONCAT({Прайс: Виробник}, ' ', {Прайс: Артикул виробника})
Собівартість плюс 4 %, округлити до цілогоROUND({Прайс: Ціна собівартість} * 1.04, 0)
Зробити, щоб ціна закінчувалася на 9 (у копійках)CEIL({Прайс: Ціна}) - 0.01
Зробити, щоб ціна закінчувалася на 9 (у цілих)FLOOR({Прайс: Ціна} / 10) * 10 + 9
Скопіювати артикул із картки каталогу{Товар БК: Артикул виробника}

Два приклади з дев'ятками роблять різне. Перший піднімає ціну до найближчого цілого й забирає копійку: 248,30 стає 248,99. Другий округлює до десятків і ставить дев'ятку в кінець: 248 стає 249, а 251 — теж 249, тобто ціна може й впасти.

На дешевих товарах друга формула здатна з'їсти помітну частину націнки, тож перевіряйте результат на найдешевшій позиції прайсу, а не на середній.

Зверніть увагу на перевірку > 1 у прикладах із рекомендованою ціною. Вона потрібна саме тому, що товарів без РРЦ у прайсі зазвичай більшість, і без перевірки їхня ціна перетворилася б на нуль.

Як формула заповнює характеристики, фото й назву

Два поля-приймачі поводяться не так, як решта, і про це варто знати до того, як формула виконається. Сюди ж належить прапорець у списку формул, який має сенс лише для одного поля.

Характеристика товару

Коли приймачем обрана характеристика, значення записується в характеристику товару, а не в його рядок. Якщо у товару такої характеристики ще не було, програма створює її сама — тобто формула не тільки заповнює значення, а й додає товарам характеристику, якої постачальник не надсилав.

Нової характеристики в довіднику формула не створює: приймачем можна обрати тільки наявну. Ще дві умови:

  • якщо в характеристики немає назви мовою інтерфейсу, формула заповнить її лише в тих товарах прайсу, де вона вже була;
  • характеристика додається тільки товарам, що проходять умову застосування формули.

Це дані прайсу: у картки вашого каталогу вони потрапляють, як інші поля прайсу, — через оновлення базового каталогу.

Посилання на фото

Поле «Посилання на фото товару» обробляється двічі: результат потрапляє і в саме поле, і до переліку фотографій товару. Після цього однакові посилання прибираються, тож повторний прогін не наплодить дублів одного знімка.

Прапорець «Оновлювати ключ унікальності товару»

Цей прапорець стоїть у кожному рядку списку, але працює тільки для поля найменування. Для решти полів він не робить нічого.

Навіщо він потрібен: за назвою товару програма впізнає, що це той самий товар, який приходив минулого разу. Якщо формула переписує найменування, ключ упізнавання «поїде», і при наступному завантаженні той самий товар вважатиметься новим. Прапорець змушує програму перерахувати ключ одразу після формули — і впізнавання не ламається.

Підказка у вікні каже прямо: «Ключ унікальності товару перераховується лише за формулою поля «Найменування» — на інших полях ця галочка нічого не змінює.» Без прапорця ключ лишається порахованим із назви з файла. Вмикайте прапорець одразу разом із формулою і не перемикайте його в робочого прайсу. Той самий прапорець є у вікні формул полів каталогу.

Як округлюється результат

Результат округлюється тільки в полів-цін — тими самими перемикачами «Округляти вгору» й «Округляти вниз», що й ціна після націнки; коли обидва вимкнені, ціна округлюється до копійок. Налаштування спільні: змінивши їх заради формули, ви зміните й підсумкові ціни всіх прайсів. Детальніше: Округлення і кратність ціни.

Текстові поля й поля з дробовими числами, які не є цінами, не округлюються взагалі. Потрібне округлення в такому полі — робіть його функцією ROUND усередині формули.

Як не обнулити поле порожнім значенням

Порожнє порожньому не рівня, і різниця тут коштує даних.

  • Порожня колонка прайсу — це порожній рядок або нуль. Склейка з нею виживе: CONCAT({Прайс: Виробник}, ' ', {Прайс: Артикул виробника}) у товара без виробника дасть артикул із пробілом попереду.
  • Значення немає зовсім — товар не зіставлений із каталогом, ділення пішло на нуль, блоковий макрос нічого не знайшов. Тоді порожнім стає весь вираз, скільки б у ньому не було інших операндів.

Такий результат не залишає поле як було, а обнуляє його. У числове поле й у поле ціни ляже нуль, у текстове — порожній рядок. Ділення на нуль поводиться так само: жодної помилки, просто нуль у полі.

Найчастіше на це наражаються з формулою {Товар БК: …} на прайсі, де зіставлено не всі товари. Зіставлені отримають значення з каталогу, а всі інші — нуль або порожній рядок замість того, що в них було. Причому «того, що було» вже ніде немає: відкату у формул не передбачено.

Захист — перевірка всередині формули, але писати її треба уважно. Напрошується варіант «якщо порожньо, то взяти з прайсу»:

IF({Товар БК: Артикул виробника} = "", {Прайс: Артикул виробника}, {Товар БК: Артикул виробника})

Так робити не можна. Ця перевірка рятує тільки зіставлений товар, у якого поле каталогу порожнє. На незіставленому значення не порожнє, а відсутнє, і порівняння не дає ні «так», ні «ні»: формула йде в другу гілку й знову бере з каталогу. Рецепт мовчки обнуляє рівно ті рядки, заради яких його писали.

Робочий варіант відрізняється однією обгорткою — IFNULL, яка підставляє порожній рядок замість відсутнього значення:

IF(IFNULL({Товар БК: Артикул виробника}, "") = "", {Прайс: Артикул виробника}, {Товар БК: Артикул виробника})

Читається так: якщо артикула в каталозі немає або він порожній — залишити артикул із прайсу, інакше взяти з каталогу. Прогін на прайсі зі 160 позицій, де зіставлено 64: перший варіант обнулив 96 рядків, другий — жодного.

Для цін обгортка не потрібна — там ловлять інше: перевірка > 1 або > 0 перед тим, як щось на це число ділити.

Часті запитання

Старі формули з російськими назвами полів треба переписувати?

Ні. {Прайс: Цена} і {Прайс: Ціна} працюють однаково: програма розпізнає назву будь-якою з увімкнених мов (макроси).

Чи можна писати десяткове число через кому?

Ні, лише через крапку: * 1.1. З комою програма прочитає два різні числа, формула не виконається й потрапить до вікна «Помилки у формулах».

Як узяти найменшу ціну серед кількох постачальників?

Блоковим макросом від групи контрагентів: усередині нього дозволені MIN та інші підсумкові функції (значення з прайсу іншого постачальника).

Чому в незіставлених товарів поле стало порожнім?

Формула брала значення з каталогу, а в незіставленого товару його немає — і порожнім став увесь вираз. Оберніть макрос каталогу в IFNULL (робочий варіант).

Чи можна формулою заповнити характеристику товару?

Так, характеристики є в списку полів-приймачів нарівні зі звичайними полями. Якщо у товару такої характеристики не було, програма створить її сама (характеристики й фото).

Якщо я змінюю найменування формулою, ключ унікальності товару перераховується?

Так, якщо в цій формулі увімкнено прапорець «Оновлювати ключ унікальності товару». Без нього ключ лишається порахованим із назви з файла, і товар при наступному завантаженні вважатиметься новим (прапорець).

Суміжні теми

Чи була стаття корисною?