Initial commit

This commit is contained in:
2026-07-06 13:05:56 +03:00
commit 831c72dc60
28 changed files with 2527 additions and 0 deletions
@@ -0,0 +1,86 @@
# REST API (richcode.api)
Главная техническая особенность проекта. Сторонний модуль **`richcode.api` версии 3.1.5** (2024-08-02) отдаёт наружу REST-интерфейс к сущностям сайта: товарам, заказам, складам, пользователям, сделкам. Через него данными можно управлять **без админки** — вероятно, ради этого он и стоит.
Проверено по коду модуля: `bitrix/modules/richcode.api/` (`include.php`, `options.php`, `lib/core/Route.php`).
## Точка входа и формат URL
Запрос перехватывается обработчиком модуля на старте страницы (не через `urlrewrite.php`). Базовый путь задаётся в настройках модуля, по умолчанию `/api/`.
Структура адреса (из `lib/core/Route.php`):
```
/{apiPath}/{module}/{token}/{controller}/{action}
```
- `apiPath` — базовый путь (например `api`).
- `module` — область: `iblock`, `sale`, `main`, `crm`.
- `token` — токен авторизации (если включена авторизация по токену).
- `controller` / `action` — что вызываем. Действие — это оставшиеся сегменты пути после контроллера, склеенные точкой (`…/order/status/set``status.set`).
- Параметры: для GET — query-строка; для POST/PUT/DELETE — тело JSON (`Content-Type: application/json`).
Ответы — JSON (`lib/core/Response.php`).
## Что доступно (контроллеры)
Из карты автозагрузки в `include.php`:
| Модуль | Контроллер | Назначение |
|---|---|---|
| `iblock` | `Element` | CRUD элементов инфоблока: свойства (в т.ч. UF), разделы, файлы, единицы измерения |
| `sale` | `Order` | заказы: корзина, свойства заказа, оплаты, отгрузки |
| `sale` | `Product` | товары каталога и остатки на складах |
| `sale` | `Store` | склады и их остатки |
| `sale` | `Measure` | единицы измерения |
| `sale` | `Discount` | скидки |
| `main` | `User` | создание/обновление пользователей |
| `crm` | `Deal` | сделки (CRM) |
Важно: **каталог (инфоблок 2) обслуживает `sale/product`**, а `iblock/element` — только не-каталожные инфоблоки. Действия у них одинаковые.
> [!info] Полный список действий и примеры
> Все действия каждого контроллера, их параметры и готовые примеры запросов `curl` вынесены в отдельный справочник — [[REST API — методы и примеры (richcode.api)]]. Он составлен по исходникам контроллеров, а не по догадкам.
## Авторизация
- Включается опцией **«Авторизация по токену»** (`USE_AUTH_TOKEN`).
- Токен хранится в поле пользователя **`UF_API_TOKEN`** (по коду `lib/core/Tokens.php`; в подсказке настроек оно ошибочно названо `UF_RESTFUL_API_TOKEN`). Токены генерируются в настройках модуля («Сгенерировать» / «Пересоздать»).
- Токен передаётся **сегментом URL** (`…/{module}/{token}/{controller}/…`), а не заголовком — рабочий код читает его из пути. Пользователь-владелец токена должен состоять в заданной группе.
- Каждый вызов идёт **от имени пользователя-владельца токена** — права API = права этого пользователя. Это важно для безопасности: см. [[Информационная безопасность (apelsincom)]].
- Полная схема адресов, все действия и примеры `curl` — в [[REST API — методы и примеры (richcode.api)]].
## Настройки модуля (что где крутится)
Опции (админка → Настройки → Список модулей → richcode.api, или в БД):
| Опция | Смысл |
|---|---|
| `USE_API` | включить/выключить API |
| `API_PATH` | базовый путь (пример `/api/`) |
| `USE_AUTH_TOKEN` | авторизация по токену |
| `ONLY_HTTPS_EXCHANGE` | принимать только https |
| `USE_BLACK_LIST_ADDRESS_FILTER` / `BLACK_LIST_ADDRESS` | чёрный список IP |
| `USE_WHITE_LIST_ADDRESS_FILTER` / `WHITE_LIST_ADDRESS` | белый список IP |
| `USE_ACCESS_CONTROL_ALLOW_ORIGIN_FILTER` | CORS-фильтр по домену |
| `LOGGING` / `hl_logging` | лог запросов в highload-блок «Лог запросов» |
## Логирование
При включённом `LOGGING` каждый запрос пишется в highload-блок (его ID — в опции `hl_logging`) с полями `UF_API_LOG_TIME`, `UF_API_LOG_URL`, `UF_API_LOG_METHOD`, `UF_API_LOG_DATA`. Удобно для отладки интеграций; помните, что в лог попадает тело запроса — не логируйте лишнего (ПДн).
## Поток запроса
```mermaid
sequenceDiagram
participant C as Клиент
participant R as richcode.api (Route)
participant B as Bitrix (iblock/sale/main/crm)
C->>R: HTTP /api/{module}/{token}/{controller}/{action} (+JSON)
R->>R: проверка HTTPS / IP / CORS / токена
R->>B: вызов контроллера от имени пользователя токена
B-->>R: результат
R-->>C: JSON-ответ (+ запись в лог, если включён)
```
> [!warning] Что проверить и обезопасить
> - Точный `API_PATH` и какие пользователи-токены заведены — по файлам не видно, смотрите настройки модуля.
> - Включены ли `ONLY_HTTPS_EXCHANGE`, белый список IP и CORS — это ключевые меры защиты API.
> - Токены = ключи от данных. Их хранение, ротация и права пользователей-владельцев — в [[Информационная безопасность (apelsincom)]].
## См. также
- [[Информационная безопасность (apelsincom)]]
- [[Интеграции (apelsincom)]]
- [[Инфоблоки и каталог (apelsincom)]]
@@ -0,0 +1,298 @@
# REST API — методы и примеры (richcode.api)
Полный справочник действий модуля `richcode.api` и примеры запросов. Составлено по исходникам контроллеров (`bitrix/modules/richcode.api/lib/*/controllers/*.php`) и ядра модуля (`lib/core/`). Обзор и настройки — в [[REST API (richcode.api)]].
## Содержание
- URL-схема
- Авторизация и фильтры
- Формат ответа
- Справочник действий (по контроллерам)
- Примеры запросов
- Точные схемы (проверено по моделям)
## URL-схема
```
/{apiPath}/{module}/{token}/{controller}/{action}
```
- `apiPath` — базовый путь, по умолчанию `api` (модуль срабатывает, если первый сегмент URL равен ему — из `Init::checkPathApi`).
- `module` / `controller` — из карты в `lib/core/Init.php`: `iblock/element`, `sale/product|order|store|discount|measure`, `main/user`, `crm/deal`.
- `token` — сегмент URL с токеном (если включена авторизация).
- `action`**оставшиеся сегменты пути после контроллера, склеенные точкой**. Поэтому `.../element/section/add` → действие `section.add`, `.../order/status/set``status.set`.
- Параметры: для GET — query-строка; для POST/PUT/DELETE — тело JSON (`Content-Type: application/json`) или form-data.
## Авторизация и фильтры
Проверки идут по порядку (`Init::checkFilters`): **токен → только HTTPS → IP-список → группа пользователя**. Любая непройденная — ответ `403`.
- Токен берётся из **сегмента URL** и ищется в поле пользователя **`UF_API_TOKEN`** (`Tokens::checkToken`). Запрос выполняется **от имени этого пользователя** — его правами и ограничен.
- Пользователь-владелец токена должен состоять в группе, заданной в настройках модуля (`Config::getGroupId()`).
- Формат токена: `xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx` (например `b2b23c2b-8df82f85-256913d3-ff261962`), генерируется в настройках модуля.
> [!warning] Расхождения, которые собьют с толку
> - В подсказке настроек модуля поле названо `UF_RESTFUL_API_TOKEN`, но в коде используется **`UF_API_TOKEN`**. Верно то, что в коде.
> - Та же подсказка предлагает передавать токен заголовком `Authorization-Token`, но рабочий код (`Route`+`Init`) читает токен **из сегмента URL**, а не из заголовка. Заголовок лишь разрешён в CORS. Используйте токен в URL.
> - Токен в URL попадёт в логи веб-сервера и в собственный лог модуля (HL-блок). Это чувствительно — см. [[Информационная безопасность (apelsincom)]].
## Формат ответа
Всегда JSON `{"status", "result"}` (из `lib/core/Response.php`):
- Успех — HTTP 200: `{"status":200,"result": <данные>}`.
- Бизнес-ошибка — HTTP 400: `{"status":400,"result":{"type":"error","message":"..."}}`.
- Отказ фильтра (нет токена / не HTTPS / чужой IP / не та группа) — HTTP 403: `{"status":403,"result":{"type":"error","message":"Forgbiden"}}` (опечатка в исходнике сохранена как есть).
## Справочник действий
### iblock / element (и sale / product — те же действия, но по товарам каталога)
| Действие (URL) | Параметры | Что делает |
|---|---|---|
| `add` | поля элемента | создать элемент, вернуть ID |
| `update` | `ID` + поля | обновить элемент |
| `delete` | `ID` | удалить |
| `get` | `ID` | элемент по ID |
| `list` | фильтр/выборка | список элементов |
| `fields` | — | доступные поля элемента |
| `property.list` | (`IBLOCK_ID`) | список свойств инфоблока |
| `property.get` | `ID` | свойство по ID |
| `property.enumeration.fields` | параметры свойства | значения списочного свойства |
| `property.add` / `property.update` | поля свойства | создать/изменить свойство |
| `property.enumeration.add` / `.update` | поля | значения списочного свойства |
| `property.add.group` / `property.update.group` / `property.enumeration.add.group` / `property.enumeration.update.group` | `fields[]` | групповые операции |
| `section.add` / `section.update` | поля раздела | создать/изменить раздел |
| `section.update.group` | `fields[]` | групповое изменение разделов |
| `section.list` | фильтр | список разделов |
| `section.get` | `ID` | раздел по ID |
| `section.property.list` | `IBLOCK_ID` | свойства раздела |
| `section.property.enumeration.fields` | — | значения свойств раздела |
| `update.group` | `fields[]` | групповое обновление элементов |
| `file.add` | файл | добавить файл |
| `measure.ratio.update` | параметры | коэффициент единицы измерения |
| `store.amount.get` / `store.amount.set` | параметры остатков | остатки товара по складам |
### sale / order
| Действие | Параметры | Что делает |
|---|---|---|
| `create` | поля заказа | создать заказ, вернуть ID |
| `get` | `ORDER_ID` | заказ по ID |
| `list` | фильтр | список заказов |
| `fields` | — | поля заказа |
| `basket` | `ORDER_ID` | состав корзины заказа |
| `status.list` | — | список статусов заказа |
| `status.set` | `ORDER_ID`, `STATUS_ID` | сменить статус |
| `cancel` / `uncancel` | `ORDER_ID` | отмена / снятие отмены |
| `payed` / `unpayed` | `ORDER_ID` | отметить оплаченным / нет |
| `delivery.status.list` | — | статусы доставки |
| `delivery.status.set` | `ORDER_ID`, `STATUS_ID` | статус доставки |
| `delivery.accept` / `delivery.decline` | `ORDER_ID` | принять / отклонить доставку |
| `shipment.accept` / `shipment.decline` | `ORDER_ID` | отгрузка |
| `payer.list` | — | типы плательщиков |
| `property.list` / `property.enum` | — | свойства заказа |
| `payment.list` / `delivery.list` | — | доступные оплаты / доставки |
### sale / store
| Действие | Параметры | Что делает |
|---|---|---|
| `add` | `fields` | создать склад |
| `update` | `fields` | изменить склад |
| `set.amount` | `PRODUCT_ID`, `STORE_ID`, кол-во | задать остаток |
| `set.amount.group` | `fields[]` | групповые остатки |
| `list` | — | список складов |
### sale / measure, sale / discount, main / user, crm / deal
| Контроллер | Действия |
|---|---|
| `sale/measure` | `add`, `update` (`fields.ID`), `delete` (`ID`), `list` |
| `sale/discount` | `add`, `update`, `delete` (`ID`), `list` |
| `main/user` | `list`, `add`, `update`, `delete` (`ID`), `fields` |
| `crm/deal` | `productrows.set` (задать товарные позиции сделки) |
## Примеры запросов
Ниже `https://<домен>` = адрес сайта, `<TOKEN>` = токен из `UF_API_TOKEN`, `apiPath` = `api`. Reads — через GET, writes — через POST (роутер разбирает параметры и там, и там; метод влияет только на способ передачи данных).
> [!warning] Каталог vs обычный инфоблок — разные контроллеры
> Проверено по моделям: **`iblock/element` работает только с НЕ-каталожными инфоблоками**, а для товаров и разделов **каталога (инфоблок 2) нужен `sale/product`** (те же действия). Перепутаете — получите ошибку «Инфоблок с указанным ID не найден». Поэтому примеры для каталога ниже — на `sale/product`. И у `add`/`update`/`section.*` тело обёрнуто в ключ **`fields`** (у `order/create` — нет). Полные схемы — в разделе «Точные схемы».
**Доступные поля элемента:**
```bash
curl "https://<домен>/api/iblock/<TOKEN>/element/fields"
```
**Получить товар каталога по ID:**
```bash
curl "https://<домен>/api/sale/<TOKEN>/product/get?ID=123"
# → {"status":200,"result":{ ...поля товара... }}
```
**Список товаров каталога:**
```bash
curl "https://<домен>/api/sale/<TOKEN>/product/list?filter[IBLOCK_ID]=2"
```
**Создать товар каталога (инфоблок 2):**
```bash
curl -X POST "https://<домен>/api/sale/<TOKEN>/product/add" \
-H "Content-Type: application/json" \
-d '{"fields":{
"IBLOCK_ID": 2,
"NAME": "Кроссовки Модель X",
"CODE": "krossovki-model-x",
"ACTIVE": "Y",
"PRICE": 4990,
"CURRENCY": "RUB",
"QUANTITY": 10,
"PROPERTY_ARTNUMBER": "ART-001"
}}'
# → {"status":200,"result": <новый ID>}
```
**Создать элемент обычного (не каталог) инфоблока:**
```bash
curl -X POST "https://<домен>/api/iblock/<TOKEN>/element/add" \
-H "Content-Type: application/json" \
-d '{"fields":{"IBLOCK_ID":5,"NAME":"Новость","CODE":"novost","ACTIVE":"Y","PROPERTY_AUTHOR":"Редакция"}}'
```
**Обновить товар:**
```bash
curl -X POST "https://<домен>/api/sale/<TOKEN>/product/update" \
-H "Content-Type: application/json" \
-d '{"fields":{"ID": 123, "NAME": "Новое название", "PRICE": 5490}}'
```
**Удалить товар:**
```bash
curl -X POST "https://<домен>/api/sale/<TOKEN>/product/delete" \
-H "Content-Type: application/json" -d '{"ID": 123}'
```
**Разделы каталога:**
```bash
# список разделов
curl "https://<домен>/api/sale/<TOKEN>/product/section/list?filter[IBLOCK_ID]=2"
# создать раздел
curl -X POST "https://<домен>/api/sale/<TOKEN>/product/section/add" \
-H "Content-Type: application/json" \
-d '{"fields":{"IBLOCK_ID":2,"NAME":"Мужская обувь","CODE":"muzhskaya-obuv","ACTIVE":"Y"}}'
```
**Остатки на складе:**
```bash
curl -X POST "https://<домен>/api/sale/<TOKEN>/store/set/amount" \
-H "Content-Type: application/json" \
-d '{"PRODUCT_ID":123,"STORE_ID":1,"AMOUNT":10}'
```
**Заказы:**
```bash
# получить заказ
curl "https://<домен>/api/sale/<TOKEN>/order/get?ORDER_ID=1001"
# список заказов
curl "https://<домен>/api/sale/<TOKEN>/order/list"
# создать заказ (полная схема — в разделе «Точные схемы»)
curl -X POST "https://<домен>/api/sale/<TOKEN>/order/create" \
-H "Content-Type: application/json" \
-d '{"PERSON_TYPE_ID":1,"DELIVERY_ID":1,"PAYSYSTEM_ID":1,
"ITEMS":[{"PRODUCT_ID":412,"QUANTITY":1}],
"PROPERTIES":[{"ID":1,"VALUE":"Иван"}]}'
# сменить статус
curl -X POST "https://<домен>/api/sale/<TOKEN>/order/status/set" \
-H "Content-Type: application/json" -d '{"ORDER_ID":1001,"STATUS_ID":"F"}'
# отметить оплаченным
curl -X POST "https://<домен>/api/sale/<TOKEN>/order/payed" \
-H "Content-Type: application/json" -d '{"ORDER_ID":1001}'
```
**Пользователь:**
```bash
curl -X POST "https://<домен>/api/main/<TOKEN>/user/add" \
-H "Content-Type: application/json" -d '{ ...поля пользователя... }'
```
## Точные схемы (проверено по моделям)
Схемы ниже сверены по коду моделей (`lib/…/models/…`), а не по догадкам.
### Правило: каталог vs обычный инфоблок
- `iblock/element/*` — только **не-каталожные** инфоблоки (`add`, `list`, `get`, `section.*` внутренне исключают каталоги).
- `sale/product/*` — только **каталог** (инфоблок 2); те же действия, но модель работает с ценой, остатком и товарными полями.
- У `add` / `update` / `section.add` / `section.update` тело обёрнуто в ключ **`fields`** (плоская карта). Свойства элемента — с префиксом `PROPERTY_<КОД>`, поля раздела — `UF_<КОД>`.
### element/add — элемент обычного инфоблока
`POST /api/iblock/<TOKEN>/element/add`
```json
{ "fields": {
"IBLOCK_ID": 5,
"NAME": "Заголовок",
"CODE": "zagolovok",
"ACTIVE": "Y",
"SORT": 100,
"PREVIEW_TEXT": "…",
"DETAIL_TEXT": "…",
"IBLOCK_SECTION_ID": 12,
"PROPERTY_AUTHOR": "Редакция"
} }
```
Стандартные поля (`getAvailableElementFields`): `ID, IBLOCK_ID, IBLOCK_SECTION_ID, ACTIVE, XML_ID, DATE_ACTIVE_FROM, DATE_ACTIVE_TO, SORT, NAME, PREVIEW_PICTURE, PREVIEW_TEXT, DETAIL_PICTURE, DETAIL_TEXT, CODE`. Если `CODE` пуст, а в инфоблоке включён транслит — сгенерируется из `NAME`. Возвращает ID нового элемента. Каталог (ИБ 2) метод отклонит.
### sale/product/add — товар каталога (инфоблок 2)
`POST /api/sale/<TOKEN>/product/add`
```json
{ "fields": {
"IBLOCK_ID": 2,
"NAME": "Кроссовки Модель X",
"CODE": "krossovki-model-x",
"ACTIVE": "Y",
"IBLOCK_SECTION_ID": 15,
"PRICE": 4990,
"CURRENCY": "RUB",
"QUANTITY": 10,
"VAT_ID": 1,
"VAT_INCLUDED": "Y",
"MEASURE": 5,
"WEIGHT": 800,
"PROPERTY_ARTNUMBER": "ART-001",
"PROPERTY_MANUFACTURER": "Производитель"
} }
```
Помимо полей элемента поддерживаются товарные (`Product::getAvailableElementFields`): `PRICE, CURRENCY, QUANTITY, QUANTITY_RESERVED, VAT_ID, VAT_INCLUDED, MEASURE, EXTERNAL_ID, PURCHASING_PRICE, PURCHASING_CURRENCY, WIDTH, HEIGHT, LENGTH, WEIGHT`. Метод сам заводит товар в торговом каталоге и ставит базовую цену. Требует именно каталог.
### section.add — раздел
`POST /api/sale/<TOKEN>/product/section/add` (каталог) или `/api/iblock/<TOKEN>/element/section/add` (обычный ИБ)
```json
{ "fields": {
"IBLOCK_ID": 2,
"NAME": "Мужская обувь",
"CODE": "muzhskaya-obuv",
"SORT": 100,
"ACTIVE": "Y",
"IBLOCK_SECTION_ID": 0,
"UF_SHOW_IN_MENU": 1
} }
```
Поля раздела: `ID, IBLOCK_SECTION_ID, IBLOCK_ID, NAME, CODE, SORT, ACTIVE` + пользовательские `UF_*` (например `UF_SHOW_IN_MENU`, см. [[Инфоблоки и каталог (apelsincom)]]).
### order/create — заказ
`POST /api/sale/<TOKEN>/order/create` (**без** обёртки `fields`). Заказ создаётся на пользователя токена.
```json
{
"PERSON_TYPE_ID": 1,
"DELIVERY_ID": 1,
"PAYSYSTEM_ID": 1,
"ITEMS": [
{ "PRODUCT_ID": 412, "QUANTITY": 1 },
{ "PRODUCT_ID": 413, "QUANTITY": 4 }
],
"PROPERTIES": [
{ "ID": 1, "VALUE": "Иван" },
{ "ID": 5, "VALUE": ["Опция А", "Опция Б"] }
]
}
```
- `ITEMS[].PRODUCT_ID` — ID товара/предложения каталога, `QUANTITY` — количество. Корзина строится через провайдер `catalog`, валюта — базовая.
- `PROPERTIES[].ID` — ID свойства заказа (значения списков — из `order/property.list`), `VALUE` может быть массивом для множественных.
- `DELIVERY_ID` / `PAYSYSTEM_ID` — из `order/delivery.list` и `order/payment.list`; `PERSON_TYPE_ID` — из `order/payer.list`.
- Возвращает ID созданного заказа; при ошибке — 400 с текстом от `sale`.
### Остальные схемы — сверять в моделях
Для `store/set.amount`, `user/add`, `measure/*`, `discount/*` и свойств (`property.*`) точный формат — в `lib/sale/models/Store.php`, `Product/DmlStore.php`, `lib/main/models/User.php`, `lib/iblock/models/Element/DmlProperty.php`. Быстро узнать поля вживую: `…/product/fields`, `…/order/fields`, `…/user/fields`, `…/product/property/list?filter[IBLOCK_ID]=2`.
## См. также
- [[REST API (richcode.api)]]
- [[Сценарии. Товары и разделы]]
- [[Информационная безопасность (apelsincom)]]
@@ -0,0 +1,60 @@
# Архитектура и структура каталогов (apelsincom)
Сайт сделан на 1С-Битрикс. Главное правило: все доработки лежат в `/local/`, а ядро `/bitrix/` не трогаем — так правки не слетают при обновлении платформы.
## Из чего сделан сайт
- **Движок:** 1С-Битрикс (PHP), решение eShop. Модули: главный, инфоблоки, торговый каталог, продажи (`sale`), валюты, склады (`storeassist`), поиск, веб-формы, плюс сторонний модуль `richcode.api` (внешний REST — см. [[REST API (richcode.api)]]).
- **Фронтенд:** jQuery 3.7.1, jQuery UI, Fancybox, Swiper, маска телефона, свой `script.js`. Сборки (webpack и т.п.) нет — библиотеки подключены готовыми. Подробнее — [[Шаблон custom]].
- **Данные:** товары в инфоблоке ID 2 с торговыми предложениями (размер/цвет), заказы в модуле `sale`. См. [[Инфоблоки и каталог (apelsincom)]].
## Как всё связано, по-простому
```mermaid
flowchart LR
U[Посетитель] --> H[.htaccess: HTTPS + ЧПУ]
H --> K[Ядро Битрикс]
K --> T[Шаблон custom]
T --> C[Компоненты и их шаблоны]
C --> IB[(Инфоблоки / sale)]
A[Внешняя система] -->|HTTP + токен| API[richcode.api /api/]
API --> IB
```
Витрину собирают штатные компоненты Битрикса с **переопределёнными шаблонами**. Параллельно наружу работает REST API (`richcode.api`), который ходит в те же данные, минуя витрину.
> [!tip] Ключевое отличие этого проекта
> Здесь **нет своих компонентов** (`/local/components/` пуст) и **нет своего `init.php`** (`/local/php_interface/` пуст). Вся кастомизация — в шаблонах компонентов внутри шаблона сайта. Если привыкли искать логику в `init.php` — тут её нет, смотрите в [[Компоненты и шаблоны компонентов]] и [[REST API (richcode.api)]].
## Папки на сайте
```
public_html/
├── index.php главная (баннер-слайдер, блоки категорий и товаров)
├── 404.php страница «не найдено» (крупный файл с вёрсткой)
├── .htaccess HTTPS-редирект и ЧПУ
├── urlrewrite.php правила ЧПУ Битрикса
├── catalog/ каталог (компонент bitrix:catalog, ИБ 2)
├── personal/ store/ news/ разделы: кабинет/корзина, магазины, новости
├── include/ подключаемые куски (логотип, баннер, контакты, кнопки Ozon/WB)
├── upload/ загрузки: картинки ИБ, файлы свойств, docs, фиды импорта/экспорта
├── odmavatar/ файлы внешнего виджета «ИИ-стилист» (отключён)
├── bitrix/ ядро движка (не трогаем)
│ ├── modules/richcode.api/ сторонний REST-модуль
│ ├── php_interface/ подключение БД + раннеры импорта/экспорта
│ └── services/ rest, ymarket, mobileapp, sale/b24integration
└── local/ ВСЕ ДОРАБОТКИ
└── templates/custom/ активный шаблон сайта (внутреннее имя reborn_template)
├── header.php footer.php шапка и подвал
├── js/script.js поведение фронта
├── styles.css fonts/ стили и шрифты
└── components/bitrix/ ПЕРЕОПРЕДЕЛЁННЫЕ шаблоны компонентов
```
Полный список «что где» — в [[Справочник — что где лежит (apelsincom)]].
## См. также
- [[Шаблон custom]]
- [[Компоненты и шаблоны компонентов]]
- [[REST API (richcode.api)]]
- [[Серверная логика и php_interface (apelsincom)]]
- [[Справочник — что где лежит (apelsincom)]]
@@ -0,0 +1,42 @@
# Быстрый старт для нового разработчика (apelsincom)
Эта страница для того, кто впервые открыл проект. Идите по шагам сверху вниз. Непонятные слова — в [[Глоссарий (apelsincom)]].
## 1. Получите доступы
Сервер, FTP и домен — на странице [[Доступы и окружение (apelsincom)]]. Админка в этом проекте может быть недоступна — работаем по FTP и через API.
Скачайте к себе по FTP папку `/local/` — это все доработки сайта. Ядро `/bitrix/` целиком тянуть не нужно.
## 2. Разберитесь, как всё устроено
- Прочитайте [[Архитектура и структура каталогов (apelsincom)]] — общая картина и правило «всё в /local/».
- Прочитайте [[Компоненты и шаблоны компонентов]] — здесь ключевая особенность: своих компонентов нет, вся вёрстка и логика вывода — в переопределённых шаблонах штатных компонентов.
- Загляните в [[REST API (richcode.api)]] — сайт отдаёт наружу REST-интерфейс; для этого проекта это важнее, чем витрина.
- Бегло — [[Маршрутизация и ЧПУ (apelsincom)]] и [[Инфоблоки и каталог (apelsincom)]].
## 3. Сразу узнайте про «грабли»
Это лучше прочитать до того, как что-то менять — [[Известные проблемы и рекомендации (apelsincom)]]:
- Номер инфоблока каталога (**2**) зашит в коде во многих местах.
- В webroot лежит публичный бэкап `shoes.zip` (~1.27 ГБ) — риск утечки.
- В шаблоне умного фильтра валяется файл-дубль `template copy 1.php`.
- Рядом с активными шаблонами лежат исходные `bootstrap_v4` — не перепутайте, какой правите.
## 4. Проверьте, что всё работает
- Откройте витрину: главная, каталог `/catalog/`, карточка товара.
- Проверьте, отвечает ли API по настроенному пути (по умолчанию `/api/`). Точный путь и токены — в настройках модуля `richcode.api` (нужен админ) либо у прежней команды. См. [[REST API (richcode.api)]].
- Посмотрите свежий `error_log` в корне аккаунта на предмет ошибок.
## 5. Сделайте первое простое изменение
Тренируйтесь на чём-то безопасном:
1. Поправьте текстовую область в `/include/` (например, контакты в подвале — сейчас там демо-данные). Как — в [[Компоненты и шаблоны компонентов#Include-области]].
2. Сбросьте кэш и проверьте страницу ([[Кэширование и обслуживание (apelsincom)]]).
Чего лучше не делать на старте:
- Не трогать ядро `/bitrix/` — работайте только в `/local/`.
- Не менять номер инфоблока и коды свойств без полной проверки — они зашиты в шаблонах и в API.
- Не выкладывать и не генерировать бэкапы в webroot.
- Не делать массовых правок без резервной копии.
## См. также
- [[Магазин обуви (apelsincom) — Обзор]]
- [[Архитектура и структура каталогов (apelsincom)]]
- [[Известные проблемы и рекомендации (apelsincom)]]
@@ -0,0 +1,30 @@
# Глоссарий (apelsincom)
Термины, которые встречаются в этой документации.
- **Инфоблок** — «таблица» контента в Битриксе (товары, новости, слайдер). Каталог здесь — инфоблок ID 2. См. [[Инфоблоки и каталог (apelsincom)]].
- **Элемент** — одна запись инфоблока (например, товар).
- **Раздел** — категория внутри инфоблока (дерево каталога).
- **Свойство** — доп. поле элемента/раздела (артикул, материал, `UF_SHOW_IN_MENU`). `UF_` — пользовательское поле.
- **Торговое предложение (SKU)** — вариант товара (размер, цвет) с собственной ценой и остатком.
- **Компонент** — готовый блок вывода (`bitrix:catalog`, `bitrix:menu`). См. [[Компоненты и шаблоны компонентов]].
- **Шаблон компонента** — вёрстка компонента. Здесь переопределены в `local/templates/custom/components/`.
- **result_modifier.php** — файл шаблона, где правят данные (`$arResult`) перед выводом. Местная замена серверной логики.
- **component_epilog.php** — код шаблона, выполняемый после кэша (некэшируемая часть).
- **Шаблон сайта** — общее оформление (шапка/подвал/стили). Здесь — `custom` (`reborn_template`).
- **Ядро (`/bitrix/`)** — движок Битрикса. Не редактируется.
- **`/local/`** — папка всех доработок проекта.
- **D7** — современное ядро/ORM Битрикса (пространства имён `\Bitrix\…`).
- **ЧПУ (SEF)** — человекопонятные адреса. Правила — `urlrewrite.php` + `.htaccess`. См. [[Маршрутизация и ЧПУ (apelsincom)]].
- **Символьный код** — латинская строка элемента/раздела, попадает в ЧПУ-адрес.
- **Агент** — фоновая задача Битрикса по расписанию (импорт/экспорт).
- **CommerceML** — XML-формат обмена товарами с 1С. См. [[Интеграции (apelsincom)]].
- **YML** — формат выгрузки для Яндекс.Маркета.
- **Highload-блок (HL-блок)** — таблица данных вне инфоблоков; сюда пишется лог API.
- **richcode.api** — сторонний модуль внешнего REST API. См. [[REST API (richcode.api)]].
- **Токен API** — ключ доступа к API, привязан к пользователю (`UF_RESTFUL_API_TOKEN`).
- **Проактивная защита** — модуль безопасности Битрикса (WAF, OTP, контроль целостности).
## См. также
- [[Магазин обуви (apelsincom) — Обзор]]
- [[Глоссарий]] — общий глоссарий соседнего проекта Shale Sante (термины Битрикса пересекаются)
@@ -0,0 +1,30 @@
# Доступы и окружение (apelsincom)
Всё про то, где живёт сайт и как к нему подключиться. Конкретные пароли и токены здесь **не хранятся** — их передают отдельно и по защищённому каналу (см. [[Информационная безопасность (apelsincom)]]).
## Окружение
| Параметр | Значение | Откуда известно |
|---|---|---|
| Платформа | 1С-Битрикс, главный модуль **25.100.500** (2025-06-07) | `bitrix/modules/main/classes/general/version.php` |
| Базовое решение | eShop (интернет-магазин) | модуль `bitrix.eshop`, шаблон `eshop_bootstrap_v4` |
| СУБД | MySQL 8 (коллация `utf8mb4_0900_ai_ci`) | `bitrix/php_interface/after_connect_d7.php` |
| Кодировка сайта | UTF-8 | файлы проекта |
| Веб-сервер | Apache + mod_rewrite | `.htaccess`, `error_log` |
| FTP | Pure-FTPd, поддержка TLS | приветствие FTP |
| Домен (стенд) | `shoes1.orangedm.agency` | `robots.txt` |
| Путь на сервере | `/home/a/apelsincom/public_html/` | `error_log` |
| Разработчик агентства | OrangeDM | папка `odmavatar`, домен |
## Как подключиться
- **FTP:** сервер `77.222.56.104`, порт 21. Логин/пароль — отдельно. Сервер умеет TLS — подключайтесь по **FTPS/SFTP**, а не по открытому FTP (см. [[Информационная безопасность (apelsincom)]]).
- **Webroot:** `public_html/`. Все доработки — в `public_html/local/`.
> [!warning] Про версию PHP
> Точную версию PHP по файлам определить нельзя — уточните её у хостинга или владельца сервера. От версии PHP зависит совместимость Битрикса и модулей.
## См. также
- [[Быстрый старт для нового разработчика (apelsincom)]]
- [[Архитектура и структура каталогов (apelsincom)]]
- [[Информационная безопасность (apelsincom)]]
@@ -0,0 +1,58 @@
# Известные проблемы и рекомендации (apelsincom)
Грабли и слабые места по результатам разбора кода (только чтение, без сканирования и эксплуатации). Часть — гипотезы, требующие проверки в админке; отмечено. Модель угроз — [[Информационная безопасность (apelsincom)]].
Приоритет: **критично** — сразу; **важно** — скоро; **средне** — планово.
## Критично
**1. Полный бэкап в webroot.** `public_html/shoes.zip` (~1.27 ГБ). Если открывается по `https://<домен>/shoes.zip` — это утечка исходников и, возможно, дампа БД со всеми секретами и токенами API.
→ Убрать из webroot, проверить, что ссылка отдаёт 403/404, впредь бэкапы в публичных папках не держать ([[Кэширование и обслуживание (apelsincom)]]).
**2. Открытый API без проверенной защиты.** Модуль `richcode.api` даёт доступ к товарам, заказам, пользователям. Если не включены HTTPS-only, белый список IP и токен-авторизация — это открытая дверь.
→ Проверить и включить меры в настройках модуля. См. [[REST API (richcode.api)]] и [[Информационная безопасность (apelsincom)]].
**3. FTP по открытому порту, доступы переданы текстом.** Порт 21, пароль передавался в переписке.
→ Сменить пароль FTP, перейти на FTPS/SFTP, секреты не слать в открытых каналах.
## Важно
**4. Хардкод номера инфоблока (IBLOCK_ID = 2).** Прописан в `catalog/index.php`, `header.php`, шаблонах компонентов, и используется в API. Пересоздание каталога под другим ID потребует правок во многих местах.
→ При любой миграции каталога искать `"IBLOCK_ID" => "2"` и `iblock_catalog`/`2` по всему `/local/` и в настройках `richcode.api`.
**5. Файлы импорта/фидов в публичном `upload/`.** `upload/xml/pric.xml`, `import_test_50.xml`, `upload/bitrix_import.csv` — могут раскрывать закупочные данные.
→ Проверить доступность по прямой ссылке; рабочие фиды держать вне webroot или закрыть; тестовые удалить.
**6. Демо-данные на витрине.** Контакты в подвале заглушечные (`info@catalog.ru`, `+7 (999) 123-45-67`).
→ Заменить перед продом ([[Шаблон custom]]).
## Средне
**7. Мусор в шаблонах.** В `catalog.smart.filter/custom` лежит `template copy 1.php` — нерабочий дубль, легко перепутать с `template.php`.
→ Удалить после проверки, что он нигде не подключается.
**8. Дубли шаблонов `bootstrap_v4` рядом с `custom`.** Исходные шаблоны eShop лежат рядом с рабочими. Риск править не тот файл.
→ Помнить, какой шаблон реально указан в вызове компонента ([[Компоненты и шаблоны компонентов]]).
**9. Логи и служебные файлы в доступе.** `error_log*`, `bitrix/site_checker_*.log`, `updater*.log`.
→ Ограничить доступ/чистить; снижает объём разведданных.
**10. Внешний виджет higgleby.tech.** Сейчас отключён (закомментирован). При включении — передача данных третьей стороне.
→ Включать осознанно, отразить в политике ПДн.
**11. Расхождения в документации API `richcode.api`.** Подсказки модуля вводят в заблуждение: поле токена названо `UF_RESTFUL_API_TOKEN`, хотя код использует **`UF_API_TOKEN`**; предлагается передавать токен заголовком `Authorization-Token`, хотя рабочий код читает его **из URL**. Разработчик на интеграции легко потеряет время.
→ Ориентироваться на код и на [[REST API — методы и примеры (richcode.api)]], а не на подсказки в админке.
**12. Неочевидные правила тела запросов API.** Легко потерять время на интеграции:
- каталог (инфоблок 2) обслуживает **`sale/product`**, а `iblock/element` каталог **отклоняет** («Инфоблок с указанным ID не найден»);
- у `add`/`update`/`section.add` тело обёрнуто в ключ **`fields`**, а у `order/create` — нет;
- свойства передаются с префиксом `PROPERTY_<КОД>`, поля раздела — `UF_<КОД>`.
→ Проверенные схемы — в [[REST API — методы и примеры (richcode.api)#Точные схемы (проверено по моделям)]].
## Что хорошо
- Свежая версия платформы (25.100.500, 2025) — меньше известных уязвимостей.
- Принудительный HTTPS и запрет листинга директорий в `.htaccess`.
- Кастомизация вынесена в `/local/`, ядро не правится.
- У модуля API есть встроенные меры (HTTPS-only, IP-фильтры, CORS, токены) — их нужно лишь правильно включить.
## См. также
- [[Информационная безопасность (apelsincom)]]
- [[REST API (richcode.api)]]
- [[Быстрый старт для нового разработчика (apelsincom)]]
@@ -0,0 +1,34 @@
# Интеграции (apelsincom)
Внешние связи сайта. Часть подтверждена по коду, часть настраивается в БД/админке — это отмечено. Отдельно про внешний REST — [[REST API (richcode.api)]].
## Обмен с 1С (CommerceML)
В `bitrix/php_interface/include/catalog_import/` есть штатные раннеры Битрикса **CommerceML** (`commerceml_run.php`, `commerceml_setup.php`) и импорт CSV, плюс `cron_frame.php`. Это стандартный механизм обмена каталогом с 1С (товары, цены, остатки).
- Рабочие файлы обмена/прайсы лежат в `upload/xml/` (`pric.xml`, `import_test_50.xml`) и `upload/bitrix_import.csv`.
- Точное расписание и профиль обмена — в настройках (Магазин → Импорт данных / Агенты). **Проверить.**
> [!warning] Импорт может перезаписывать данные
> Обмен из 1С обычно ведётся по `XML_ID`. Товары/цены, привязанные к 1С, при следующем обмене перезапишутся — не редактируйте их вручную, если не уверены. Тестовый файл `import_test_50.xml` — повод проверить, не настроен ли обмен на тестовую выгрузку.
## Яндекс.Маркет
- Экспорт (YML): в `bitrix/php_interface/include/catalog_export/` — раннеры `yandex_run.php`, `yandex_setup.php`, `yandex_simple_*` и `cron_frame.php`. Профили экспорта — `bitrix/catalog_export/`.
- Заказы: сервис `bitrix/services/ymarket/index.php` подключает штатный модуль `sale/services/ymarket` — то есть возможен приём заказов Яндекс.Маркета, а не только выгрузка.
- Конкретные включённые фиды — Магазин → Настройки → Экспорт данных. **Проверить.**
## Битрикс24
- Сервис `bitrix/services/sale/b24integration/push.php` — штатный роутер обмена «магазин ↔ Битрикс24» (`Bitrix\Sale\Exchange\Integration`). Установлен модуль `b24connector`.
- Скорее всего, заказы уходят в CRM Битрикс24. Подключение и портал — Настройки → Битрикс24. **Проверить.**
## Мобильное приложение
- Сервис `bitrix/services/mobileapp/jn.php` и маршрут `/mobileapp/jn/…` — фреймворк мобильных приложений Битрикса (JN). Возможно, сайт обслуживает мобильное приложение. **Проверить актуальность.**
## Маркетплейс-ссылки (Ozon, Wildberries)
Витринные ссылки «Купить на Ozon/Wildberries» в `include/ozon_btn.php`, `include/wb_btn.php` и в подвале. Это просто исходящие ссылки, не автоматический обмен.
## Виджет ИИ-стилист
В `footer.php` есть **закомментированный** внешний чат-виджет: `src="/odmavatar/avatarodm-chat-widget.min.js"`, API `hub.higgleby.tech`, бренд `gekkon`. Файлы — в `odmavatar/`. Сейчас **отключён**; при включении — передача данных третьей стороне (учесть в политике ПДн, см. [[Информационная безопасность (apelsincom)]]).
## См. также
- [[REST API (richcode.api)]]
- [[Серверная логика и php_interface (apelsincom)]]
- [[Кэширование и обслуживание (apelsincom)]]
@@ -0,0 +1,54 @@
# Инфоблоки и каталог (apelsincom)
Контент товаров хранится в инфоблоках Битрикса. Главный — **каталог, ID 2** (тип `catalog`). Номер и коды свойств взяты из параметров компонента `bitrix:catalog` в `catalog/index.php`.
> [!warning] IBLOCK_ID = 2 зашит в коде
> Номер инфоблока каталога прописан прямо в вызовах компонентов (в `catalog/index.php`, `header.php` и шаблонах). Если каталог придётся пересоздавать под другим ID — искать и править во многих местах, включая [[REST API (richcode.api)]]. См. [[Известные проблемы и рекомендации (apelsincom)]].
## Модель товара
- Товары — элементы инфоблока 2.
- Включены **торговые предложения (SKU)**: один товар (модель) имеет варианты по **размеру** и **цвету**. Дерево строится по свойствам `SIZES_SHOES`, `SIZES_CLOTHES`, `COLOR_REF`.
- Цена — тип **BASE**, НДС включён.
- Остатки — по складам модуля `storeassist` (в карточке блок «Наличие на складах»).
## Свойства товара (элемента)
| Код | Что это |
|---|---|
| `ARTNUMBER` | Артикул |
| `MANUFACTURER` | Производитель |
| `MATERIAL` | Материал |
| `BRAND_REF` | Бренд (привязка) |
| `MORE_PHOTO` | Доп. фотографии (галерея) |
| `NEWPRODUCT` | Флаг «Новинка» |
| `SALELEADER` | Флаг «Хит продаж» |
| `SPECIALOFFER` | Флаг «Спецпредложение» |
## Свойства предложения (SKU)
| Код | Что это |
|---|---|
| `SIZES_SHOES` | Размер обуви |
| `SIZES_CLOTHES` | Размер одежды |
| `COLOR_REF` | Цвет (привязка к справочнику) |
| `ARTNUMBER` | Артикул варианта |
| `MORE_PHOTO` | Фото варианта |
В корзину как свойства пишутся `SIZES_SHOES`, `SIZES_CLOTHES`, `COLOR_REF`.
## Свойство раздела
| Код | Что это |
|---|---|
| `UF_SHOW_IN_MENU` | Показывать раздел в боковом меню (читает `bitrix:catalog.section.list`) |
## ЧПУ каталога
Компонент `bitrix:catalog` работает в SEF-режиме, папка `/catalog/`. Адреса: раздел `#SECTION_CODE_PATH#/`, товар `#SECTION_CODE_PATH#/#ELEMENT_CODE#/`, фильтр `…/filter/#SMART_FILTER_PATH#/apply/`. Поэтому у разделов и товаров обязателен **символьный код**. Подробнее — [[Маршрутизация и ЧПУ (apelsincom)]].
> [!info] Что осталось проверить
> Типы свойств, привязки к справочникам (highload-блоки цвета/бренда) и полный список инфоблоков по файлам не видны — это смотрят в админке (Контент → Инфоблоки) или в структуре БД. Здесь зафиксированы только коды, реально используемые в коде.
## См. также
- [[Компоненты и шаблоны компонентов]]
- [[Сценарии. Товары и разделы]]
- [[REST API (richcode.api)]]
@@ -0,0 +1,49 @@
# Информационная безопасность (apelsincom)
> [!warning] Гриф: internal
> Эта заметка описывает устройство защиты и слабые места — она полезна и защищающему, и атакующему. Не публиковать, доступ по необходимости. Секреты (пароли, токены, ключи) здесь не приводятся — только указание, где они лежат. Оперативный список того, что чинить, — в [[Известные проблемы и рекомендации (apelsincom)]].
## Активы и границы
Что защищаем:
- **Данные покупателей** — заказы, кабинеты (ПДн, см. ниже про 152-ФЗ).
- **Коммерческие данные** — каталог, цены, остатки, выгрузки поставщиков.
- **Доступ к управлению** — FTP, БД MySQL, админка, а также **токены REST API** (`richcode.api`).
- **Целостность сайта и API** — защита от подмены кода и несанкционированных вызовов.
Точки входа: публичный веб (HTTPS), админка `/bitrix/admin/`, FTP (порт 21), **внешний API `/api/`**, штатный `/rest/`, интеграции (1С, Яндекс.Маркет, Битрикс24). Секреты — в `bitrix/.settings.php`, `bitrix/php_interface/dbconn.php`, `bitrix/license_key.php`.
## Модель нарушителя
- **Внешний аноним** — сканирует пути Битрикса, ищет открытые бэкапы/дампы, пробует API без токена.
- **Обладатель утёкшего токена API** — действует от имени пользователя-владельца токена (права = права этого пользователя).
- **Скомпрометированный FTP/админ-доступ** — полный контроль.
## Угрозы и меры (прослеживаемость «угроза → мера»)
| Угроза | Мера | Статус |
|---|---|---|
| Раскрытие данных: бэкап `shoes.zip` и фиды в webroot | убрать из публичного доступа | **нарушено**, см. [[Известные проблемы и рекомендации (apelsincom)]] |
| Несанкционированный вызов API | токен-авторизация + белый список IP + CORS + только HTTPS (опции `richcode.api`) | включённость проверить |
| Утечка/подбор токена API | хранить токен как секрет, ротация, минимальные права пользователя-владельца | зависит от эксплуатации |
| Перехват доступа | FTPS/SFTP вместо FTP, HTTPS для API (`ONLY_HTTPS_EXCHANGE`) | FTP по 21, требует действий |
| Утечка ПДн через лог API | не логировать лишнее; ограничить доступ к HL-блоку лога | при включённом `LOGGING` |
| Инъекции/XSS, устаревшие уязвимости | актуальная версия Битрикса, «Проактивная защита» (WAF) | версия свежая; фильтр проверить |
| Подмена файлов ядра/шаблонов | контроль целостности, отказ от правок ядра, работа в `/local/` | базово соблюдается |
| Захват админки | сложные пароли, OTP, ограничение по IP | OTP-модуль есть, статус проверить |
## Приоритет для этого сайта — API
Так как наружу торчит REST API, именно он — главная нестандартная поверхность атаки. Проверьте в настройках `richcode.api`:
- `ONLY_HTTPS_EXCHANGE` — включён;
- белый список IP (`USE_WHITE_LIST_ADDRESS_FILTER`) — если API вызывает известная система;
- CORS-домены — ограничены;
- токены выданы точечно, пользователи-владельцы (поле `UF_API_TOKEN`) имеют минимальные права и состоят только в нужной группе.
> [!warning] Токен передаётся в URL
> Рабочий код `richcode.api` берёт токен из **сегмента URL**, а не из заголовка. Значит, токен попадает в логи веб-сервера, в реферер и в собственный лог модуля (HL-блок при включённом `LOGGING`). Ограничьте доступ к логам, не включайте лишнее логирование, регулярно перевыпускайте токены. Детали — [[REST API — методы и примеры (richcode.api)#Авторизация и фильтры]].
## Персональные данные (152-ФЗ)
Сайт собирает ПДн (заказы, заявки, кабинет). В подвале есть PDF политики и согласия (`/upload/docs/`). Проверьте: собирается ли согласие в формах, актуальны ли реквизиты оператора, отражена ли передача данных третьим лицам (Битрикс24, Яндекс.Маркет, виджет higgleby.tech), определён ли уровень защищённости ИСПДн (для РФ — ПП №1119, меры приказа ФСТЭК №21).
## См. также
- [[Известные проблемы и рекомендации (apelsincom)]]
- [[REST API (richcode.api)]]
- [[Доступы и окружение (apelsincom)]]
@@ -0,0 +1,36 @@
# Источники и метод проверки (apelsincom)
Как собиралась эта документация и что стоит за каждым утверждением.
## Метод
- Доступ к серверу — **по FTP, только на чтение**. Выполнялись лишь листинг и скачивание файлов (`LIST`/`RETR`). **На сервере ничего не создавалось, не менялось и не удалялось.**
- Скачивались небольшие несекретные файлы: конфиги маршрутизации, шаблон и его JS, версия ядра, код модуля `richcode.api`, сервисы.
- Файлы с секретами (`bitrix/.settings.php`, `dbconn.php`, `.config.php`, `license_key.php`) **не выгружались и не приводятся** — задокументирована только их роль.
- Крупный архив `shoes.zip` и медиа не скачивались.
- Данные из БД (значения токенов, точные настройки модулей и обмена, включённость мер защиты) при разборе недоступны — такие места помечены «проверить».
## Ключевые первоисточники (файлы на сервере)
| Утверждение | Источник |
|---|---|
| Bitrix 25.100.500 | `bitrix/modules/main/classes/general/version.php` |
| БД MySQL 8 (utf8mb4) | `bitrix/php_interface/after_connect_d7.php` |
| Маршрутизация, HTTPS | `.htaccess`, `urlrewrite.php` |
| Каталог: ИБ 2, SKU, свойства, ЧПУ | `catalog/index.php` |
| Кастомизация только в шаблонах компонентов | дерево `local/templates/custom/components/`, пустые `local/php_interface` и `local/components` |
| Поведение фронта | `local/templates/custom/js/script.js` |
| Внешний REST API: версия, роутинг, авторизация, опции | `bitrix/modules/richcode.api/` (`install/version.php`, `include.php`, `options.php`, `lib/core/Route.php`, `Init.php`, `Tokens.php`, `Response.php`) |
| REST API: точные действия и параметры контроллеров | `lib/{iblock,sale,main,crm}/controllers/*.php` (карты `$aliases`) |
| Импорт 1С / экспорт Я.Маркет | `bitrix/php_interface/include/catalog_import|catalog_export/` |
| Обмен с Битрикс24 | `bitrix/services/sale/b24integration/push.php` |
| Сервис Я.Маркета | `bitrix/services/ymarket/index.php` |
## Что осталось непроверенным (нужен доступ в админку/БД)
- Версия PHP; включённость «Проактивной защиты» и OTP.
- Точный `API_PATH`, список токенов и прав пользователей `richcode.api`; включены ли HTTPS-only, IP-фильтры, CORS.
- Схемы полей тела запросов `add`/`update`/`create` (в моделях `lib/*/models/`) — действия проверены, детальный формат полсвойств — нет.
- Настроенные профили обмена 1С и фиды Яндекс.Маркета; активные агенты/cron.
- Типы и привязки свойств инфоблока 2 (highload-справочники).
## Обновление
При изменениях (новая версия платформы, новые интеграции, смена шаблона) обновляйте соответствующие заметки. Точка входа — [[Магазин обуви (apelsincom) — Обзор]].
@@ -0,0 +1,55 @@
# Компоненты и шаблоны компонентов
Компонент в Битриксе — готовый блок, который что-то выводит (каталог, меню, форму). На этом сайте **своих компонентов нет** (`/local/components/` пуст). Вместо этого используются штатные компоненты Битрикса, но с **переопределёнными шаблонами**, которые лежат в шаблоне сайта:
```
local/templates/custom/components/bitrix/<компонент>/<шаблон>/
```
Именно здесь ведётся почти вся фронтовая доработка. Логику вывода правят тут, а не в ядре.
## Из чего состоит шаблон компонента
Файлы внутри папки шаблона (стандарт Битрикса — полезно знать):
| Файл | За что отвечает |
|---|---|
| `template.php` | сама вёрстка (HTML + вывод `$arResult`) |
| `result_modifier.php` | правка данных `$arResult` перед выводом — «серверная логика» шаблона |
| `component_epilog.php` | код после кэша (то, что не должно кэшироваться) |
| `.parameters.php` | параметры шаблона для админки |
| `style.css` / `script.js` | стили и скрипт шаблона |
| `lang/` | языковые фразы |
> [!tip] Где искать логику
> Раз своего `init.php` нет, «где данные подхватываются и меняются» смотрите в `result_modifier.php` и `component_epilog.php` конкретного шаблона. Это местная замена серверных обработчиков.
## Переопределённые компоненты витрины
| Компонент | Активный шаблон | Где используется | Инфоблок |
|---|---|---|---|
| `bitrix:catalog` | `catalog_custom` | каталог `/catalog/` (комплексный: список, карточка, фильтр) | 2 |
| `bitrix:catalog.section` | `custom`, `custom_similar` | списки товаров, «похожие» | 2 |
| `bitrix:catalog.element` | `custom` | карточка товара (template.php ~35 КБ, script.js) | 2 |
| `bitrix:catalog.section.list` | `aside_menu`, `home_categories`, `popular_categories`, `custom_tags` | боковое меню и блоки категорий | 2 |
| `bitrix:catalog.smart.filter` | `custom`, `catalog-custom` | умный фильтр | 2 |
| `bitrix:news.list` | `custom_main_slider` | баннер-слайдер на главной | слайдер |
| `bitrix:form.result.new` | `feedback` | форма (заявка/обратная связь) | веб-форма |
| `bitrix:menu` | `custom`, `footer_custom` | верхнее и нижнее меню | — |
| `bitrix:search.page` | `custom_input`, `custom_page` | поиск в шапке и на странице поиска | 2 |
| `bitrix:breadcrumb` | `custom` | хлебные крошки | — |
| `bitrix:main.include` | — | подключение областей из `/include/` | — |
Какой компонент к какому адресу — в [[Маршрутизация и ЧПУ (apelsincom)]]; модель данных каталога — в [[Инфоблоки и каталог (apelsincom)]].
## Include-области
Мелкие переиспользуемые куски вёрстки — в `public_html/include/`, подключаются через `bitrix:main.include`. Там: логотип (`logo*.php`), баннер (`main_banner.php`), SEO-текст (`sect_bottom.php`), копирайт, соцсети, кнопки маркетплейсов (`ozon_btn.php`, `wb_btn.php`), тексты (`info.php`, `feedback.php`), «просмотренные товары». Правятся файлом или областью в админке.
> [!warning] Грабли шаблонов
> - Рядом с активными шаблонами (`custom`) лежат исходные `bootstrap_v4` из решения eShop. Правите не тот — изменений не видно. Всегда сверяйтесь, какой шаблон указан в вызове компонента.
> - В `catalog.smart.filter/custom` лежит мусорный файл-дубль `template copy 1.php` — не рабочий, легко перепутать с `template.php`.
## См. также
- [[Шаблон custom]]
- [[Инфоблоки и каталог (apelsincom)]]
- [[Маршрутизация и ЧПУ (apelsincom)]]
- [[Известные проблемы и рекомендации (apelsincom)]]
@@ -0,0 +1,39 @@
# Кэширование и обслуживание (apelsincom)
Рутинные операции сопровождения.
## Кэш
Компоненты кэшируются надолго — в вызовах `CACHE_TIME` стоят десятки миллионов секунд (`CACHE_TYPE = A`, автокэш). Поэтому правки контента и шаблонов могут не сразу отражаться на витрине.
Сбросить кэш:
- Админка → Настройки → Настройки продукта → **Автокеширование** (или «Сбросить весь кеш»).
- Файлово кэш лежит в `bitrix/cache/`, `bitrix/managed_cache/`, `bitrix/stack_cache/`. Чистить руками по FTP — крайняя мера.
> [!info] Композитного кэша не видно
> Папки `bitrix/html_pages/` (композитный сайт) в структуре нет — похоже, композит выключен или не сгенерирован. Если понадобится ускорение, это отдельная настройка (Настройки → Композитный сайт). **Проверить.**
## Картинки
Ресайзы Битрикса складываются в `upload/resize_cache/`. Отдельной генерации webp (как бывает на других проектах) в коде не замечено.
## Обновления платформы
- Ставятся через SiteUpdate: Настройки → Обновление платформы. Логи — `bitrix/modules/updater.log`, `updater_partner.log`.
- Текущая версия свежая (главный модуль 25.100.500, 2025-06-07) — это плюс к безопасности.
- Перед обновлением — резервная копия и проверка совместимости шаблона и модуля `richcode.api`.
## Cron и агенты
Импорт/экспорт каталога (1С, Яндекс.Маркет) запускаются по расписанию — через агенты Битрикса и/или системный cron (`cron_frame.php` в `php_interface/include/*`). Список активных агентов — Настройки → Настройки продукта → Агенты. **Проверить**, что нужные включены и отрабатывают.
## Логи
- Ошибки веб-сервера — `error_log` в корне аккаунта (+ архивы `error_log-*.gz`).
- Лог API-запросов — в highload-блоке, если включён (см. [[REST API (richcode.api)#Логирование]]).
- Логи обновлений и проверки системы — в `bitrix/`.
## Резервные копии
Штатный модуль резервного копирования или средства хостинга.
> [!warning] Бэкап не в webroot
> Готовые бэкапы нельзя оставлять в публичной папке — станут доступны по прямой ссылке. Сейчас это нарушено (`public_html/shoes.zip`, ~1.27 ГБ). См. [[Известные проблемы и рекомендации (apelsincom)]].
## См. также
- [[Интеграции (apelsincom)]]
- [[Известные проблемы и рекомендации (apelsincom)]]
@@ -0,0 +1,47 @@
# Документация сайта (магазин обуви apelsincom) — для разработчика
Это техническая документация интернет-магазина обуви на 1С-Битрикс (хостинг-аккаунт `apelsincom`, стенд `shoes1.orangedm.agency`, агентство OrangeDM). Она написана для веб-разработчика, который будет сопровождать и дорабатывать сайт **по FTP**, без опоры на админку. Задача — чтобы новый человек разобрался сам, не обращаясь к прежней команде.
Я разбирался по коду и файлам через FTP (только чтение, на сервере ничего не менял). Всё, что хранится в базе (точные настройки модулей, значения токенов, включённость мер защиты), по файлам не видно — такие места помечены как «проверить». Как и что проверялось — в [[Источники и метод проверки (apelsincom)]].
> [!info] Главная особенность этого сайта
> Кроме обычной витрины, сайт работает как **API-бэкенд**: сторонний модуль `richcode.api` отдаёт наружу REST-интерфейс к товарам, заказам, складам и пользователям. Скорее всего, именно поэтому «работа без админки» — данными управляют через API. Начните с [[REST API (richcode.api)]].
Впервые на проекте — идите в [[Быстрый старт для нового разработчика (apelsincom)]]. Совсем коротко — [[#Самое важное, если коротко]] ниже.
## С чего начать
- [[Быстрый старт для нового разработчика (apelsincom)]] — что делать в первый день
- [[Доступы и окружение (apelsincom)]] — сервер, FTP, домен, версии
## Как устроен сайт
- [[Архитектура и структура каталогов (apelsincom)]] — общая картина и правило «всё в /local/»
- [[Шаблон custom]] — шапка, подвал, подключение стилей, поведение на JS
- [[Компоненты и шаблоны компонентов]] — где вёрстка и данные каждого блока
- [[Инфоблоки и каталог (apelsincom)]] — модель товаров, размеры, цвета
- [[Маршрутизация и ЧПУ (apelsincom)]] — как адрес превращается в страницу
- [[Серверная логика и php_interface (apelsincom)]] — что выполняется на каждой странице
## Технические подсистемы
- [[REST API (richcode.api)]] — самое интересное: внешний API к сайту
- [[REST API — методы и примеры (richcode.api)]] — справочник действий и примеры `curl`
- [[Интеграции (apelsincom)]] — 1С, Яндекс.Маркет, Битрикс24, мобильное приложение
- [[Кэширование и обслуживание (apelsincom)]] — кэш, обновления, cron
## Работа с сайтом
- [[Сценарии. Товары и разделы]] — как добавить/изменить элемент и раздел (через API и код)
## Безопасность
- [[Информационная безопасность (apelsincom)]] — модель угроз и меры
- [[Известные проблемы и рекомендации (apelsincom)]] — грабли и что чинить в первую очередь
## Справочники
- [[Справочник — что где лежит (apelsincom)]]
- [[Глоссарий (apelsincom)]] — термины Битрикса
- [[Источники и метод проверки (apelsincom)]]
## Самое важное, если коротко
1. Сайт на Битриксе, главный модуль **25.100.500** (2025). Все доработки — в `/local/`, ядро `/bitrix/` не трогаем.
2. Каталог товаров — **инфоблок ID 2** (тип `catalog`), с торговыми предложениями (размер, цвет). Номер зашит в коде во многих местах — см. [[Известные проблемы и рекомендации (apelsincom)]].
3. Своих компонентов и `init.php` в `/local/` **нет**. Вся кастомизация — в переопределённых шаблонах штатных компонентов (`/local/templates/custom/components/`). См. [[Компоненты и шаблоны компонентов]].
4. Наружу торчит **REST API** (`richcode.api 3.1.5`) по пути вида `/api/…` с токенной авторизацией. Это чувствительная точка входа — [[REST API (richcode.api)]] и [[Информационная безопасность (apelsincom)]].
5. Внимание: в webroot лежит полный бэкап `shoes.zip` (~1.27 ГБ). Убрать в первую очередь — [[Известные проблемы и рекомендации (apelsincom)]].
@@ -0,0 +1,42 @@
# Маршрутизация и ЧПУ (apelsincom)
Как адрес в браузере превращается в страницу. Проверено по `.htaccess` и `urlrewrite.php`.
## Цепочка обработки (`.htaccess`)
1. **Принудительный HTTPS** — любой http-запрос получает 301 на https.
2. Существующий файл/папка отдаётся напрямую.
3. Иначе запрос уходит в `bitrix/urlrewrite.php` — механизм ЧПУ (SEF) Битрикса.
4. Если совпадения нет — на `/index.php`.
5. Ошибка 404 → `/404.php`. Листинг директорий запрещён (`Options -Indexes`). Статике заданы сроки кэша.
## Таблица SEF-маршрутов (`urlrewrite.php`)
| Условие URL | Компонент/обработчик | Файл |
|---|---|---|
| `/catalog/` | `bitrix:catalog` | `/catalog/index.php` |
| `/store/` | `bitrix:catalog.store` | `/store/index.php` |
| `/personal/order/` | `bitrix:sale.personal.order` | `/personal/order/index.php` |
| `/personal/` | `bitrix:sale.personal.section` | `/personal/index.php` |
| `/news/` | `bitrix:news` | `/news/index.php` |
| `/rest/` | сервис REST Битрикса | `/bitrix/services/rest/index.php` |
| `/bitrix/services/ymarket/` | выгрузка/заказы Яндекс.Маркета | `/bitrix/services/ymarket/index.php` |
| `/mobileapp/jn/…` | мобильное приложение | `/bitrix/services/mobileapp/jn.php` |
> [!info] API richcode.api — отдельно от urlrewrite
> Внешний REST-интерфейс (`richcode.api`, путь по умолчанию `/api/`) перехватывается **не** через `urlrewrite.php`, а обработчиком самого модуля на старте страницы. Подробнее — [[REST API (richcode.api)]].
## ЧПУ внутри каталога
`bitrix:catalog` в SEF-режиме строит адреса по символьным кодам (из `catalog/index.php`):
- раздел: `#SECTION_CODE_PATH#/`
- товар: `#SECTION_CODE_PATH#/#ELEMENT_CODE#/`
- фильтр: `#SECTION_CODE_PATH#/filter/#SMART_FILTER_PATH#/apply/`
Поэтому у каждого раздела и товара обязателен заполненный **символьный код** — иначе ЧПУ-адрес не построится.
> [!warning] Если новый раздел с ЧПУ не открывается
> `urlrewrite.php` Битрикс генерирует сам при настройке компонентов. После структурных изменений пересоберите правила: Настройки → Настройки продукта → Обработка адресов (или пересохраните страницу с компонентом). Правило вручную обычно не пишут.
## См. также
- [[Инфоблоки и каталог (apelsincom)]]
- [[REST API (richcode.api)]]
- [[Архитектура и структура каталогов (apelsincom)]]
@@ -0,0 +1,40 @@
# Серверная логика и php_interface (apelsincom)
Где на этом сайте выполняется серверный код помимо шаблонов. Короткий ответ: **своей серверной логики в `/local/` почти нет** — это отличает проект от типового Битрикс-сайта.
## Чего НЕТ (и это важно знать)
- `/local/php_interface/`**пусто**. Своего `init.php` с обработчиками событий и агентами нет.
- `/local/components/`**пусто**. Своих компонентов нет.
Поэтому не ищите бизнес-логику в `init.php` — её там нет. Она размазана по трём местам:
1. **Шаблоны компонентов** (`result_modifier.php`, `component_epilog.php`) — см. [[Компоненты и шаблоны компонентов]].
2. **Модуль `richcode.api`** — вся API-логика в `bitrix/modules/richcode.api/lib/` — см. [[REST API (richcode.api)]].
3. **Штатные механизмы Битрикса** — импорт/экспорт, обмен, агенты.
## Ядро: `bitrix/php_interface`
Это часть ядра, но пригодится:
| Файл | Назначение |
|---|---|
| `dbconn.php` | подключение к БД. **Чувствительно** (реквизиты) — не выносить в публичные бэкапы |
| `after_connect_d7.php` | SQL после коннекта: `SET NAMES 'utf8mb4' COLLATE 'utf8mb4_0900_ai_ci'` (отсюда вывод — MySQL 8) |
| `include/catalog_import/` | раннеры импорта: CommerceML (1С), CSV, `cron_frame.php` |
| `include/catalog_export/` | раннеры экспорта: Яндекс.Маркет (YML), Froogle, CSV, `cron_frame.php` |
Импорт/экспорт запускаются по расписанию (cron/агенты) — см. [[Интеграции (apelsincom)]] и [[Кэширование и обслуживание (apelsincom)]].
## Конфигурация
- `bitrix/.settings.php` (D7) и `bitrix/.config.php` — подключения, кэш, криптоключи. **Чувствительно**, значения в документации не приводятся.
- `bitrix/license_key.php` — лицензионный ключ.
> [!tip] Если нужно добавить свою логику
> Делайте это по-битриксовому, не трогая ядро:
> - обработчики событий — создать `local/php_interface/init.php` и регистрировать через `EventManager`/`AddEventHandler`;
> - свои компоненты — `local/components/`;
> - свои модули — `local/modules/`.
> Так правки переживут обновление платформы.
## См. также
- [[Компоненты и шаблоны компонентов]]
- [[REST API (richcode.api)]]
- [[Интеграции (apelsincom)]]
@@ -0,0 +1,36 @@
# Справочник — что где лежит (apelsincom)
Быстрый указатель. Пути от корня `public_html/`.
| Что нужно | Где это |
|---|---|
| Главная страница | `index.php` |
| Каталог | `catalog/index.php` (компонент `bitrix:catalog`, ИБ 2) |
| Редиректы и ЧПУ | `.htaccess`, `urlrewrite.php` |
| Страница 404 | `404.php` |
| Логотип, баннер, контакты, кнопки маркетплейсов | `include/` |
| Шаблон сайта | `local/templates/custom/` (имя `reborn_template`) |
| Шапка / подвал | `local/templates/custom/header.php` / `footer.php` |
| Поведение фронта (JS) | `local/templates/custom/js/script.js` |
| Переопределённые шаблоны компонентов | `local/templates/custom/components/bitrix/` |
| Свои компоненты | **нет** (`local/components/` пуст) |
| Свой init.php / события | **нет** (`local/php_interface/` пуст) |
| Внешний REST API | `bitrix/modules/richcode.api/` |
| Подключение БД | `bitrix/php_interface/dbconn.php` (чувствительно) |
| Кодировка соединения БД | `bitrix/php_interface/after_connect_d7.php` |
| Импорт из 1С (CommerceML), CSV | `bitrix/php_interface/include/catalog_import/` |
| Экспорт (Яндекс.Маркет YML) | `bitrix/php_interface/include/catalog_export/`, `bitrix/catalog_export/` |
| Обмен с Битрикс24 | `bitrix/services/sale/b24integration/` |
| Сервис Яндекс.Маркета | `bitrix/services/ymarket/` |
| Мобильное приложение | `bitrix/services/mobileapp/jn.php` |
| Файлы обмена/фиды | `upload/xml/`, `upload/bitrix_import.csv` |
| Картинки инфоблоков / ресайзы | `upload/iblock/`, `upload/resize_cache/` |
| Юридические PDF (ПДн) | `upload/docs/` |
| Конфиг ядра (чувствительно) | `bitrix/.settings.php`, `bitrix/.config.php`, `bitrix/license_key.php` |
| Кэш | `bitrix/cache/`, `bitrix/managed_cache/`, `bitrix/stack_cache/` |
| Логи ошибок | `error_log` (корень аккаунта) |
| Бэкап (убрать!) | `public_html/shoes.zip` — см. [[Известные проблемы и рекомендации (apelsincom)]] |
## См. также
- [[Архитектура и структура каталогов (apelsincom)]]
- [[Магазин обуви (apelsincom) — Обзор]]
@@ -0,0 +1,40 @@
# Сценарии. Товары и разделы
Как добавить или изменить товар и раздел каталога. Два пути в зависимости от доступа: через REST API и через код (D7). Модель данных — [[Инфоблоки и каталог (apelsincom)]].
> [!info] Про админ-панель
> Этот проект сопровождается **без админки** — только по FTP/коду и через REST API. Поэтому пошаговых сценариев «через админку» здесь нет. Всё, что делается кнопками в `/bitrix/admin/`, ниже описано на уровне API и кода. Что и где хранится в БД (и требует доступа в админку для проверки) — помечено в [[Источники и метод проверки (apelsincom)]].
> [!warning] Осторожно с символьным кодом
> Символьный код (латиницей) обязателен у товара и раздела — он идёт в ЧПУ-адрес. Смена кода у раздела/товара с уже проиндексированными адресами ломает ссылки (старые → 404). Меняете — настройте редиректы.
## Вариант A. Через REST API
Модуль `richcode.api` умеет создавать и править элементы каталога, разделы, остатки и заказы. Полный справочник действий и примеры — [[REST API — методы и примеры (richcode.api)]].
- **Каталог (инфоблок 2) — только через `sale/product`:** `add`, `update`, `delete`, `get`, `list`, а также `section.add`, `section.list`. Контроллер `iblock/element` каталог не обслуживает (вернёт ошибку).
- Остатки/склады: `sale/store``set.amount`.
- Обычные (не каталог) инфоблоки: `iblock/element` — те же действия.
- Нужны: включённый API, путь (`/api/`), токен пользователя (`UF_API_TOKEN`) с правами на инфоблок 2 и членством в заданной группе.
Пример — создать товар в каталоге (инфоблок 2), тело обёрнуто в `fields`:
```bash
curl -X POST "https://<домен>/api/sale/<TOKEN>/product/add" \
-H "Content-Type: application/json" \
-d '{"fields":{"IBLOCK_ID":2,"NAME":"Кроссовки Модель X","CODE":"krossovki-model-x","ACTIVE":"Y","PRICE":4990,"CURRENCY":"RUB","QUANTITY":10,"PROPERTY_ARTNUMBER":"ART-001"}}'
```
Полные схемы полей (`product/add`, `order/create`, `section.add`) — [[REST API — методы и примеры (richcode.api)#Точные схемы (проверено по моделям)]].
> [!warning] Права API = права пользователя-токена
> Через API вы действуете от имени пользователя, которому принадлежит токен. Дайте ему ровно те права, что нужны (доступ к инфоблоку 2, к заказам), не больше. См. [[Информационная безопасность (apelsincom)]].
## Вариант B. Через код (D7)
Разовые массовые операции можно делать скриптом на API ядра Битрикс (D7): `CIBlockElement` / `\Bitrix\Iblock\…`. Скрипт кладут вне ядра, номер инфоблока — **2**. Обязательно бэкап перед массовой правкой.
## После любых изменений
- Проверьте, что заполнен символьный код и товар активен.
- Сбросьте кэш каталога — он кэшируется надолго ([[Кэширование и обслуживание (apelsincom)]]).
- Откройте ЧПУ-адрес и карточку: фото, свойства, кнопка «Купить».
## См. также
- [[Инфоблоки и каталог (apelsincom)]]
- [[REST API (richcode.api)]]
- [[Маршрутизация и ЧПУ (apelsincom)]]
@@ -0,0 +1,45 @@
# Шаблон custom
Активное оформление сайта — шаблон `local/templates/custom` (внутреннее имя `reborn_template`, задано в `description.php`). Здесь шапка, подвал, подключение ресурсов, поведение фронта и переопределённые шаблоны компонентов.
## Подключение ресурсов (`header.php`)
Через `Bitrix\Main\Page\Asset` подключаются:
- **Шрифты:** Inter, ProximaNova (локальные, папка `fonts/`), плюс Google Fonts (Roboto, Manrope). В `fonts/` есть и `adihaus` (шрифт в стиле Adidas).
- **CSS:** Fancybox, Swiper, основной `styles.css` (~56 КБ).
- **JS:** jQuery 3.7.1, jQuery UI, Fancybox, Swiper, `jquery.maskedinput`, и свой `js/script.js`.
## Шапка (`header.php`)
- Верхнее меню-ссылки: «О компании», «Контакты», «FAQ».
- Логотип-текст **`GEKKON`** — захардкожен в `header.php`/`footer.php`. Судя по демо-контактам в подвале и реальному домену `shoes1.orangedm.agency`, это, скорее всего, **заглушка шаблона**, а не бренд магазина. Меняется правкой шаблона.
- Поиск — компонент `bitrix:search.page` (шаблон `custom_input`) по инфоблоку каталога (ID 2).
- Боковое меню разделов — `bitrix:catalog.section.list` (шаблон `aside_menu`); в меню попадают разделы со свойством `UF_SHOW_IN_MENU`.
- Хлебные крошки — `bitrix:breadcrumb` (шаблон `custom`), скрыты на главной.
## Подвал (`footer.php`)
- Колонки «Контакты», «FAQ», «Покупка» (ссылки на Ozon, Wildberries, «Заявка на покупку»).
- Нижнее меню — `bitrix:menu` (тип `bottom`, шаблон `footer_custom`).
- Юридические PDF из `/upload/docs/` (политика и согласие на обработку ПДн).
- Подключения областей: `include/copyright.php`, `include/socnet_footer.php`, `include/sect_bottom.php`.
- В самом низу — **закомментированный** внешний виджет «ИИ-стилист» (`odmavatar`). См. [[Интеграции (apelsincom)#Виджет ИИ-стилист]].
> [!warning] Демо-данные в подвале
> Контакты в подвале сейчас заглушечные (`info@catalog.ru`, `+7 (999) 123-45-67`, адрес в Москве). Перед продом заменить — правится в `footer.php` или выносится в `/include/`.
## Поведение фронта (`js/script.js`)
Свой скрипт (~12 КБ, чистый DOM + немного jQuery). Что делает:
- **Мобильное меню-бургер:** открытие/закрытие бокового меню, второй уровень, кнопка «назад», оверлей.
- **Аккордеон подвала** на мобильных (колонки сворачиваются).
- **Панель поиска:** открытие по иконке, фокус в поле, закрытие по Esc.
- **Слайдер баннера** (`.banner-swiper`) на Swiper; на узких экранах прокрутка вертикальная.
- **Галерея товара:** переключение главного фото по миниатюрам, drag-scroll миниатюр.
- **Выбор размера/цвета:** клик по цвету меняет главное фото и галерею (данные берутся из `data-picture` / `data-gallery`).
- **Кастомные мультиселекты** фильтра: клик по опции дёргает `smartFilter.click(checkbox)` — то есть завязан на умный фильтр каталога.
- **Маска телефона** `+7 (h99) 999-99-99` (первая цифра из набора `0,1,3,4,5,6,7,9`).
## Переопределённые шаблоны компонентов
Лежат в `local/templates/custom/components/bitrix/…`. Это основное место кастомизации — подробный разбор в [[Компоненты и шаблоны компонентов]].
## См. также
- [[Компоненты и шаблоны компонентов]]
- [[Архитектура и структура каталогов (apelsincom)]]
- [[Инфоблоки и каталог (apelsincom)]]