Первоначальная загрузка данных

Важно понимать: Сервис НЕ хранит ваши данные в своей базе. При первом запуске индекс ПУСТ. Вы должны сами загрузить в него свои товары.

Как загрузить данные в сервис

  1. Подготовьте данные — каждый товар должен содержать уникальный идентификатор id (ваш внутренний GUID из 1С) и название name.
  2. Загрузите данные через API — отправьте POST /add с массивом товаров. Размер пакета регулируется параметром server.max_batch_size и лимитом HTTP-тела server.max_request_body_size_mb.
  3. Проверьте результат — 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 товаров):

batchitems/s100k заПримечание
500866~115 сБазовый режим
1 0001 703~58 с
2 0003 380~29 с
5 0008 016~12.5 с
10 00014 121~7.1 с
30 00037 602~2.7 сПри лимите тела 20 МБ — это максимальный работающий batch
50 00049 354~2.0 сТребует поднять max_request_body_size_mb и client_max_body_size до ~64 МБ
100 00052 476~1.9 сОдин запрос на всю пачку; предел CPU/RAM и дисковой подсистемы сервера
Рекомендации для production:
  1. Начните с max_batch_size = 500 и max_request_body_size_mb = 20 (по умолчанию).
  2. Если 1С формирует пакеты крупнее 500 и CPU/SSD сервера позволяют — поднимайте max_batch_size до 1 000–5 000.
  3. Batch больше 5 000 дает выигрыш только при отключенных эмбеддингах и большом лимите тела. При включенных эмбеддингах (PRO) скорость будет ограничена фоновой индексацией векторов, а не размером HTTP-пакета.
  4. При увеличении max_request_body_size_mb не забудьте поднять client_max_body_size в nginx (или другом reverse proxy).
  5. На массовой загрузке отключайте rate limiting: rate_limit_per_minute = 0, а после загрузки возвращайте обратно.
  6. Абсолютный потолок без семантического поиска — ~50–52k items/s. Дальше рост batch не ускоряет загрузку.
Совет для 1С:

При первоначальной загрузке большого справочника (100 000+ записей):

  1. Временно отключите rate limiting: rate_limit_per_minute = 0
  2. Разбейте данные на пакеты по 300–1 000 записей (можно больше, если позволяют настройки и железо).
  3. Добавьте небольшую паузу между пакетами (0.1–0.3 сек), чтобы не перегружать CPU.
  4. После загрузки верните настройки rate limiting обратно.