Первоначальная загрузка данных
Важно понимать: Сервис НЕ хранит ваши данные в своей базе. При первом запуске индекс ПУСТ. Вы должны сами загрузить в него свои товары.
Как загрузить данные в сервис
- Подготовьте данные — каждый товар должен содержать уникальный идентификатор
id(ваш внутренний GUID из 1С) и названиеname. - Загрузите данные через API — отправьте
POST /addс массивом товаров. Размер пакета регулируется параметромserver.max_batch_sizeи лимитом HTTP-телаserver.max_request_body_size_mb. - Проверьте результат —
GET /healthпокажет количество загруженных записей.
Про поле
id — важно:
id— ваш внутренний уникальный идентификатор товара (обычно GUID из 1С). Он обязателен при загрузке через/add.- Если вы повторно загрузите запись с тем же
id, но другим набором полей, старая запись будет полностью перезаписана новыми данными. Сервис сначала удаляет старую версию, затем добавляет новую. - Пустой или отсутствующий
idвызовет ошибку: товар не будет добавлен.
Способы загрузки
Способ 1: Загрузка из CSV файла (через CLI)
# Формат CSV: id,name,code,barcode,art
# Пример: 1C-GUID-001,Болт М16х60 оцинкованный,BOLT-001,4607000010015,78454
sku-cli import --csv items.csv
Если ваш CSV использует разделитель ; вместо ,, задайте его в config.toml:
[csv]
default_delimiter = ";"
sku-cli import при импорте учтет этот параметр.
Способ 2: Загрузка из JSON (через curl)
curl -X POST http://localhost:8080/add \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"id": "1C-GUID-001",
"name": "Болт М16х60 оцинкованный",
"code": "BOLT-001",
"barcode": "4607000010015",
"art": "78454"
},
{
"id": "1C-GUID-002",
"name": "Гайка М16 нержавеющая",
"code": "NUT-001"
}
]
}'
# Тот же запрос через CLI
# Создайте файл items.json:
[
{
"id": "1C-GUID-001",
"name": "Болт М16х60 оцинкованный",
"code": "BOLT-001",
"barcode": "4607000010015",
"art": "78454"
},
{
"id": "1C-GUID-002",
"name": "Гайка М16 нержавеющая",
"code": "NUT-001"
}
]
sku-cli add items.json
Способ 3: Прямо из 1С (через HTTP-запрос)
// Псевдокод 1С
Запрос = Новый HTTPЗапрос();
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Данные = Новый Структура();
Данные.Вставить("items", СписокТоваров); // Массив структур с полями id, name, code...
Запрос.УстановитьТелоИзСтроки(JSON(Данные));
Соединение = Новый HTTPСоединение("localhost", 8080);
Ответ = Соединение.ОтправитьДляОбработки(Запрос, "/add");
Пример для тестовых данных
Если у вас нет своих данных, вот минимальный пример для тестирования:
curl -X POST http://localhost:8080/add \
-H "Content-Type: application/json" \
-d '{
"items": [
{"id": "TEST-001", "name": "Болт М6х30 оцинкованный"},
{"id": "TEST-002", "name": "Болт М8х40 оцинкованный"},
{"id": "TEST-003", "name": "Болт М10х50 нержавеющий"},
{"id": "TEST-004", "name": "Болт М12х60 нержавеющий"},
{"id": "TEST-005", "name": "Болт М16х80 оцинкованный"},
{"id": "TOOL-001", "name": "Перфоратор Bosch GBH 2-26"},
{"id": "FOOD-001", "name": "Молоко пастеризованное 3.2% 1л"}
]
}'
# Тот же запрос через CLI
# Создайте файл items.json:
[
{
"id": "TEST-001",
"name": "Болт М6х30 оцинкованный"
},
{
"id": "TEST-002",
"name": "Болт М8х40 оцинкованный"
},
{
"id": "TEST-003",
"name": "Болт М10х50 нержавеющий"
},
{
"id": "TEST-004",
"name": "Болт М12х60 нержавеющий"
},
{
"id": "TEST-005",
"name": "Болт М16х80 оцинкованный"
},
{
"id": "TOOL-001",
"name": "Перфоратор Bosch GBH 2-26"
},
{
"id": "FOOD-001",
"name": "Молоко пастеризованное 3.2% 1л"
}
]
sku-cli add items.json
Как проверить, что данные загружены
# Проверить количество записей
curl http://localhost:8080/health | jq .db_record_count
# Ожидаем: 7 (или сколько вы загрузили)
# Попробовать найти что-нибудь
curl -X POST http://localhost:8080/find \
-H "Content-Type: application/json" \
-d '{"items":[{"name":"болт"}]}' | jq .
# Тот же запрос через CLI
sku-cli health
Частые ошибки при загрузке:
- Пустой id — сервис вернет ошибку. Каждый товар должен иметь уникальный идентификатор.
- 413 Request Entity Too Large — тело запроса превысило
server.max_request_body_size_mb(по умолчанию 20 МБ). Уменьшите batch или увеличьте лимит вconfig.tomlиnginx.conf. - 400 Bad Request — batch превысил
server.max_batch_size(по умолчанию 500). Разбейте на части или увеличьтеmax_batch_size. - Rate limiting — при большой загрузке установите в конфиге
rate_limit_per_minute = 0. - Данные не сохранились после перезапуска — проверьте путь к индексу в конфиге. Индекс сохраняется на диск.
Производительность массовой загрузки
Размер batch и пропускная способность зависят от:
server.max_batch_size— сколько товаров принимается в одномPOST /add;server.max_request_body_size_mb— максимальный размер HTTP-тела, который готов принять сервис (и reverse proxy, например nginx);- длины полей товаров (
name,supplier, описания и т.п.); - включен ли семантический поиск (PRO) и успевают ли фоновые воркеры строить векторы.
Конфигурация по умолчанию: `max_batch_size = 500`, `max_request_body_size_mb = 20`. Это безопасный выбор для большинства production-установок.
Результаты внутреннего бенчмарка (PRO-версия, семантический поиск отключен, 100 000 товаров):
| batch | items/s | 100k за | Примечание |
|---|---|---|---|
| 500 | 866 | ~115 с | Базовый режим |
| 1 000 | 1 703 | ~58 с | |
| 2 000 | 3 380 | ~29 с | |
| 5 000 | 8 016 | ~12.5 с | |
| 10 000 | 14 121 | ~7.1 с | |
| 30 000 | 37 602 | ~2.7 с | При лимите тела 20 МБ — это максимальный работающий batch |
| 50 000 | 49 354 | ~2.0 с | Требует поднять max_request_body_size_mb и client_max_body_size до ~64 МБ |
| 100 000 | 52 476 | ~1.9 с | Один запрос на всю пачку; предел CPU/RAM и дисковой подсистемы сервера |
Рекомендации для production:
- Начните с
max_batch_size = 500иmax_request_body_size_mb = 20(по умолчанию). - Если 1С формирует пакеты крупнее 500 и CPU/SSD сервера позволяют — поднимайте
max_batch_sizeдо 1 000–5 000. - Batch больше 5 000 дает выигрыш только при отключенных эмбеддингах и большом лимите тела. При включенных эмбеддингах (PRO) скорость будет ограничена фоновой индексацией векторов, а не размером HTTP-пакета.
- При увеличении
max_request_body_size_mbне забудьте поднятьclient_max_body_sizeв nginx (или другом reverse proxy). - На массовой загрузке отключайте rate limiting:
rate_limit_per_minute = 0, а после загрузки возвращайте обратно. - Абсолютный потолок без семантического поиска — ~50–52k items/s. Дальше рост batch не ускоряет загрузку.
Совет для 1С:
При первоначальной загрузке большого справочника (100 000+ записей):
- Временно отключите rate limiting:
rate_limit_per_minute = 0 - Разбейте данные на пакеты по 300–1 000 записей (можно больше, если позволяют настройки и железо).
- Добавьте небольшую паузу между пакетами (0.1–0.3 сек), чтобы не перегружать CPU.
- После загрузки верните настройки rate limiting обратно.