Проблема: 6 часов ручного поиска ошибок

Отдел планово-экономический тратит 6 часов каждый месяц на сверку средневзвешенных цен.Что происходило: Экономист ПЭО каждый месяц выгружал отчет из 1С в Excel и вручную искал аномалии:

  • Почему дюбель подорожал с 1.77 до 25.95 руб? (рост в 13 раз!)

  • Это реальное изменение рыночной цены или ошибка бухгалтера?

  • Может, перепутали единицу измерения (1000 шт → 1 шт)?

  • Или сменили поставщика и забыли согласовать цену?

На каждую подозрительную позицию - открывать документы поступления, смотреть историю, звонить бухгалтеру. Но главное - проверяли только 500 позиций из 16 000. Только основные материалы для производства. Остальное оставалось без контроля. Многие ошибки всплывали уже при закрытии периода.

Решение: Трехуровневая архитектура

Уровень 1: SQL-запрос (1 секунда) :

Вместо того чтобы выгружать все 16 000 позиций, я написал запрос, который сразу находит только проблемные (отклонение задается в ручную):

-- Упрощенная версия для понимания логики
WITH 
-- Декабрь 2024: средневзвешенные цены
FirstPeriod AS (
    SELECT
        _Fld13456RRef AS BranchRef,      -- Филиал
        _Fld13454RRef AS ItemRef,        -- Номенклатура
        _Fld13455RRef AS VariantRef,     -- Характеристика
        SUM(CASE WHEN _RecordKind = 0 THEN _Fld13458 ELSE 0 END) AS PriceFirst
    FROM dbo._AccumRg13453
    WHERE _Period >= '4024-12-01' AND _Period <= '4024-12-31 23:59:59'
    GROUP BY _Fld13456RRef, _Fld13454RRef, _Fld13455RRef
),
-- Январь 2025: средневзвешенные цены  
SecondPeriod AS (
    -- аналогично для января
)
SELECT 
    I._Description AS ItemName,
    B._Description AS BranchName,
    F.PriceFirst,
    S.PriceSecond,
    -- Процент отклонения
    ((F.PriceFirst - S.PriceSecond) / S.PriceSecond * 100) AS DeviationPercent
FROM FirstPeriod F
FULL OUTER JOIN SecondPeriod S ON ...
LEFT JOIN dbo._Reference16 I ON I._IDRRef = F.ItemRef
LEFT JOIN dbo._Reference58 B ON B._IDRRef = F.BranchRef
WHERE ABS((F.PriceFirst - S.PriceSecond) / S.PriceSecond * 100) > 40  -- Только >40%
ORDER BY ABS(DeviationPercent) DESC

Результат: 20 проблемных позиций из 16 000 за 1 секунду.

Важный момент: В 1С даты хранятся со смещением +2000 лет. Декабрь 2024 в БД = 4024-12-01.

Уровень 2: MCP-сервер (Python + FastAPI)

MCP(Model Context Protocol) - это протокол от Anthropic, который позволяет регистрировать инструменты для AI. Claude видит доступные инструменты, их описание и параметры автоматически.

from mcp.server import Server
from mcp.types import Tool

app = Server("1c-rag")

@app.list_tools()
async def list_tools() -> list[Tool]:
    return [
        Tool(
            name="compare_mpz_prices",
            description="""
            ? ФИНАНСОВО-ЭКОНОМИЧЕСКИЙ АНАЛИЗ ЦЕНООБРАЗОВАНИЯ МПЗ
            
            Сравнивает средневзвешенные цены МПЗ между двумя периодами 
            для выявления аномалий, ошибок учёта и необоснованных изменений.
            
            Используй когда:
            - Нужно найти все позиции с отклонениями >N%
            - Получить общую картину по изменениям цен
            - Экспортировать результаты в Excel для детального анализа
            """,
            inputSchema={
                "type": "object",
                "properties": {
                    "first_period": {
                        "type": "string",
                        "description": "Текущий период YYYY-MM (например '2024-12')"
                    },
                    "second_period": {
                        "type": "string", 
                        "description": "Базовый период YYYY-MM (например '2024-11')"
                    },
                    "deviation_threshold": {
                        "type": "number",
                        "description": "Минимальный % отклонения (по умолчанию 40.0)"
                    },
                    "export_to_excel": {
                        "type": "boolean",
                        "description": "Создать Excel файл с результатами"
                    }
                },
                "required": ["first_period", "second_period"]
            }
        ),
        
        Tool(
            name="get_doc_price",
            description="""
            ? ДЕТАЛЬНЫЙ АНАЛИЗ ДОКУМЕНТОВ ПОСТУПЛЕНИЯ
            
            Получает все документы поступления для конкретной позиции.
            Включает:
            - Список документов с ценами, контрагентами, авторами
            - Трендовый анализ за 12 месяцев
            - Выявление паттернов (LADDER, SUDDEN_SPIKE, FRAGMENTATION)
            - Информацию о последней закупке до текущего периода
            
            Используй для расследования аномалий из compare_mpz_prices.
            """,
            inputSchema={
                "type": "object",
                "properties": {
                    "item_code": {
                        "type": "string",
                        "description": "Hex код номенклатуры (из compare_mpz_prices)"
                    },
                    "variant_code": {
                        "type": "string",
                        "description": "Hex код характеристики"
                    },
                    "branch_code": {
                        "type": "string",
                        "description": "Hex код филиала"
                    },
                    "period_start": {
                        "type": "string",
                        "description": "Начало периода YYYY-MM-DD"
                    },
                    "period_end": {
                        "type": "string",
                        "description": "Конец периода YYYY-MM-DD"
                    }
                },
                "required": ["item_code", "variant_code", "branch_code", 
                           "period_start", "period_end"]
            }
        )
    ]

