Тема оформления
📖 Инструкция: Умные подстановки и форматирование при экспорте (APS Export)
TIP
Для кого эта инструкция: Для контент-менеджеров, маркетологов и администраторов интернет-магазинов, настраивающих выгрузки (экспорт) товаров на маркетплейсы (Авито, Дром, Яндекс.Маркет, Ozon, AliExpress).
Эта система позволяет автоматически приводить названия, описания, цены, фотографии и другие параметры к требованиям каждой конкретной площадки без изменения данных в базе.
⚡ 1. Шпаргалка быстрых решений (Cheat Sheet)
Ниже приведена таблица часто возникающих задач. Обратите внимание, что специальный разделитель | внутри фигурных скобок разделяет имя поля и правила его оформления.
| Ваша задача | Как написать в шаблоне | Что получится в итоге |
|---|---|---|
| Убрать HTML-теги и лишние пробелы | {detailcomment|@:striphtml:squish} | Чистый красивый текст без <p>, <b> и переносов |
| Ограничить длину заголовка (например, до 90 симв.) | {partname|@} {modelname|@} б/у[[fn:squish:truncate(90, '...')]] | "Двигатель для Toyota Camry в..." (жесткий лимит) |
| Сделать первую букву заглавной | {partname|@:cap} | "фара левая" ➡️ "Фара левая" |
| Сделать заглавной букву каждого слова | {modelname|@:title} | "toyota corolla" ➡️ "Toyota Corolla" |
| Заменить внутреннее значение на значение площадки | {price_season|@:map('Лето','летние','Зима','зимние')} | "Зима" ➡️ "зимние" |
| Взять резервное поле, если основное не заполнено | {oem|@:coalesce(catalognoplain, intnum)} | Пробует OEM ➡️ OEM2 ➡️ Инвентарный номер детали |
| Получить цену за одну штуку из комплекта из 4 шт. | {price|@:div(4):round(2)} | Делит цену комплекта на постоянное количество |
| Написать цену со скидкой и знаком рубля | {pricerec|@:numformat('### ###') ₽} | "15 500 ₽" (если цена 0 или пуста — вся строка скроется) |
| Выгрузить только передние целые фото детали | {photolinkpart(front,-damaged)|@} | Ссылки на фото с ракурсом front без брака |
🚀 2. Основы: Фигурные скобки и символ @
Все шаблоны строятся по следующему простому правилу:
text
{имя_переменной|шаблон_оформления}- Имя переменной (токен): указывает, какое поле взять (например,
partname,oem,year). - Шаблон оформления: то, как это значение показать. Внутри этого шаблона обязательно пишется символ
@— он указывает, куда именно вставить значение.
💡 Важное правило умного скрытия
Если значение переменной пустое, система автоматически скрывает весь блок в фигурных скобках, включая окружающий текст.
- Пример: Шаблон
{oem|Артикул: @}- Если OEM заполнен (
53301-12A30): получится"Артикул: 53301-12A30". - Если OEM пустой: в выгрузку не попадет ничего (даже слово "Артикул:"). Никаких пустых строк и мусора!
- Если OEM заполнен (
🔥 3. Новая супер-функция: Умная фильтрация фотографий по тегам
Если вы детально фотографируете товары и размечаете ракурсы или дефекты тегами, теперь вы можете выгружать на конкретные маркетплейсы только нужные фотографии!
Для этого используются специальные фото-токены с фильтрами в круглых скобках:
text
photolinkpart(теги) — для фотографий детали
photolinkcar(теги) — для фотографий машины-донораКак это работает:
- Выборка по тегу (включение):
{photolinkpart(front)|@}— выгрузит ссылки только на фотографии с тегомfront(например, вид спереди).{photolinkpart(front,side)|@}— выгрузит фотографии с тегомfrontилиside(логика «ИЛИ»).
- Исключение дефектов или ненужного (знак
-):{photolinkpart(-damaged)|@}— выгрузит все фотографии детали, исключая те, которые помечены тегомdamaged(повреждено).
- Совмещенный фильтр (включение + исключение):
{photolinkpart(front,back,-damaged)|@}— выгрузит только фото спереди и сзади, на которых нет повреждений (исключаяdamaged).
NOTE
Вы можете использовать разные фильтры тегов в разных полях одной и той же выгрузки. Система сама разберется в базах данных и сгенерирует уникальные неконфликтующие колонки!
🛠️ 4. Конвейер функций трансформации (Pipeline)
Иногда мало просто вставить значение, его нужно изменить. Для этого после символа @ вы можете написать одну или несколько функций через двоеточие : (последовательно слева направо):
text
@:функция1:функция2(аргумент)...📝 4.1. Преобразование текста и регистра
upper— ВСЕ БУКВЫ ЗАГЛАВНЫЕ.- Пример:
{partname|@:upper}➡️ДВИГАТЕЛЬ В СБОРЕ
- Пример:
lower— все буквы строчные.- Пример:
{producer|@:lower}➡️toyota
- Пример:
cap— Первая буква заглавная (идеально для названий).- Пример:
{partname|@:cap}➡️Амортизатор передний
- Пример:
title— Каждое Слово С Заглавной Буквы.- Пример:
{modelname|@:title}➡️Land Cruiser Prado
- Пример:
trim— Удалить случайные пробелы в начале и в конце.squish— Сжать множественные пробелы и переносы в один аккуратный пробел.striphtml— Удалить все HTML-теги.- Пример:
{detailcomment|@:striphtml}очистит текст от тегов<p>,<b>,<div>.
- Пример:
translit— Перевести русский текст в транслит (латиницу).- Пример:
{partname|@:translit}➡️Kapot
- Пример:
replace('что_заменить', 'на_что')— Замена текста.- Пример:
@:replace('оригинал','аналог')
- Пример:
map('исходное','результат', ...)— Сопоставление целого значения по списку пар. Сравнение не учитывает регистр и пробелы по краям; если подходят несколько ключей, используется первая пара. Неизвестное значение и некорректный нечётный список пар остаются без изменений.Пример для внешнего прайса:
text{price_season|@:map( 'Всесезонная','всесезонные', 'Летняя','летние', 'Лето','летние', 'Зимняя липучка','зимние', 'Зима','зимние', 'Зимняя с шипами','шипованные' )}
Аргументы
map— обычный текст, а не коды других полей. Если сезон и признак шипов хранятся отдельно, сначала соберите оба токена, а затем применитеmapко всему полю через[[fn:map(...)]].
✂️ 4.2. Ограничение длины текста
truncate(макс_длина)илиtruncate(макс_длина, 'хвостик')Обрезает слишком длинный текст до указанного числа символов. Хвостик (например, троеточие) учитывается в общей длине, чтобы не превысить лимит площадки.- Пример:
{detailcomment|@:truncate(50, '...')}➡️Отличная деталь без пробега по РФ...(длина ровно 50)
- Пример:
truncatewords(кол_во_слов)Оставляет только указанное количество слов.- Пример:
{detailcomment|@:truncatewords(3)}➡️Двигатель в сборе
- Пример:
🔢 4.3. Округление и форматы чисел/дат
roundилиround(знаков_после_запятой)Округляет числа. По умолчанию — до целого.- Пример:
{pricerec|@:round}превратит15200.45в15200.
- Пример:
numformat('формат')Задает красивое отображение чисел (разделение тысяч пробелами, копейки).- Пример:
@:numformat('### ###')превратит254000в254 000.
- Пример:
dateformat('формат')Красивый вывод даты.- Пример:
@:dateformat('dd.MM.yyyy')выведет дату как30.05.2026.
- Пример:
➗ 4.4. Арифметика между подстановками
Текущее значение можно сложить, вычесть, умножить или разделить на число либо значение другой подстановки. В скобках указывается числовая константа или код второго поля:
add(число или поле)— сложение.sub(число или поле)— вычитание из текущего значения.mul(число или поле)— умножение.div(число или поле)— деление текущего значения.
Например, если price = 20000 — цена комплекта из четырёх штук, постоянное количество можно указать прямо в функции:
text
{price|@:div(4):round(2):numformat('0.00')}Если количество хранится в подстановке count, используется её код:
text
{price|@:div(count):round(2):numformat('0.00')}В обоих случаях результат — 5000.00. Для дробной константы используется точка: div(2.5). Арифметику можно соединять с остальными функциями pipeline и применять ко всему собранному полю через [[fn:div(count)]].
В каждой функции указывается ровно один операнд: div(4) — верно, div(4,2) или div(4,) — ошибка, такой шаблон не сохранится.
Деление округляется до 2 знаков после запятой (100 / 3 ➡️ 33.33), спорные половинки — в бо́льшую сторону (1 / 8 ➡️ 0.13). Хвостовые нули не выводятся: 1.5 × 1000 ➡️ 1500, а не 1500.0. Если нужно всегда показывать оба знака, добавьте numformat('0.00'), как в примерах выше.
Если одно из значений пустое или не является числом, делитель равен нулю либо результат выходит за допустимый числовой диапазон, вся подстановка становится пустой. При необходимости после операции можно добавить default:
text
{price|@:div(count):default('0')}🛡️ 4.5. Защита от пустоты (Умный Fallback)
default('значение_по_умолчанию')Если поле пустое, подставляет ваш текст.- Пример:
{producer|@:default('Оригинал')}
- Пример:
coalesce(поле1, поле2, ...)Самый мощный инструмент! Если текущее поле пустое, система проверяет другие указанные поля по очереди и выводит первое заполненное.- Пример:
{oem|@:coalesce(catalognoplain, intnum)}— выведет оригинальный OEM номер. Если его нет — выведет OEM2. Если и его нет — выведет инвентарный номер детали (который гарантированно заполнен всегда!).
- Пример:
⚡ 5. Форматирование всего поля целиком [[fn:...]]
Иногда нужно применить правила (например, обрезку длины) не к отдельному токену, а к итоговому склеенному результату.
Для этого в самом конце вашего шаблона добавьте специальный блок [[fn:функции]]:
text
Купить {partname|@} {modelname|@} {year|@ г.} в розницу и оптом[[fn:squish:truncate(80, '...')]]Как это отработает:
- Сначала система подставит все значения:
"Купить Фара левая Toyota Corolla 2018 г. в розницу и оптом". - Затем применит
squish(удалит лишние пробелы):"Купить Фара левая Toyota Corolla 2018 г. в розницу и оптом". - Затем применит
truncate(80)(обрежет до 80 символов):"Купить Фара левая Toyota Corolla 2018 г. в розницу и...".
📖 6. Справочник доступных полей (Токенов) по типам товаров
В зависимости от того, какой каталог вы выгружаете, вам доступны различные переменные. Ниже приведены самые популярные из них:
🚗 6.1. Детали (Б/у и Новые)
partname— Стандартное название детали (например,Двигатель).oem— OEM-номер детали.catalognoplain/productidplain— Чистый OEM-номер без черточек и точек.intnum— Внутренний номер детали (артикул).detailcomment/comment— Описание / комментарий.producer— Производитель / бренд.pricerec— Рекомендованная розничная цена.pricein/priceopt— Закупочная / Оптовая цена.year— Год выпуска авто-донора.mileage— Пробег авто-донора.modelname— Название модели (например,Toyota Camry).enginename— Модель двигателя.transmission— Коробка передач.extcolor— Цвет детали/машины.storename— Название склада хранения.
🛞 6.2. Шины
tyrediameter— Диаметр шины (например,R16).tyrewidth— Ширина профиля шины (например,205).tyreheight— Высота профиля шины (например,55).tyreseason— Сезонность (Летние, Зимние, Всесезонные).tyremake/tyremodel— Производитель и модель шины.tyrewear— Процент износа шины.tyrespikes— Наличие шипов (да/нет).
💿 6.3. Диски
wheeldiameter— Диаметр диска.wheelwidth— Ширина диска (в дюймах).wheeloffset— Вылет диска (ET).wheelpcd— Расстояние между крепежными отверстиями.wheeltype— Тип диска (Литые, Штампованные, Кованые).
💎 7. Золотая Книга Рецептов (Примеры для маркетплейсов)
Каждый рецепт — это готовое решение для конкретной площадки. Скопируйте его, вставьте в настройки экспорта и наслаждайтесь результатом!
🌟 Рецепт 1. Описание б/у детали для Авито (Универсальное)
Шаблон:
text
Продается {partname|@:cap} для {modelname|@} {year|(@ г.)} в отличном состоянии.
Оригинальный номер: {oem|@:coalesce(catalognoplain):default('не указан')}
{detailcomment|Описание от продавца: @:striphtml:squish}
Наш склад: {storename|@}Результат (все блоки заполнены):
Продается Фара левая для Toyota Camry (2018 г.) в отличном состоянии. Оригинальный номер: 81150-33B70 Описание от продавца: Фара имеет небольшие царапины на стекле, крепеж целый. Наш склад: Склад Север
Результат (если OEM и комментарий не заполнены):
Продается Фара левая для Toyota Camry (2018 г.) в отличном состоянии. Оригинальный номер: не указан Наш склад: Склад Север (Обратите внимание: скрылись целые строки с их форматированием!)
🌟 Рецепт 2. Разделение фото для Авито (Главное фото без брака + галерея)
Чтобы на Авито первой картинкой уходило идеальное фото спереди, а детальные фото дефектов прятались дальше:
Поле "Главное фото":
text{photolinkpart(front,-damaged)|@}(Выгрузит только фото с тегом
frontбез повреждений).Поле "Дополнительные фото":
text{photolinkpart(-front)|@}(Выгрузит все остальные фотографии, исключая главную).
🌟 Рецепт 3. Описание и Габариты для OZON (Новые детали)
Ozon очень строго следит за габаритами упаковки (чтобы рассчитать доставку) и требует чистый текст без верстки.
- Ширина упаковки (см):
{productwidth|@:default('10')} - Длина упаковки (см):
{productlength|@:default('15')} - Высота упаковки (см):
{productheight|@:default('5')} - Вес с упаковкой (кг):
{productweight|@:default('0.5')} - Описание товара:text
Купить {partname|@:cap} для {modelname|@} {year|(@ г.)}. Характеристики запчасти: - Бренд/Производитель: {producer|@:default('Оригинал')} - Артикул производителя (OEM): {oem|@:coalesce(productidplain):default('не указан')} - Штрихкод: {barcode|@} - Внутренний артикул: {intnum|@} {comment|Дополнительное описание: @:striphtml:squish}
🌟 Рецепт 4. Идеальное объявление для Дрома (Drom.ru)
Дром отклоняет выгрузки, если заголовок превышает 95 символов, и очень ценит вывод списка совместимых автомобилей.
Заголовок:
text{partname|@:cap} {modelname|@} {oem|@:coalesce(catalognoplain)} б/у[[fn:squish:truncate(95, '...')]](Соберет заголовок и жестко обрежет его до лимита Дрома с красивым троеточием).
Описание:
textПродается {partname|@:cap} в хорошем состоянии. Оригинальный OEM-номер: {oem|@} Бренд: {producer|@:cap} {listrule2ws1|Совместимость с автомобилями: @} {detailcomment|Примечания к детали: @:striphtml:squish}
🌟 Рецепт 5. Описание автомобильных шин для Авито (Шины)
Для шин критически важно вывести в заголовок марку, модель и три ключевых параметра размера (ширина/высота Rдиаметр).
Заголовок:
text{tyreseason|Зимние }шины {tyremake|@} {tyremodel|@} {tyrewidth|@/}{tyreheight|@} {tyrediameter|@} б/у[[fn:squish:truncate(80)]](Сгенерирует заголовок вида:
Зимние шины Nokian Hakkapeliitta 9 205/55 R16 б/у)Описание шин:
textПродается комплект отличных {tyreseason|@:lower} шин {tyrecountkit|(@ шт.)}. Технические параметры комплекта: - Бренд: {tyremake|@} - Модель: {tyremodel|@} - Размер: {tyrewidth|@}/{tyreheight|@} {tyrediameter|@} - Износ протектора: {tyrewear|@}% - Шипы: {tyrespikes|@:default('нет')} - Runflat: {tyrerunflat|@:default('Нет')} {tyrecomment|Примечания о состоянии: @:striphtml:squish}
🌟 Рецепт 6. Описание колесных дисков для Авито (Диски)
У дисков ключевое значение имеет разболтовка (PCD), ширина диска (J), вылет (ET) и диаметр ЦО (DIA).
Заголовок:
text{wheeltype|Литые }диски {wheelmake|@} {wheelmodel|@} {wheelwidth|@x}{wheeldiameter|@} {wheelpcd|PCD @} б/у[[fn:squish:truncate(80)]](Сгенерирует заголовок вида:
Литые диски K&K Кристалл 7.5x17 PCD 5x114.3 б/у)Описание дисков:
textПродается комплект дисков {wheelcountkit|(@ шт.)} в отличном состоянии. Технические параметры дисков: - Диаметр (R): {wheeldiameter|@ дюймов} - Ширина (J): {wheelwidth|@} - Вылет (ET): {wheeloffset|@ мм} - Разболтовка (PCD): {wheelpcd|@} (крепежных отверстий: {wheelpcn|@}) - Диаметр ЦО (DIA): {wheelcentralbore|@ мм} - Тип: {wheeltype|@} {wheelcomment|Примечания о состоянии: @:striphtml:squish}
🌟 Рецепт 7. Вывод цен с расчетом скидки (Для розничных акций)
Если вы хотите указать выгоду для покупателя при выгрузке акционных товаров:
Шаблон в описании:
text
{pricerec|Старая розничная цена: @:numformat('### ###') ₽}
{priceopt|Специальная цена для Вас (опт/акция): @:numformat('### ###') ₽}Результат:
Старая розничная цена: 18 000 ₽ Специальная цена для Вас (опт/акция): 15 500 ₽ (Если акционная цена отсутствует, строка с акцией не выгрузится и не запутает клиента).