Проблема: 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 автоматически:
Видит доступный инструмент
compare_mpz_pricesЧитает его description и понимает, что он подходит
Формирует правильный вызов:
{
"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 руб только на этой позиции
РЕКОМЕНДАЦИИ:
СРОЧНО: Служебное расследование менеджера Иванова И.И.
Проверить все закупки этого менеджера за год
Запросить прайс-листы ООО МетизСнаб
Проверить скидки за объем (должны быть при закупке 900+ шт)
Рассмотреть возможность смены менеджера/поставщика
БЫЛО 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-сервера.
Следующая статья будет про сверку плановой себестоимости - там ещё интереснее, потому что структура данных сложнее (многоуровневые спецификации, подмена материалов, межфилиальные расчёты).
Andriljo
Поздравляю, вы слили данные компании в Claude и нарушили NDA не только своей компании, но и компаний контр-агентов. Данные сессий общения с апи логируются и участвуют в дообучении моделей.
Решение было бы безопасным, скачай вы паблик модель, разверни её инхаус и приладь для анализа и сверки.
KlaudV Автор
Добрый день. Это мой первый опыт в такой разработке. Если подскажите ссылки или как лучше сделать, буду благодарен. Вся информация со стороны компании не нарушает NDA по сути все цены и поставщики доступны в публичном доступе.
Andriljo
Вопрос не только в ценах, но и и в ПлановоЭкономических показателях, иных фин документов и соглашений с контр агентами о распространении такой информации в открытом доступе. Если у вас все это доступно в паблик, вопрос к конкуренции на вашем рынке.