@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
    if name == "compare_mpz_prices":
        result = compare_mpz_prices(**arguments)
        return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))]
    
    elif name == "get_doc_price":
        result = get_doc_price(**arguments)
        return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))]

Что это дает:

Когда я пишу Claude: "Найди все позиции МПЗ с отклонениями >40% за декабрь 2024"

Claude автоматически:

  1. Видит доступный инструмент compare_mpz_prices

  2. Читает его description и понимает, что он подходит

  3. Формирует правильный вызов:

{
  "first_period": "2024-12",
  "second_period": "2024-11", 
  "deviation_threshold": 40.0,
  "export_to_excel": true
}

4. Получает результаты и анализирует

Без MCP пришлось бы писать промпт на 200 строк с примерами вызовов API.

Уровень 3: AI-анализ (Claude через MCP)

Теперь самое интересное - как AI анализирует данные.

Шаг 1: Получение списка проблемных позиций

Я: Проанализируй изменения цен МПЗ за декабрь 2024

Claude: [вызывает compare_mpz_prices("2024-12", "2024-11", 40.0, export_to_excel=True)] Получено 20 позиций с отклонениями >40%:

КРИТИЧЕСКИЕ (требуют НЕМЕДЛЕННОГО исправления):

  • Дюбель гвоздь 6x50: +1366% (1.77 → 25.95 руб) Диагноз: ОШИБКА ЕИ (1000 шт → 1 шт)

  • Изолента ПВХ: +1343% (8.80 → 127.00 руб) Диагноз: ОШИБКА ЕИ (упак → шт)

  • Метизы М6: +111% (2.30 → 4.85 руб) Паттерн: ПОДОЗРЕНИЕ НА ОТКАТ

Создан Excel файл: mpz_analysis2024-12vs_2024-11.xlsx

Скачать:/download/mpz_analysis_202412.xlsx

Шаг 2: Детальное расследование

Для позиции "Метизы М6" Claude автоматически вызывает get_doc_price():

get_doc_price(
    item_code="8bc9a1234567...",  # hex из compare_mpz_prices
    variant_code="0000000...",
    branch_code="abc123...",
    period_start="2024-11-01",
    period_end="2024-11-30"
)

Ответ от MCP-сервера содержит:

{
  "success": true,
  "documents": [
    {
      "document_date": "2024-11-05",
      "document_type": "ПриходОтПоставщика",
      "counterparty": "ООО МетизСнаб",
      "quantity": 100,
      "price_per_unit": 3.50,
      "author": "Иванов И.И."
    },
    {
      "document_date": "2024-11-08",
      "counterparty": "ООО МетизСнаб",
      "quantity": 120,
      "price_per_unit": 3.70,
      "author": "Иванов И.И."
    }
    // ... еще 6 документов
  ],
  "summary": {
    "total_documents": 8,
    "avg_weighted_price": 4.85
  },
  "pattern_analysis": {
    "patterns": [
      {
        "type": "PURCHASE_FRAGMENTATION",
        "severity": "CRITICAL",
        "description": "ПОДОЗРЕНИЕ НА ОТКАТ: Дробление закупок",
        "details": {
          "counterparty": "ООО МетизСнаб",
          "document_count": 8,
          "avg_quantity": 112.5,
          "avg_price_increase_per_doc": 0.20,
          "total_price_increase": 1.40,
          "author": "Иванов И.И."
        }
      }
    ],
    "fraud_risk": "CRITICAL"
  },
  "trend_analysis": {
    "pattern_type": "LADDER",
    "description": "Паттерн 'лесенка' - равномерный рост с шагом 0.20 руб",
    "confidence": "CRITICAL",
    "flags": ["FRAUD_SUSPECT"],
    "recommendations": [
      "??? ПОДОЗРЕНИЕ НА СГОВОР/ОТКАТ!",
      "Признаки:",
      "  - Равномерный рост с шагом 0.20 руб",
      "  - Один поставщик: ООО МетизСнаб",
      "  - Один менеджер: Иванов И.И.",
      "? ДЕЙСТВИЕ: Служебное расследование!"
    ]
  },
  "monthly_data": [
    {"month": "2024-01", "avg_price": 3.20, "supplier": "ООО МетизСнаб"},
    {"month": "2024-02", "avg_price": 3.25, "supplier": "ООО МетизСнаб"},
    // ... 12 месяцев
  ]
}

Шаг 3: AI формирует итоговый отчет

