Проблема: 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-сервера.
Следующая статья будет про сверку плановой себестоимости - там ещё интереснее, потому что структура данных сложнее (многоуровневые спецификации, подмена материалов, межфилиальные расчёты).
