Реестр решений¶
В этом документе будут фиксироваться ключевые решения по реализации отчетов и дашбордов.
Текущие решения (на этапе старта)¶
- Формат ведения знаний: OKF (Open Knowledge Format).
- Уровень детализации дашбордов: До уровня «модель-цвет». Размерная сетка исключается для упрощения аналитики (задачи 1.2, 4.4).
- Интерфейс «Что-если» калькулятора (задача 3.6): Должен поддерживать три колонки: «База», «Новый сценарий», «Отклонение (Дельта)».
- Отчётность директоров (задача 3.7): Реализация в Excel/Google Таблицах для возможности гибкого моделирования факта продаж.
2026-06-26 | Дмитрий + Claude (Opus 4.8)¶
- Декомпозиция блоков: принята версия по зависимостям данных с новым Блоком 0 (единый слой данных). Причина: все отчёты опираются на общие мастер-данные (ключ «модель-цвет», цены/скидки/себес), которые Глеб «размазал» по задачам 2.1/3.1/3.2.
- Единый справочник цен/скидок/себестоимости: один источник (DRY), остальные файлы ссылаются. Глеб правит в одном месте.
- Формат Excel: отдельные файлы по блокам + общий
00_Справочники.xlsx; цены считаются формулами из РРЦ и параметров каналов (вручную не вводятся). - Старт: Блок 0 (
00_Справочники.xlsx) — создан, выложен на Drive. - 4-й канал и B2B-скидка: требуют уточнения у Глеба.
- Единый файл задач:
04_Блоки_задачобъединён в03_Задачи(статус-таблица + детали) — статусы ведутся в одном месте. - Реестр классификаторов: константы/справочники вынесены в
07_Справочники_классификаторы(единый источник, выгружается в рабочие Excel). Значения в тексте не дублируем — ссылаемся.
2026-06-26 (II) | Итоговый концепт хранения данных¶
- Единый источник данных — Google Sheets «AGT — Справочники и классификаторы» (заменяет пункт «Формат Excel» выше). Claude читает/пишет через сервис-аккаунт (gspread);
.xlsxоставлен как исходник/резерв. - Доступ к Apps Script настроен через
clasp(OAuth) — для будущих скриптов синхронизации. - Дашборды: созданы примеры-прототипы (Локатор, Остатки по складам, План/Факт, Маржа-калькулятор) с формулами и условным форматированием. Данные демо — заменяются выгрузкой из 1С.
2026-06-29 | Встреча: Глеб Яковлев + Антон Мешков + Дмитрий Пожарский¶
📅 Источник: встреча 29.06.2026, файл
docs/Copy of 260629-1_29_ijunja_26_Gleb_Anton_fin_otchety.txt
Приоритет на 2 недели (до отпуска Дмитрия)¶
- Задачи в работу: 1.2 (Локатор), 1.5 (Себестоимость остатков / Финансовый сток), 2.3 (Планировщик продаж).
- Порядок: 1.2 → 1.5 → 2.3.
- Формат: прототип в Google Sheets (не финальная реализация) → показ → обратная связь → тюнинг.
Определение «свободного стока» (задачи 1.2, 1.5) — согласовано¶
| Сущность | Что берём | Источник |
|---|---|---|
| Свободный сток | «Доступно» (наличие за вычетом всех резервов) | 1С, только склад Шушары + Кировский |
| Транзит FBO | Расходные ордера/заказы МП в статусе не отгружен (все МП кроме статуса «Отгружено») | 1С заказы клиента или расходные ордера |
| FBO (склады МП) | Все статусы остатков МП кроме «Заявки на поставку» (скачиваются по API) | API маркетплейсов |
| Резерв B2B + Дилеры | Заказы клиента в статусе Резерв по подразделениям B2B и Дилеры | 1С заказы клиента |
| Ремонт | Склад «Ожидание ремонта УТК Шушары» (старый — не используем) | 1С |
| Брак | Склад «Брак Шушары» (возврат от покупателей) + «УТК Шушары» (после УТК). Склады Киевская, Кодняковская, Егорова — удалить | 1С |
Важно: «Заявки на поставку» МП (товар, который МП ещё не принял как своё) — не берём, они не скачиваются по API. Это наше пожелание поставить, а не факт.
Серая зона (принято): Товар от ворот склада до момента, когда МП начал принимать — нет источника данных, не критично. Лаг 1–2 недели, на общую картину не влияет.
Статус «Отгружено» в 1С: должен ставиться в последний момент, когда товар физически покинул ворота склада (а не при создании заказа). Нужно уточнить/подкрутить регламент.
Заявки на поставку МП — не скачиваются по API, ручная вставка не нужна (раз в месяц достаточно, можно описать Недашковской).
Логика сущностей в 1С: заказ клиента vs расходный ордер — согласовано¶
- Для МП (FBO/FBS): заказ клиента сразу создаётся в статусе «Отгрузить» (резерв не ставится). Используем заказ клиента в статусе «Отгрузить».
- Для B2B и Дилеров: товар ставится в статус «Резерв» на заказ клиента. Используем заказ клиента в статусе «Резерв».
- Итог: одна сущность — заказ клиента, разбиваем по каналам через подразделение/статус.
Дашборд финансового менеджера (задача 1.5) — уточнён состав¶
Добавить к задаче 1.2: - Резерв B2B и Дилеры — отдельные столбцы (в задаче 1.2 оставить только свободный сток без резервов). - Разбивка брак/ремонт по конкретным складам (см. таблицу выше). - Исторические данные: не делаем сейчас (сложно по МП и резервам; договорились начинать накапливать только после утверждения отчёта).
Планировщик продаж (задача 2.3) — упрощённый вариант для первого этапа¶
- Основная идея: статистика продаж за прошлые 12 мес × мультипликатор = прогноз на 12 мес вперёд.
- Детализация: модель-цвет (без размеров), по каждому каналу отдельная таблица (Беляев, Галягин, и др.), сводная таблица суммирует все каналы.
- Мультипликатор: один коэффициент на каждый месяц (12 коэффициентов на 12 месяцев вперёд, проставляются вручную). Коэффициент умножает продажи аналогичного месяца прошлого года.
- Ценовая часть (информативно): РРЦ текущая + коэффициент скидки канала — только для контроля «бьём ли план в деньгах». Вся цена — информативное поле, штуки — рабочее.
- Итог: сумма штуков за 12 мес + ориентировочная сумма в рублях за год (без помесячной суммы — только штуки по месяцам).
- Совместная работа: каждый директор канала работает в своей таблице, Глеб видит сводник. Механизм: доступы Google Sheets по вкладкам.
- ABC-сортировка: по выручке за последний год, по убыванию. Группировка по категориям — второй волной (нужна классификация от Глеба/Алексея).
- После первого этапа (после отпуска): добавить РРЦ с возможностью изменения + влияние на маржу.
Маржинальный калькулятор (задачи 3.6 / 3.7) — концепт уточнён¶
- Единая сущность РРЦ: отдельная таблица-справочник (Баталов/Глеб вносят РРЦ по позициям на каждый месяц). Эта таблица тянется во все отчёты.
- Себестоимость плановая: фиксируется на период (6–12 мес) Баталовым. Отдельная таблица аналогичной структуры (артикул × месяц). Стартово заливается текущая расчётная себестоимость.
- Что меняют директора канала: только РРЦ (в своей таблице канала). Штуки — зафиксированы после планирования (задача 2.3).
- Что видят директора: как изменение РРЦ влияет на выручку и маржу их канала. Дельта (абсолютная) прибыли — основной показатель.
- Сводник: только у Глеба и Баталова. Отражает суммарный эффект по компании.
- Мотивация продаж: привязывать директоров к марже с фиксированной себестоимостью (они не влияют на неё). Сейчас — только для понимания, мотивация — следующий шаг.
Формат прототипирования — принято¶
- Прототипы в Google Sheets, без автоматических расчётов на первом этапе.
- Показ → обратная связь → итерация. Визуал — критически важен (удобство работы первично).
- Горизонтальное расположение данных (скрываемые группы столбцов) — предпочтительнее переключения вкладок.
2026-07-03 | Дмитрий + Claude (Sonnet 5) — старт реализации задачи 2.3 (Планировщик продаж)¶
- Файл: новый Google Sheets «Калькулятор маржинальности Brodeks» (бывш. «AGT планирование продаж V1») (
1yTZW_8iWFMMsk3JzgIK2CzvawHS2kr-Wov_vxMCrIqs), отдельно от справочной таблицы «AGT — Справочники и классификаторы». - Источники данных — через
pgapiнапрямую (SQL/файлы), без ручного экспорта: - История продаж: SQL к таблице
prodazhi_po_kanalam_only_1c_mt(обновляется ежедневно по cron на офисном сервере) — предпочтительнее ручных xlsx-выгрузок, где это возможно. - Прайс-лист и себестоимость: файлы
Прайс-лист XLSX.xlsxиСебестоимость товаров организаций по брендам - июль 25-дек 25 (XLSX).xlsx— та же логика скачивания, что и в проекте «Отчёт по сравнению остатков склада и организации» (pgapiDownloadFile_). - Остатки — сознательно исключены из этого файла: остатки относятся к отдельной задаче (1.2/1.5, Локатор), а не к планировщику продаж.
- Каналы этого этапа: В2В, Дилеры Brodeks, Розница+Интернет-магазин (объединены в один лист). Ozon и Wildberries — не включены (решение пользователя 03.07.2026, отложено на отдельный этап/проект).
- Себестоимость — расчёт с НДС: добавлен отдельный столбец «с НДС 22%» (ставка фиксированная, копейки отбрасываются —
floor, не округление). Причина: обеим версиям (без/с НДС) нужно быть под рукой для разных расчётов маржи. - Архитектура обновления данных (важное решение, определяет всю дальнейшую разработку):
- Коэффициент прогноза — один на месяц (в строке шапки листа), не персональный на артикул. Это ключевое архитектурное решение: оно делает список товаров (строки) независимым от плана — можно менять/пересортировывать состав строк, не теряя введённые коэффициенты.
- Обновление продаж — только
upsert(не полная перезапись листа), чтобы не терять коэффициенты и не ломать формулы плана. - Пересортировка по ABC и «фиксация плана» — сознательно не автоматические, отдельные явные действия по команде.
- «Фиксация плана» = дублирование листа + перевод формул блока ПЛАН в статические значения (просто дублирование не защищает от изменения формул, ссылающихся на другой лист — прайс-лист).
- Пересчёт плана при правке коэффициента — не требует отдельной кнопки, обычный механизм пересчёта формул Google Sheets.
- Google Sheets: подтверждён лимит 10 млн ячеек на файл (не на лист) — при текущем объёме (~4,6 млн ячеек: продажи 208К×13, три листа каналов по ~6000×100) запас достаточный.
- Следующий шаг (согласовано): Apps Script + лист «Панель» (по аналогии с проектами «FBO Маркетплейсы» / «Отчёт по сравнению остатков») — кнопки для обновления тех. листов, ABC-пересортировки, фиксации плана.
2026-07-03 (II) | Дмитрий + Антон — согласование логики текущих остатков (задачи 1.2/1.5)¶
📅 Источник: Согласование_остатки_03-07-2026_Антон
- Ограничение точности: точный остаток («склад минус отгружается минус резерв») снимается только на текущий момент — статусы резерв/отгружается не восстанавливаются на произвольную историческую дату.
- Формула остатка 1С: Остаток на складе − товар отгружается − товар в резерве = доступный остаток. По списку складов (см. ниже).
- Лого-подрядчики: товары на логотипировании у переработчиков — данные сейчас не собираются, требуется отдельная проработка сбора (новый открытый вопрос).
- МП (Ozon + WB, 4 кабинета): остаток на МП без учёта товара в заявках — товар в пути до МП уже учтён в отчёте МП, столбец «Товары в пути». Подтверждает решение 29.06 (заявки на поставку не берём).
- Расходные ордера до статуса «Отгружено»: отдельно не анализируем — дублировало бы то, что уже учтено в отчёте МП. Упрощает архитектуру транзита FBO по сравнению с планом от 29.06 (там предполагался отдельный расчёт по заказам клиента в статусе «Отгрузить»).
- Список складов «текущих остатков» (Антон подтвердил): Рекламация (Шушары), Ожидание ремонта / Поступление товара / Сборка-проведение ОТК / Сборка-проведение ремонта / Брак (все — склад ОТК Шушары), Центральный склад СПб Шушары (О) — плюс склад магазина Егорова, шоурум Мск, товародвижение Егорова, будущий склад «Bro Егорова» (уточняется).
- ⚠️ Не устранённое расхождение с решением 29.06.2026: тогда склады Егорова договорились удалить из брака; сегодня Антон добавляет склады Егорова обратно — уже в контур «текущих остатков» (не «брак»), возможно, это разные вещи (разные склады с похожим названием) — требует уточнения, не разрешал самостоятельно. Также склад «Кировский» из 29.06 в новом списке не упомянут — уточнить, входит ли он в «Центральный склад СПб Шушары» или это отдельная позиция, которая выпала.
2026-07-03 (III) | Дмитрий + Claude — план архитектуры загрузки данных (не реализовано, план на будущее)¶
- Проблема: сырой лист
prodazhi_po_kanalam_only_1c_mt(208К строк, 2,7 млн ячеек, 65% файла) никем не используется вживую — данные агрегируются один раз внешним скриптом и заливаются как статичные значения в рабочие листы. Хранить сырой дамп внутри основного файла — лишний вес без пользы. - Решение (план, не реализовано):
- При обновлении данных агрегация делается на стороне SQL/Python при выгрузке через
pgapi(GROUP BYартикул+месяц+канал в самом запросе) — в основной файл сразу пишется готовый агрегат по месяцам, без сырого построчного дампа. - Отдельно заводится дополнительный Google-файл — приёмник для сырых данных (полная история продаж построчно), не для повседневной работы, а на случай, если нужно свериться с первоисточником.
- В основном файле — лист «Панель» (тот же, что уже согласован 26.06 как следующий шаг для Apps Script с кнопками обновления/ABC-пересортировки/фиксации плана) получает:
- Ссылку на этот дополнительный Google-файл с сырыми данными.
- Кнопку «Обновить» — скрипт скачивает свежую сырую выгрузку в тот отдельный файл (не в основной).
- Работа с сырыми данными — по требованию: обычно они не нужны, но если нужно посмотреть на первоисточник — переход по ссылке с «Панели» в отдельный файл.
- Причина такой схемы: пользователь не хочет разводить активно поддерживаемые параллельные файлы («сложнее обслуживание»), но и полностью терять доступ к сырым данным тоже не хочет — раздельный файл-приёмник, обновляемый по кнопке и не требующий отдельного внимания, закрывает оба требования.
- Статус: согласовано как план, реализация отложена — делается вместе с остальной частью задачи «Apps Script + лист Панель» (см.
03_Задачи.md, задача 2.3). - Приоритет — низкий, не срочно. На момент решения занято 4,18 млн из 10 млн ячеек лимита (41,8%) — места достаточно, отказ от сырого технического листа не является блокером и делается не ради экономии места сейчас, а как более чистая архитектура на будущее.
Дополнение к плану — выгрузка в Excel для архива/бэкапа (тоже план, не реализовано)¶
- На той же «Панели» — кнопки экспорта в Excel-файл (для архива/бэкапа, не для повседневной работы):
- «Выгрузить лист» — экспорт текущего/конкретного листа.
- «Выгрузить всё» — экспорт всей книги (все листы) одним файлом.
- Реализация — вместе с остальными кнопками «Панели» (обновление данных, ABC-пересортировка, фиксация плана, ссылка на файл сырых данных).
2026-07-06 (II) | Глеб + РОПы (Константин, Женя, Алексей Баталов) — обратная связь по первой версии калькулятора маржинальности¶
📅 Источник: сырой транскрипт, саммари — Саммари_встречи_06-07-2026. Закрывает задачу 3.9.
- Ключевое архитектурное решение (важно для всей дальнейшей работы): калькулятор маржинальности — это инструмент моделирования сценариев («игра в маржинальность», творческая песочница), а НЕ источник данных для плана производства. Ручные корректировки (РРЦ вручную, Шт вручную) в этом инструменте никогда не должны напрямую передаваться в план производства — если кто-то смоделировал 2000 штук вместо 200, это не должно «утечь» дальше. Утверждение планов — отдельная, независимая сущность/отчёт (следующий шаг после калькулятора), с отдельной проверкой перед выгрузкой в ПП. Автоматическая выгрузка утверждённых (проверенных) штук в план производства — задумана как будущий шаг, не сейчас.
- Подтверждена корректность уже реализованной логики (без изменений от нас, только фидбек «работает верно»):
- Приоритет ручного ввода: «Шт вручную» на конкретной позиции важнее общего коэффициента месяца.
- Галочки периода — учёт/исключение месяцев в «Итого» работает как задумано.
- «Дельта прибыли» от ручной РРЦ — работает; дополнительно попросили добавить рядом «Дельту выручки» (сейчас есть только дельта прибыли).
- Методология «Итого выручка»: план строится на основе средней исторической скидки/цены фактической реализации, не текущей РРЦ на момент планирования — соответствует уже реализованной формуле (План = Факт того же месяца прошлого года × коэффициент).
- Категории по линейкам (не по размерам) — подход подтверждён верным; классификация — по-прежнему задача Алексея Баталова.
- Разбивка МП на Ozon/Wildberries — обсуждали как желаемую независимо, до того как это было реализовано технически в тот же день 06.07.2026 — направление совпало.
- Статус проекта в общей картине: калькулятор — это «отчёт №1» из будущей системы Пожарского на 9 взаимосвязанных отчётов (план производства, платежи, факт, каналы продаж). Не отдельный проект, а быстрый рабочий прототип, сделанный параллельно, пока официальная система Пожарского готовится (обещаны прототипы не раньше сентября).
- Скоуп сейчас — только бренд Brodeks. Остальные бренды можно добавить быстро при необходимости, не сейчас.
- Ближайшие шаги: сегодня вечером — обратная связь от РОПов (что добавить/поменять) → повторная встреча впятером, финализация → передача Пожарскому на доработку дилерского канала как эталона → выкатка на остальные каналы.
2026-07-06 (III) | Дмитрий + Claude — найдено, где в 1С КА хранится цена и история скидок (задача 0.6)¶
📅 По прямому запросу Дмитрия: «найти где в 1С КА хранится цена и смена цен», чтобы посчитать, сколько компания недополучает выручки из-за скидок. Подробный разбор — 03_Задачи, задача 0.6; доступ к базе — 07_Справочники_классификаторы, раздел 7.
- Отдельного регистра истории цен в реплике 1С (Postgres через pgapi) нет — проверено полным перебором ~400 таблиц.
- Решение: история цен и скидок реконструируется из строк документов продаж — таблица
RealizatsiyaTovarovUslugTovary_PROD(121К+ строк, с 01.07.2025) уже содержит по каждой строке продажи и цену (TSena), и тип прайс-листа (VidTSeny), и ручную скидку (SummaRuchnoySkidki/ProtsentRuchnoySkidki), и дату (SsylkaData), и канал (SsylkaPodrazdelenie) — отдельный регистр не нужен, эта таблица и есть источник истины. - Важная находка, уточняющая модель каналов: у Дилеров реально минимум 3 разных прайс-листа («Дилер-33», «Дилер-25», «Дилер-15») — наш единый коэффициент 0.67 в «Дилеры Brodeks v2» является упрощением (усреднённой ставкой), а не единственной реальной скидкой. У В2В — в основном полная РРЦ («Цена продажи») + переменная ручная скидка сверху (в наблюдаемых сделках 0–11,6%).
- Методология расчёта «недополученной выручки» — уточнена и упрощена (06.07.2026, поправка Дмитрия): первоначальная идея (2 шага: РРЦ минус цена по прайс-листу, плюс отдельно ручная скидка) признана ненадёжной — у пользователей 1С есть право вписать цену вручную (не по прайс-листу), и в этом случае невозможно надёжно разделить «отклонение от прайс-листа» и «скидку от вручную вписанной цены». Решение: сравнивать напрямую факт. выручку (
Summa) с БАЗОВОЙ РРЦ на дату документа, без промежуточных шагов черезTSena/VidTSeny/поля скидок — единственное сравнение, устойчивое к любому способу формирования итоговой цены (ручной ввод, прайс-лист, скидка, комбинация). Недополучено по строке = РРЦ_на_дату ×Kolichestvo−Summa. - Остаётся техническая задача: знать РРЦ («Цена продажи») на конкретную дату — восстанавливается как временной ряд по строкам
RealizatsiyaTovarovUslugTovary_PROD/ZakazKlientaTovary_PRODсVidTSeny='Цена продажи'(метод проверен, РРЦ реально меняется и это видно в документах). - Статус: методология определена, сама реализация (скрипт реконструкции временного ряда РРЦ + расчёт по всем продажам) — следующий шаг, не начат.
2026-07-08 | Дмитрий + Claude (Sonnet 5, dp-office-server) — найден готовый регистр истории РРЦ, доступ к БД/Sheets настроен¶
Уточняет и частично отменяет вывод от 06.07.2026 («отдельного регистра истории цен в реплике 1С нет»).
- Найден периодический регистр цен
TSenyNomenklatury25_PROD(та же БДbigquery@10.20.20.81) — колонкиNomenklatura,Period(дата действия цены),VidTSeny(16 типов цен, включая'Цена продажи'= РРЦ),TSena. 2 992 900 строк. Предыдущий вывод 06.07.2026 («регистра нет, проверено перебором ~400 таблиц») не подтвердился — таблица есть, реконструкция РРЦ по строкам продаж (запланированная 06.07.2026) больше не нужна. - Методология подтверждена на реальном документе: join
TSenyNomenklatury25_PROD(последнийPeriod ≤ SsylkaData,VidTSeny='Цена продажи') сRealizatsiyaTovarovUslugTovary_PROD— на примереAGKA-011639цена по прайсу 11 600 ₽ vs факт 5 800 ₽ = скидка 50%. - Создан переиспользуемый скрипт
/!VDS-DP-Office/scripts/discount_report.py— принимаетSsylkaдокумента реализации, выводит построчное сравнение факт/РРЦ + итоги. - Написана методика Методика_расчёта_скидки_от_РРЦ — расчёт % скидки по (артикул×канал×месяц), итоговый столбец за период, агрегат по бренду+каналу (место вывода агрегата — открытый вопрос, см. документ).
- Архитектурная рекомендация (согласована с пользователем): РРЦ-на-дату считать один раз на уровне SQL-источника (обогатить
prodazhi_po_kanalam_only_1c_mtили завести вспомогательную вкладкуAPI_скидка_от_РРЦ), а не дублировать джойн в каждом из канальных скриптов (20_b2b_v2.pyи т.д.). - Настроен доступ к Google Sheets с
dp-office-server(пользовательpozharskiy, не root): смонтированgdrive:(rclone,scope=drive, полный диск), скачан ключ сервис-аккаунтаclaude-sheets@my-project-93453-01-04-26.iam.gserviceaccount.comв/home/pozharskiy/.config/gspread/service_account.json,gspreadустановлен в отдельный venv/home/pozharskiy/.venvs/gspread(pip напрямую заблокирован PEP 668). Проверено: открывается «Калькулятор маржинальности Brodeks», доступно 8 таблиц (не весь диск — сервис-аккаунт видит только явно расшаренные файлы). - Наведён порядок в
docs/: черновые «видения реализации» от MiniMax/Mimo/DeepSeek-v4/GLM-5.2/Kimi/Qwen (17 файлов) перенесены вdocs/Архив_видений_реализации_ИИ/; файлы встреч (саммари/разборы/транскрипты/согласование остатков, 6 файлов) — вdocs/Встречи/; относительные../-ссылки внутри перенесённых файлов исправлены под новую глубину. Один легаси-файлДашборд. Новая версия...xlsx(лежал в!Архив/без MD-карточки) — перенесён вdocs/, зарегистрирован вHEAVY_FILES.md. - Новое правило в
01_SYSTEM_GUIDE.md(§3, пункт 5): чужие журналы диалогов (5X_<ИИ>.md,История общения/**) не читать без явного запроса пользователя. - Согласован план (не реализовано): лист «Дилеры Brodeks v3» — копия v2 через
gspread.duplicate_sheet(v2 не трогается), новая вкладка-источникAPI_скидка_от_РРЦ(агрегаты SQL по артикул×канал×месяц), итоговый столбец скидки на v3 черезSUMIFS. Открыто: куда класть агрегат по бренду/каналу целиком (ячейка шапки рядом сCC2— предложение Claude, vs строкаA001— предложение Дмитрия), нужна ли помесячная разбивка на самом листе.
2026-07-08 (II) | Дмитрий + Claude (Sonnet 5, VDS USA) — НДС в расчёте прибыли + расшифровка листа-прототипа v3 (задачи 0.6/0.7)¶
📅 Продолжение сессии этого же дня (запись выше — dp-office). Полный ход рассуждений — 03_Задачи, задачи 0.6 и 0.7. Не согласовано с Глебом — это решения Дмитрия как ведущего проект, статус задач остаётся 🟡.
- Проблема: для расчёта реальной прибыли нужна выручка без НДС, но считать все продажи по флэт-22% неверно — часть реализаций идёт по 20% (старая ставка, до перехода), 0%/«Без НДС» (дилеры-нерезиденты).
- Решение 1 — источник НДС по строке найден, ETL менять не нужно: таблица
RealizatsiyaTovarovUslugTovary_PROD(та же, что для скидки от РРЦ) уже содержитStavkaNDS/SummaNDS/SummaSNDSпострочно, доступна напрямую через pgapi. Снимает опасение параллельной сессии dp-office о необходимости доработки ETL-выгрузкиprodazhi_po_kanalam_only_1c_mt. - Решение 2 — механизм 0%/«Без НДС» подтверждён: это не шум, а конкретные контрагенты-нерезиденты (29 партнёров, дилеры Беларуси/Казахстана — экспорт СНГ), совпадает с находкой «Дилер-СНГ» из задачи 0.6.
- Решение 3 — финальная методика расчёта
k(эффективная доля НДС для прогноза): вместо усреднения по ограниченному окну — универсальная построчная аппроксимация по всей истории: для строк со стандартной ставкой (20%или22%) выручка без НДС =Summa / 1.22(аппроксимация «как если бы уже действовала текущая ставка 22%», валовая цена принимается неизменной); для льготной ставки (0%/«Без НДС») —Summaбез изменений (реальное освобождение, не трогаем). Формула по каналу/артикулу:k = 0.1803 × (1 − доля выручки по льготной ставке). Даётkза всю историю (не только последние месяцы) — решает проблему малой выборки для непопулярных артикулов. Проверено: Дилеры Brodeksk=0.1625, В2Вk=0.1797, Розница/Интернет-магазинk=0.1803(=22/122, льготных продаж почти нет). - Почему именно так: альтернатива (сохранять чистую цену продавца, пересчитывать вверх валовую) даёт другую, менее естественную модель — выбрана аппроксимация с фиксированной валовой ценой как более простое и защитимое допущение для ретроспективной нормализации.
- Найден и расшифрован лист-прототип «Обсуждение (копия)» (книга «Калькулятор маржинальности Brodeks», id листа
1115921388) — черновая, более развёрнутая структура для v3 (не текстовое обсуждение, несмотря на название): столбецCB— % скидки от РРЦ (агрегат по каналу в строке 2, по артикулу за всю историю в строках товаров); новый столбецCC(добавлен Дмитрием в процессе обсуждения) — эмпирическая ставка НДСk, тот же принцип (канал вCC2, артикул в остальных строках с откатом наCC2при малом объёме данных);CD–CI— РРЦ/два сценария цены (коэфф. №1 на базовой РРЦ, коэфф. №2 на ручной новой РРЦ, приоритет — коэфф.№2, если задан, иначе коэфф.№1, сырая РРЦ нигде не используется напрямую)/себестоимость; помесячный план — предложено расширить с 4 до 5 подколонок (Шт/Шт вручную/Сумма выручки с НДС/Выручка без НДС [новая,= Сумма выручки × (1−k)]/Прибыль, пересчитанная на однородных величинах без НДС). Итого-блок (GF–GQ, 12 колонок) уже содержал пустые заголовки-заглушки под «без НДС» — новая логика их заполняет. - План реализации (согласован, не начат): «Дилеры Brodeks v3» = копия v2 (
gspread.duplicate_sheet, v2 не трогается), старт с одного канала (Дилеры). Новый вспомогательный листAPI_скидка_НДС_от_РРЦ(агрегаты SQL артикул×канал: % скидки →CB,k→CC), считается Python-скриптом через pgapi (не живая формула — источник в Postgres),CB/CCна v3 подтягивают черезVLOOKUP. Остальные источники (прайс-лист, себестоимость, история продаж, ABC) уже есть в книге, переиспользуются из v2 без изменений. - Найдена попутная нестыковка на листе-прототипе: колонки рентабельности (
GN/GP) заполнены по отдельным артикулам без underlying-прибыли (GM/GOпустые) — считались какой-то старой формулой в обход. Будет исправлено при реализации v3 честной цепочкой формул. - Следующий шаг после реализации v3 (по указанию Дмитрия): переписать пользовательскую инструкцию (лист «Инструкция» в этой же книге) под новую логику.
2026-07-08 (III) | Дмитрий + Claude (Sonnet 5, VDS USA) — пилот CB2/CC2 на канале «Дилеры», join только по артикулу, инфраструктура ускорения¶
- Методика НДС финализирована (упрощена от окна к аппроксимации по всей истории): строки со стандартной ставкой (
20%/22%, неважно какая исторически) → выручка без НДС =Summa/1.22; льготная ставка (0%/«Без НДС») →Summaбез изменений. Свёрнуто вk = 0.1803 × (1 − доля льготной выручки). Подробности и обоснование — 03_Задачи, задача 0.7. - Посчитано и записано на пилотном листе «Обсуждение (копия)»:
CB2 = 34,05%(скидка от РРЦ),CC2 = 16,25%(эмпирическая доля НДС) — оба на уровне канала «Дилеры Brodeks» целиком, вся история. Решили НЕ делать артикульный разрез для первой версии — канальный уровень проще и уже провалидирован (см. задача 0.7, «Очерёдность»). - Важная методологическая поправка (Дмитрий): join истории цен с продажами по названию (
Nomenklatura) ненадёжен — названия в 1С нестабильны, переименовываются. Проверено на реальных данных: 6,3% несовпадений при джойне по названию через справочникNomenklatura_PROD, из них 137 строк — настоящие переименованные брендовые товары (не мусор). Решение: join только по артикулу. Дмитрий добавил колонкуNomenklaturaArtikulнапрямую в репликуTSenyNomenklatury25_PRODи перезалил таблицу целиком. - Инфраструктура ускорения (совместно с Дмитрием):
LATERAL JOINпо датам без индекса не укладывался в таймаут pgapi (39К строк канала). Созданscripts/25_rrc_price_history_matview.sql(индекс + материализованное представлениеmv_rrc_price_history, теперь по артикулу). pgapi-ключ — толькоSELECT, DDL им не выполнить (проверено), поэтому представление создавал Дмитрий сам напрямую в БД (DBeaver). - Обновление представления — через уже существующий воркфлоу n8n на офисном VDS («Обновление мат. представлений в 4 утра 03.26», id
oE68bEtGB9KgddMW, каждые 2 часа), а не отдельным cron-скриптом — Дмитрий дописалREFRESH MATERIALIZED VIEW mv_rrc_price_history;в конец существующего списка REFRESH-команд, тестирует. Отдельныйscripts/26_refresh_mv_rrc_price_history.shудалён как избыточный. - Статус: таблица
TSenyNomenklatury25_PROD(перезалив с артикулом) на момент записи ещё догружается — представление создано по новой структуре и подтверждено рабочим, но не отражает полный объём данных. Следующий шаг — дождаться полной загрузки,REFRESH, пересчитатьCB2/CC2через SQL и сверить с текущими цифрами (34,05%/16,25%), затем переходить к копированию v2 → v3.
2026-07-08 (IV) | Дмитрий + Claude (Sonnet 5, VDS USA) — v3 достроен, инструкция переписана, расчёт по всем каналам¶
- v3 достроен целиком на канале «Дилеры Brodeks»: два ценовых сценария (коэфф.№1 авто / коэфф.№2 ручной, логика перенесена с прототипа «Обсуждение (копия)», но с исправлением найденных там ошибок — защита от пустого значения, верный индекс
VLOOKUPдля себестоимости без НДС), помесячный расчёт выручки/прибыли без НДС, 12-колоночный Итого-блок (по образцу прототипа, но с порядком, сгруппированным по сценарию — предложение Claude, принято). Сверка: рентабельность коэфф.№2 (факт) 51,6% совпала с независимой референсной цифрой из пилота 03.07.2026. - Лист «Инструкция» переписан с нуля — старая версия сохранена как отдельная вкладка-архив + PDF-снимок на GDrive, новая инструкция обобщённая (не привязана к конкретному листу-каналу), тоже сохранена в PDF. Оба PDF оформлены по правилам тяжёлых файлов (
docs/HEAVY_FILES.md). - Методологическая ошибка найдена и исправлена в расчёте скидки от РРЦ: строки без найденной цены на дату (15–25% строк на разных каналах) исключались только из знаменателя, не из числителя — давало ложную отрицательную скидку почти на всех каналах кроме Дилеров. После исправления: реальная скидка есть только у Дилеров (34,14%), остальные каналы торгуют практически по РРЦ. Подробности и итоговая таблица по всем каналам — Методика_расчёта_скидки_от_РРЦ.
CB2/CC2в v3 обновлены под пересчитанные цифры (артикульный join точнее названия); кCC2добавлено примечание (не изменение формулы) с альтернативным представлением ставки НДС «в привычном виде» (19,40% вместо 16,25%) — по явному запросу пользователя, изменение самой формулы обсуждено и отложено (потребовало бы правки везде, где используется$CC$2).- Не сделано: артикульный разрез
CB/CC(сейчас только канальный уровень), репликация структуры v3 на остальные каналы (В2В/Розница/МП пока на архитектуре v2), подтверждённыйREFRESHmv_rrc_price_history(представление на конец сессии ещё не обновилось, хотя воркфлоу n8n активен).