Claude анализирует все паттерны и пишет:

ДЕТАЛЬНЫЙ АНАЛИЗ: Метизы М6 (болт+гайка+шайба)

КРИТИЧНО: Обнаружено дробление закупок + паттерн "ЛЕСЕНКА"

ФАКТЫ:

  • 8 поставок в ноябре вместо одной крупной

  • Средний объем: 112 шт (малые партии)

  • Каждая поставка дороже предыдущей на 0.20 руб

  • Общий рост цены: с 3.50 до 4.90 руб (+40%)

  • Один поставщик: ООО МетизСнаб

  • Один менеджер: Иванов И.И.

ПОДОЗРЕНИЕ НА МОШЕННИЧЕСТВО:

Вместо одной закупки 900 шт по договорной цене 3.50 руб, менеджер разбил на 8 мелких с "накруткой" +0.20 руб каждая.

Возможная схема отката:

  • Договорная цена с поставщиком: 3.50 руб

  • Менеджер договаривается с поставщиком о "премии": 10% от наценки

  • Каждая поставка оформляется дороже → менеджер получает откат

ФИНАНСОВЫЕ ПОТЕРИ:

Переплата в ноябре: (4.85 - 3.50) × 900 шт = 1,215 руб

Годовая переплата (экстраполяция): ~14,500 руб только на этой позиции

РЕКОМЕНДАЦИИ:

  1. СРОЧНО: Служебное расследование менеджера Иванова И.И.

  2. Проверить все закупки этого менеджера за год

  3. Запросить прайс-листы ООО МетизСнаб

  4. Проверить скидки за объем (должны быть при закупке 900+ шт)

  5. Рассмотреть возможность смены менеджера/поставщика

БЫЛО vs СТАЛО

Параметр

БЫЛО

СТАЛО

Время анализа

6 часов

10-15 минут

Охват позиций

500 из 16,000 (3%)

16,000 (100%)

Находит ошибок

~50%

100% + скрытые паттерны

Приоритизация

Нет

CRITICAL→HIGH →MEDIUM

Выявление мошенничества

Нет

Да (LADDER, FRAGMENTATION)

План действий

Нет

Готовый с оценкой ROI

Годовые трудозатраты

72 часа (9 рабочих дней)

4 часа

Заключение

Автоматизация финансового контроля через AI - это не замена людей, а усиление их экспертизы.

Экономисты ПЭО теперь не тратит 6 часов на рутинный поиск отклонений в Excel. Вместо этого они получают за 10-15 минут:

  • Список из 20 проблемных позиций (вместо поиска в 16,000)

  • Готовую классификацию: 3 критичных → разбираем немедленно, 5 высоких → проверяем обоснованность, 12 средних → мониторим

  • Конкретные гипотезы для каждой позиции: "ошибка ЕИ", "подозрение на откат", "необоснованная смена поставщика"

  • Оценку потенциальной экономии по каждой позиции

Он фокусируется не на поиске, а на расследовании - том, где реально нужна человеческая экспертиза.

Что дальше

Сверка средневзвешенной МПЗ - это только первый кейс.

У нас на очереди ещё две задачи от финдиректора:

1. Сверка плановой себестоимости при выпуске продукции

  • Было: 5-6 дней ручной работы

  • Проблема: сложная многоуровневая структура (до 16 уровней вложенности), подмена материалов, распределение по филиалам

  • Цель: автоматизировать поиск аномалий в расчёте себестоимости

2. Сверка маржинальности по заказам

  • Было: 1 день ежемесячно

  • Проблема: поиск заказов с отрицательной или подозрительно низкой маржой

  • Цель: раннее выявление убыточных сделок

3.Сверка остатков нахождение отклонений цены выпуска от цены на конец месяца.

Тот же подход: SQL + MCP + AI-анализ паттернов.

Если у вас похожая задача в 1С (или вы просто хотите обсудить подход) - пишите в комментариях или в личку. Буду рад поделиться опытом и, возможно, кодом MCP-сервера.

Следующая статья будет про сверку плановой себестоимости - там ещё интереснее, потому что структура данных сложнее (многоуровневые спецификации, подмена материалов, межфилиальные расчёты).

Комментарии (3)


  1. Andriljo
    05.01.2026 17:16

    Поздравляю, вы слили данные компании в Claude и нарушили NDA не только своей компании, но и компаний контр-агентов. Данные сессий общения с апи логируются и участвуют в дообучении моделей.

    Решение было бы безопасным, скачай вы паблик модель, разверни её инхаус и приладь для анализа и сверки.


    1. KlaudV Автор
      05.01.2026 17:16

      Добрый день. Это мой первый опыт в такой разработке. Если подскажите ссылки или как лучше сделать, буду благодарен. Вся информация со стороны компании не нарушает NDA по сути все цены и поставщики доступны в публичном доступе.


      1. Andriljo
        05.01.2026 17:16

        Вопрос не только в ценах, но и и в ПлановоЭкономических показателях, иных фин документов и соглашений с контр агентами о распространении такой информации в открытом доступе. Если у вас все это доступно в паблик, вопрос к конкуренции на вашем рынке.