Дом памяти
аналитика · база знаний
Рабочая учётка · доступ выдаёт администратор
Вход в дашборд
Проверяю доступ…

Аналитика

Выручка, филиалы, менеджеры, заказы
—

Выручка по дням

Загрузка…

Структура выручки по филиалам

два столбика — прошлый период и текущий · клик по филиалу — его незавершённые заказы
Загрузка…

Выручка по менеджерам

верхний столбик — прошлый период, нижний — текущий

Заказы по состояниям

заказы, созданные в периоде (включая заказы с нулевой суммой), по текущему состоянию
Загрузка…

Крупнейшие незавершённые

Сейчас на монтаже

Номенклатура

Δ считается к прошлому периоду той же длины; «—» если базы не было или она меньше 100 ₽
|

Нарушения регламента — по классу: сначала грубые, внутри класса по сумме

Филиал
данные 1С… · как считаются показатели →
🔄 Идёт синхронизация с 1С (касса и взаиморасчёты)… Это 2–4 минуты, страница обновится автоматически.
Как считаются показатели. Все цифры приходят из 1С УНФ (read-only) и обновляются автоматически.
  • Деньги — остатки по регистру «Денежные средства» на момент последнего синка регистров. «Карта директора» в 1С проходит как касса, но в разделе вынесена отдельной строкой «На карте»; переводы между своими кассами не доход и не расход — по умолчанию из прихода/расхода исключены.
  • Нам должны — главная цифра считается по правилу «как в 1С»: остаток = сумма заказа − фактические оплаты (расходные строки регистра «Расчёты с покупателями» без внутренних зачётов предоплаты), в сумму входят только заказы с приёмкой бригадира («Принят»). Это та же цифра, что в разделе «Должники» и в отчёте 1С. Состояние заказа и отгрузка на отбор не влияют. Срок («тишина») — сколько дней по заказу нет движений денег.
  • Сальдо регистра расчётов (раскрывается по строке «Сальдо регистра шире на …» под карточкой) — сколько всего числится за покупателями в 1С: начислено минус оплачено, по всем заказам. Это ещё не сумма к взысканию. Расшифровка идёт столбиком, и строки складываются в итог ровно:
    • − вне заказов — строки того же регистра, где не указан заказ: предоплаты, возвраты покупателям, зачёты предоплаты, ввод остатков (по контрагентам).
    • − отгружено, приёмки бригадира нет — заказ отгружен и долг по регистру есть, но бригадир ещё не отметил «Принят»; в отчёт 1С по должникам такие заказы не попадают.
    • − заказы в других состояниях — долг по регистру числится, но заказ ещё в работе, создан или в производстве.
    • = сальдо по принятым и отгруженным — что осталось от сальдо после этих вычетов.
    • + принято, но ещё не отгружено — приёмка есть, а состояние ещё не «Отгружен/Завершен»: в 1С долг по ним есть, а в сальдо выше их не было.
    • + разница правил расчёта — по принятым и отгруженным заказам правило «сумма заказа − фактические оплаты» отличается от сальдо регистра: внутренние зачёты предоплаты не считаются оплатой, а возвраты покупателю и корректировки долга в сальдо есть. Может быть и минусом.
    Итого как в 1С (последняя строка расшифровки) — долг к взысканию, та же цифра, что в отчёте 1С.
  • Предоплаты — деньги уже у нас, но за них ещё не сделана работа; авансы вне заказов в сумму не входят и показаны отдельной строкой.

Сколько денег у нас сейчас, где именно они лежат и как двигались по месяцам. Предоплаты клиентов здесь не учитываются — это ещё не наши деньги; подробности по ним и по долгам — на странице «Должники».

Движение денег по месяцам

приход, расход и остаток на конец месяца

Где деньги сейчас

доли касс и счетов по остатку

Кассы и счета — остатки

остаток, движение за месяц и переводы внутри компании
Филиал
данные 1С… · как считаются показатели →
🔄 Идёт синхронизация с 1С (касса и взаиморасчёты)… Это 2–4 минуты, страница обновится автоматически.
Как считаем риски. Только заказы, выбившиеся из сроков, — по данным 1С на момент последнего синка.
  • Заказы под риском — плановая дата (Финиш) уже прошла либо заказ не менялся дольше 21 дня либо застрял на статусе «Отгружен». Просрочка и «завис» пересекаются: один заказ может попасть в обе группы.
  • Три статуса в одной колонке — «состояние» заказа в 1С, приёмка менеджером и статус бригадира: это разные поля, подпись слева указывает источник.

Заказы, которые выбились из сроков: обещанная дата уже прошла, заказ давно не менялся или застрял на статусе «Отгружен». Каждая строка — конкретный заказ, который стоит проверить.

Срок прошёл или заказ завис

плановая дата просрочена больше чем на 3 дн либо заказ не менялся больше 21 дн. Для заказов на монтаже плановая дата не учитывается, порог тишины — 45 дн
Статус — это три разных статуса из 1С, у каждого своя подпись: состояниеСоздан · Отгружен · Отгружен частично · Готов к выдаче · Завершен — состояние заказа в 1С менеджерПередан · Принят · Жду уточнения · Не принят — принял ли заказ менеджер бригадирПринят · На монтаже — готовность к монтажу и идут ли работы «Готов к выдаче» встречается и у состояния, и у бригадира — это разные вещи, смотрите подпись слева

Зависли на отгрузке

статус «Отгружен» без изменений больше 21 дня, до «Завершен» не доведены

Филиалы

данные 1С…
Сортировка
🔄 Идёт синхронизация с 1С… Список обновится автоматически.
справочник…
Считаю смету…

Изделие

Смета пересчитывается сразу при изменении любого поля. Цены правит руководитель на вкладке «Прайс».

Смета

Справочник цен

Последние расчёты

Журнал нужен, чтобы видеть, что менеджеры считают и на какие суммы (конверсия «расчёт → заказ»). Хранится в дашборде, в 1С ничего не пишем.
Оградки

Таблица шире экрана — прокрутите её вправо мышью или пальцем.

НоменклатураЕд. В наличиипо складу Резервживые заказы Свободнов наличии − резерв Заказанопокупателями Требуетсядля производства Ожидается поставказаказы поставщикам Прогнозпосле заказов и поставок Проданоза период Расходпродано + резерв + произв. К производствурасход − свободно

Чат с агентом

проверяю агента…
⤓ Файл
Enter — отправить · Shift+Enter — новая строка · агент читает данные дашборда только на чтение
Динамика
Операции ⤓ XLSX по срезу
Время Статья Контрагент На что Касса, счёт Документ Сумма
Фильтры
⛃фильтры
—
По менеджерам клик по строке — разбивка по подразделениям
Менеджер Начислено По текущим заказам К начислению Выручка по нашим заказам
По месяцам
МесяцНачисленоПо текущим заказамК начислениюКак в отчёте бухгалтера

Должники

Готовность к монтажу

А … — Б … —

Сравнение: позиции

Склад

раздел переделывается с нуля
Страница очищена. Данные с 1С синхронизируются в фоне как обычно, интерфейс соберём заново по шагам.
🪨 Камни
🧱 Тумбы
🌿 Цветники
🛒 Заказ
Период
|

Камни

🏛 Обзор
🔗 Документооборот
📋 Заказ-наряд
🧱 Фундамент
🏭 Производство
🚚 Отгрузки
📏 Стандарты
👥 Роли
🧩 Вкладки
🪨 Анализ камня

Что это и зачем

База «1С:УНФ» ведёт учёт производства и продаж памятников, оградок, тротуарной плитки и сопутствующих работ. Вся логика завязана на один центральный документ — заказ-наряд (Document_ЗаказПокупателя), из которого «расходятся» производство, закупка материалов, перемещения и отгрузки.

Чтение базы — строго read-only через OData: https://1c.dp-cloud.ru/unf/odata/standard.odata (только GET).

Глоссарий

ТерминЧто значит
Заказ-нарядодин клиентский заказ: товары + работы + материалы.
Номенклатурасправочник позиций; тип — Запас (товар/материал), Работа (услуга), Операция.
Спецификациярецепт/состав изделия (BOM).
Характеристикавариант размера/исполнения.
КлючСвязисвязь материала с работой.
Структурная единицафилиал / цех / склад.
Содержаниетекст с размерами («Фундамент 2,4*3,0*0,2»).

Структурные единицы

Филиалы продаж: Герцена, Западное, Жукова, Новокировское, Пушкинское, Южное, БХ, База, Сперановка, АРТ Бетон, ПроКовка, Интерьер Камень.

Цеха: Каменный, Сварочный, Малярный, Плиточный. Склады: Основной, База, витрины филиалов, цеховые склады и отходы.

Цепочка документов

Заказ-нарядклиент
→
Заказ на производствопо цехам
→
Сборка запасовизготовление изделия
→
Перемещение запасовмежду складами
→
Отгрузка / монтажполя заказа + сдельный наряд

На отдельные позиции заказ-наряда 1С создаёт заказы на производство (по одному на изделие/работу), они уходят в профильный цех. Изготовление фиксируется Сборкой запасов, между складами/цехами — Перемещением запасов. Отгрузка и монтаж — через состояния заказа и поля строк, оплата работ — через Сдельный наряд.

Как документы связаны

СвязьПоле
Заказ на производство → заказ-нарядЗаказПокупателя_Key, ДокументОснование_Key
Сборка → заказ на производствоЗаказНаПроизводство_Key
Материалы → работы внутри заказаКлючСвязи
Строка работы → рецепт/размерСпецификация_Key, Характеристика_Key

Пример реального заказа

Заказ Зп0049 (сумма 405 144 ₽). Строка работы «Фундамент» = Фундамент (стандартный) 2.4*3.0*0.2, 32 400 ₽. Её материалы (через КлючСвязи): цемент 12 мешков, арматура д.8 пластик 109, сетка сварная 2. Так материалы «приклеиваются» к работам.

Структура заказ-наряда

Document_ЗаказПокупателя — главный документ. Три табличные части:

ЧастьЧто хранит
Работыуслуги/монтаж (фундамент, монтаж, гравировка) + спецификация, характеристика, содержание
Запасытовары (плита, ваза, оградка) + резерв, отгрузка
Материалысырьё (цемент, арматура) + КлючСвязи к работе
Ловушка
Поле номенклатуры в «Работах» — Номенклатура_Key, в «Запасах» — Номенклатура (без _Key).

Товар vs работа

Надёжный признак — из какой табличной части строка: «Работы» → услуга, «Запасы» → товар. Поле ТипНоменклатуры обманчиво (например «Тротуарная плитка с монтажом» — по типу «Запас», но это работа).

Так же считает и «Аналитика»: ось строки берётся из табличной части документа (items.kind: service = «Работы», goods = «Запасы», см. classify.axis_for), а название — только источник категории. Поэтому «Тротуарная плитка с монтажом» — услуга (категория «Монтаж»), а «Тротуарная плитка на стяжку» — товар.

Категория «Монтаж» — это работы, включая комплекты «материал + монтаж» (плитка, бордюр): в 1С такие строки лежат в «Работах», поэтому их сумма входит в выручку услуг.

Размеры изделия

Размер площадки/камня — в текстовом поле Содержание: «длина*ширина*высота» в метрах. Вводится вручную и неструктурированно (запятые/точки/скобки вперемешку).

Состояния заказа

Catalog_СостоянияЗаказНарядов: Создан → … → Отгружен → На монтаже → Завершен. Плюс доп. реквизиты «Статус для бригадира» и «Статус для менеджера».

Три параллельных статуса: (1) формальный СостояниеЗаказа (в практике 6 значений), (2) статус для менеджера (73e5fb1b) — Передан/Принят/Жду уточнения, (3) статус для бригадира (60c23586) — Принят/На монтаже/Готов к выдаче. «Заказы на монтаже» считаются по (3), не по (1).

Проверка сходимости (правило сверки)

СуммаДокумента = Σ(Работы.Сумма) + Σ(Запасы.Сумма) — по строкам где Сумма>0. Проверено на живом заказе 00НФ-Б00571: работы 111 025 ₽ + запасы 62 000 ₽ = 173 025 ₽ = сумме документа, бьётся до рубля. Любое расхождение = потеряна вкладка или двойной счёт.

Выручка «Аналитики» — только по строкам, где «Вариант завершения» ≠ «Отменен» и заказ не «Удалён». Разбивка по состояниям — диагностическая: в неё входят и отменённые, и заказы с нулевой суммой, поэтому её итог больше выручки — страница показывает разницу отдельной строкой.

Ответ /api/data по умолчанию без разреза «Товары и услуги» (это половина ответа, страница берёт его из /api/compare); полный ответ — /api/data?full=1. Себестоимости в источнике нет, поэтому cost/margin/margin_pct приходят как null, а не нулями.

Начисления ЗП менеджерам — регистр, а не отчёт по продажам

Раздел «Начисления» читает регистр AccumulationRegister_ДомП_СуммыКНачислениюЗППоМенеджерам («(ДомП) Суммы к начислению ЗП по менеджерам»). Он пишется документами «Заказ покупателя» и по каждой записи держит вид: Receipt — текущая сумма заказа, Expense — уже начисленная сумма. Итог начисления = Receipt − Expense, то есть «сколько осталось начислить».

Проверено на живых данных: Receipt-часть за август 2026 совпала с выручкой «Аналитики» до рубля по каждому менеджеру (49 829 454 ₽), Expense-часть за сезон — с отчётом бухгалтера «кассы общие» (421 625 908 ₽), а за сентябрь 2026 — по каждому менеджеру (27 757 175 ₽). Поэтому выручку сверяют с отчётом «Заказ покупателя → Основные данные», а начисления — с этим регистром; путать их нельзя: регистр «застывает» на моменте начисления и не пересчитывается после правок заказов.

В регистре встречается служебное значение ответственного «В кассу не считать» — эти суммы в начисление из кассы не попадают. Ещё в 1С бывает разное написание ФИО одного человека (например, «Мухорин Виталий Владимирович» в заказах и «…Викторович» в начислении) — страница помечает такие строки значком «≠». Второй источник значка «≠» — свежий заказ: 1С пишет Receipt-записи при проведении документов, поэтому по заказам последних часов регистр немного отстаёт (обновляется автоматически).

Чтобы не считать вручную, в карточке «Начислено» показано второе число — «как в отчёте бухгалтера»: начислено по регистру плюс текущие суммы заказов по подразделениям, которые бухгалтер считает отдельно (АРТ Бетон и ПроКовка — в 1С по ним нет ни одной Expense-записи). Совпадает с её файлами до рубля: сентябрь 2026 — 28 510 749 ₽, сезон 2025/26 — 427 896 113 ₽.

Вторая вкладка раздела — «Заказы с изменениями»: по выбранному месяцу видно заказы, которые 1С относит к этому месяцу, их суммы в начислении и сейчас, и — построчно — правки сумм из журнала (было → стало, когда заметили). Логика начислений с июня 2025 накопительная, поэтому начисление месяца = заказы месяца + корректировка по прошлым месяцам; корректировка на странице считается как «начислено − заказы месяца». Построчно само начисление не разложить: в 1С записи начисления не привязаны к заказам. Журнал правок ведётся с сентября 2026.

Ещё один вид расхождения — значок «нет начисления»: у менеджера в регистре нет ни одной Expense-записи (начислений нет вовсе). Так по АРТ Бетону (Стрижко) и ПроКовке (Язов) — за все месяцы. В отчёте бухгалтера по этим подразделениям взяты текущие суммы заказов, поэтому её итог больше страницы ровно на них: за сентябрь 2026 — на 630 574 ₽ и 123 000 ₽ соответственно (в её файле 28 510 749 ₽ против 27 757 175 ₽ у нас, всё остальное совпадает по менеджерам).

КлючСвязи связывает товар ↔ работа

Поле КлючСвязи (тип Int64) парует строки вкладок: у каждой позиции «Запасы» есть своя строка «Работы» с тем же КлючСвязи. Пример: памятник (ш120*60*7, КС=1) ↔ «Монтаж памятника» (КС=1); цветник (КС=2) ↔ «Портрет гравировка» (КС=2). Самостоятельные работы (фундамент, плитка, бордюр, переустановки, демонтаж) — без пары в «Запасах». Материалы привязаны к работам тем же ключом.

Кратность — цена за единицу × объём

В строке «Работы» Цена × Кратность = Сумма. Кратность — объём/площадь: Фундамент 30 000 ₽ × 1.188 (м²) = 35 640 ₽; Тротуарная плитка 3 500 ₽ × 11.79 м² = 41 265 ₽; Бордюр 800 ₽ × 14.4 пог.м = 11 520 ₽. Размер площадки — в Содержание («3.3*3.6*0.10»).

Скидка 100% = включено в стоимость (бонус)

Позиции, входящие в комплект, получают ПроцентСкидкиНаценки=100 → Сумма=0. В примере цветники и тумба даны за 0 ₽ (входят в памятник), платят только памятник (58 500 ₽) и вазу (3 500 ₽). Такие строки не добавляют выручки — учитывать при анализе.

Усопший ≠ заказчик
Контрагент в шапке — кто заказывает/платит («Косарев Алексей Алексеевич»), а ФИО усопшего — в доп. реквизите (ce297eb5: «Косарев Алексей Иванович»). Это разные люди.

Типы фундамента

ТипЧто этоЗаказов, 2026
Фундамент (обычный)бетонная площадка1 849
Фундамент пасынокна столбах25
Фундамент миксерзаливка миксером (дорогой)1
Фундамент ленталенточный (не используется)0

Спецификация «стандарт»

Базовый состав на 1 фундамент: Цемент (50 кг) + Арматура д.8 пластик + Лягушка + Сетка сварная. Формулы пустые — реальные количества считаются по размеру площадки.

Рецепты по размеру (медианы 2026)

Размер (Д×Ш×В)ЗаказовЦемент, мешковАрматура д.8
1,2 × 2,1 × 0,103352,523
1,5 × 2,4 × 0,101273,533
1,8 × 2,4 × 0,101424,541
2,4 × 2,4 × 0,102035,540
2,4 × 2,4 × 0,15195840
3,0 × 2,4 × 0,10206754
3,0 × 2,4 × 0,151001067
Логика
Цемент и арматура растут с площадью (длина×ширина) и толщиной. Сетка сварная — почти всегда 2 шт. Металлическая арматура идёт на монтаж памятника, а не на фундамент.
Оговорка
Формулы зашиты в конфигурации 1С (через OData не видны) — цифры выше это статистически восстановленные медианы.

Заказы на производство по цехам

ЦехЧто производитЗаказов, 2026
Каменныйпамятники, плиты, вазы, столы2 679
Сварочныйоградки, металл869
Малярныйгравировка, портреты, покраска862
Плиточныйплитка, облицовка333

Структура заказа на производство

  • Продукция — что производим (Работа/Запас).
  • Операции — тех. операции с нормами времени.
  • СоставБригады — исполнители.
  • СписокНоменклатуры — текстовая сводка.
Важно
Фундамент — монтажная работа, в цех не уходит: материалы через «Материалы» заказ-наряда, работа выполняется на месте. В цехах — только изготовляемые изделия.

Сборка и сдельная оплата

Сборка запасов — фактическая сборка из материалов. Сдельный наряд — сдельная оплата работ (монтаж, гравировка).

Кто и как оформляет (исправленные роли)

  1. Менеджер оформляет заказ на производство из заказ-наряда: Ответственный_Key = тот же менеджер, что ведёт заказ; указывает цех (СтруктурнаяЕдиница_Key).
  2. Начальник профильного цеха (каменного / малярного / сварочного / плиточного) принимает задачу и назначает исполнителя на операции (Операции.Исполнитель).
  3. Бригада (работники + КТУ) назначается в СдельномНаряде → СоставБригады (в самом заказе на производство бригада пустая). Это оплата труда.
Роли
Менеджер — ответственный за весь цикл. Цеховой — исполнитель по цеху (назначает людей и контролирует состояния). Бригада фиксируется в сдельнике.

Состояния производства

Catalog_СостоянияЗаказовНаПроизводство — свой справочник (не как у заказ-наряда):

Создан → Передан → В производстве → (Сварено → Окрашено → Упаковано) → Готов → Завершен, плюс «Жду уточнений» и «В работе сварщика».

Важно: у цехов свои финальные статусы
«Готов» и «Завершен» — общие для всех цехов. Но есть и свои финальные статусы, после которых цех работу закончил и состояние дальше не меняется:
  • Малярный цех — Упаковано;
  • Сварочный цех — Сварено.
Это не промежуточные этапы: например Сварено стоит у 183 производств сварочного цеха, Упаковано — у 151 малярного, и подавляющее большинство из них дальше в «Готов»/«Завершен» не переходит. Поэтому изделие считается готовым, если его статус — общий финал ИЛИ финал своего цеха. Раньше эти два статуса не считались готовностью, и заказы, где оба цеха уже закончили, висели в «В производстве».

Привязка именно к цеху обязательна: Упаковано и Сварено изредка встречаются и в Каменном цехе, а для него признак готовности другой — подтверждённая приёмка камня.

Структура (вкладки, связка через КлючСвязи)

Продукция (что делаем) ↔ Операции (связь КлючСвязиПродукция → продукт) ↔ Запасы (материалы, ДомП_Продукция_Key). СоставБригады в самом заказе — пустая.

Пример: бордюр 288 шт (Плиточный цех)

Заказ 00НФ-004995: продукция = бордюр чёрный 288 шт (спец 99ab5f39, КС=55); 3 операции (все КлючСвязиПродукция=55); материалы — песок 460.8 + отсев 1152 + цемент 288 + пластификатор 1.44 + пигмент 4.32 + фибра 0.864. Сборка 00НФ-002721, сдельник 00НФ-011334 (8 640 ₽: 25×288=7 200 + 5×288=1 440).

Заказ → несколько производственных заказов (по цехам)

Один клиентский заказ-наряд порождает по одному производственному заказу на каждый задействованный цех, а не «одно изделие = один заказ». Проверено: заказ a6632ce4 → 3 производственных заказа (каменный + сварочный + малярный). Производственный заказ = вся работа одного цеха по данному заказу (все его изделия + операции + материалы).

Источники материала
Каменный/плиточный берут материал с «Склад База» (центральный); малярный/сварочный — с «Склад <Цех> МАТЕРИАЛЫ» (цеховые, куда перемещают болванки/комплектующие).

Кросс-цеховая цепочка: Сварочный → Малярный (болванка → покраска)

Сварочный цех производит «БОЛВАНКИ» (металлические каркасы оградок/ножек/столбиков/флагштоков) → Малярный цех их красит (грунт + чёрная глянец RAL9005 + лак + антик МЕДЬ) → готовое ограждение. Это конвейер через склады.

ЦехЧто делает
Сварочныйпроизводит «БОЛВАНКА Оградка №16/№12/№20», «БОЛВАНКА Доп.Нога», «БОЛВАНКА Флагшток»…
Малярныйкрасит болванку: материал «БОЛВАНКА Оградка №16» + краски чёрная/лак/антик медь
Неочевидно
Материал «БОЛВАНКА…» в малярном заказе = продукция сварочного цеха. Производство многоступенчатое и идёт через перемещение запасов между цеховыми складами.

«Продукция» = изделия + работы (услуги)

«Продукция» производственного заказа — это не только физические изделия, но и РАБОТЫ-услуги цеха. Пример монумента 00НФ-004681: 22 «продукта» = эпитафия-гравировка, выпил форм, портрет на КГ, ниша, макет, фрезеровка, лавка гранитная, металлопролёт — вся работа каменного цеха по объекту. У каждого продукта: Спецификация_Key (BOM), Характеристика_Key (вариант/размер), КлючСвязи, количество, ЗаказПокупателя_Key + КлючПродукцииЗаказ (трасса заказ → производство).

Как материал → изделие и операция → изделие (связки)

СвязкаКак
Операция → изделиеОперации.КлючСвязиПродукция → Продукция.КлючСвязи (не по позиции). Одно изделие — несколько операций.
Материал → изделиеЗапасы.ДомП_Продукция_Key = Номенклатура_Key целевого изделия (+ ДомП_Характеристика_Key, ДомП_Комментарий)
РецептСпецификация_Key у каждого продукта (BOM)

Неочевидные решения

  • Материалы масштабируются рецептом, формулы скрыты. 540 плиток «Крокодил» → песок 1 382,4 кг + отсев 3 180,6 + цемент 1 922,4 + пластификатор 16,2 + пигмент красный 12,96 + чёрный 14,58 (тонны на партию). Кол-во считает 1С из BOM; через OData формулы не видны.
  • Пигмент = цвет. «Красная» плитка = пигмент красный + чёрный (оттенок). Чёрные оградки = краска чёрная + лак + антик МЕДЬ (эффект старения).
  • Операция-кол-во ≠ кол-во изделия. Лавка гранитная (1 шт) — а одна операция план=4 (обработка в своих единицах, напр. 4 грани).
  • Нормочасы/НормаВремени = почти везде 0. Реальная трудоёмкость — в СдельномНаряде (Расценка × Факт). План — только «что и сколько».
  • Промежуточные статусы — особенность цеха. У сварочного/малярного есть «В работе сварщика / Сварено / Окрашено / Упаковано»; у каменного/плиточного их нет.

Факт ↔ план (Сборка + Сдельный наряд)

Пример малярного заказа 00НФ-000003 (оградка №16 + углы):

  • Сборка запасов 00НФ-000181 — списала болванки+краску, оприходовала окрашенные изделия.
  • Сдельный наряд 00НФ-000556 (Ефимов, 1 010 ₽): углы — план/факт 4 × 100 ₽ = 400 ₽; оградка — 12,2 м × 50 ₽/м = 610 ₽.

Формула оплаты: Расценка × КоличествоФакт = Стоимость. Исполнитель — на каждой операции (СоставБригады пуст, если 1 сотрудник).

Шапка: к каким справочникам ведут поля

ПолеСправочник
Ответственный_KeyCatalog_Сотрудники — менеджер (тот, кто ведёт заказ)
Автор_KeyCatalog_Пользователи (НЕ Сотрудники) — через OData не читается
СостояниеЗаказа_KeyCatalog_СостоянияЗаказовНаПроизводство (свой справочник)
ДокументОснование / ЗаказПокупателя_KeyDocument_ЗаказПокупателя — две параллельные связи на один заказ-наряд
Организация_Key / СтруктурнаяЕдиница*Catalog_Организации / Catalog_СтруктурныеЕдиницы
ХозяйственнаяОперация_KeyCatalog_ХозяйственныеОперации = «Сборка»

Положения реквизитов (где хранится значение): ПоложениеЗаказаПокупателя=ВТабличнойЧасти, ПоложениеСклада=ВТабличнойЧасти, ПоложениеИсполнителя=ВШапке, ПоложениеСтруктурнойЕдиницыОпераций=ВШапке.

Неочевидные механики (полная трассировка + журнал)

  • КлючПродукцииЗаказ = LineNumber строки заказ-наряда. У каждого продукта производства — номер исходной строки клиентского заказа (эпитафия → строка 42, выпил → 30, пролет → 15…). Это трасса «какой продукт из какой строки заказа».
  • Запасы.ДомП_Продукция_Key = Номенклатура_Key целевого изделия (в живух: «шнп105*60*3» → продукт «пролет из НП шанси»; «плитка» → «изделие из камня»). Дополнительно ДомП_Характеристика_Key и ДомП_Комментарий («пролет 800*30*3 — 3 шт, 670*30*3»).
  • Операция ↔ продукт — через КлючСвязиПродукция (целое число), а материал ↔ продукт — через ДомП_Продукция_Key (guid номенклатуры). Разные механизмы.
  • ДополнительныеРеквизиты = производственный журнал. В монументе — код состава («…фр+худспина+худлицо+худпрол3+вазаскант+…») и полная история: «принят 30.07 → в работе → макет → жду фото → 02.07 фото принесут… → 24.02 отпр.нов… → 21.07 принято». Ведёт цех.
  • ТипНоменклатуры продукта = Работа или Запас — продукция бывает и услугой (гравировка/эпитафия).
  • Исполнитель в шапке = 0000 — исполнители ставятся по операциям (цеховым). РесурсыПредприятия → Catalog_КлючевыеРесурсы (станки/оборудование).
  • Нормочасы почти всегда 0 — только у «изделия из камня» Нв=1/Нч=1. Реальный труд — в сдельнике.

Перемещения

ПеремещениеЗапасов — между складами/цехами: База → филиал/цех. ЗаказНаПеремещение не используется. Так болванки/материалы попадают в цеховые склады («Склад <Цех> МАТЕРИАЛЫ»).

Резерв в заказ-наряде

Строка «Запасы»: Резерв (зарезервировано на складе под заказ, = кол-во), РезервОтгрузка (зарезервировано под отгрузку, = Резерв), СтруктурнаяЕдиницаРезерв_Key (склад — «Склад База»/склад филиала).

Резерв=0 — изделие на заказ
Изделия на заказ (оградки, ваза гранитная сборная, нестандарт) имеют Резерв=0 — их не держат на складе, производят в цеху. Резервируются только складские готовые (памятники-заготовки ш120*, вазы, плитка, щебень).

Отгрузка: флаг + состояние

Маркер отгрузки — Запасы.ДомП_Отгрузка (True = позиция отгружена) + смена СостояниеЗаказа:

Создан → … → Отгружен частично → Отгружен → На монтаже → Завершен

Частичная отгрузка = часть строк ДомП_Отгрузка=True, остальные False (напр. щебень/камень отгрузили, памятник ещё нет).

Не использовать ДатаОтгрузки / Собрано
ДатаОтгрузки (в строке и в шапке) — пустая (0001-01-01) даже после отгрузки. КоличествоСобрано и ДомП_КоличествоКОтрузке — не заполняются (0 по всем свежим заказам). Реальная дата отгрузки = заказ.ДатаИзменения (когда состояние сменилось на «Отгружен»).

РасходнаяНакладная (28) — не привязана к заказу (поле Заказ пустое), только опт/розница. Основной поток отгрузки документ не создаёт — только флаг+состояние.

Резерв в производстве

Продукция.Резерв = 0 (изделия ещё не готовы, на складе не резервируются). Запасы.Резерв (материалы) = полному кол-ву на складе — материалы зарезервированы под производство.

Регистры — источник истины по резервам/остаткам

РегистрЧто хранитЗачем
ПотребностьВЗапасах«потребность»/резерв: склад + заказ-наряд + заказ на производство + номенклатура + кол-воистина по резервам (16 940 строк, все «Отгрузка»)
ЗапасыНаСкладахостаток: склад + номенклатура + характеристика + партия + ячейка + кол-восколько физически на складе
ГрафикДвиженияЗапасовплан движения: склад + заказ + номенклатура + кол-воплан перемещений

ПотребностьВЗапасах — перекрестие заказ↔производство↔склад: лучшее место для «сколько материала под резервом сейчас».

Склад — раздел «Склад» в дашборде

Раздел показывает остатки по складам, движение, расход, потери и дефицит материалов. Данные кладутся отдельным синком регистров и не смешиваются с заказ-нарядами.

Что показываетИсточник в 1С
Остатки по складам, обороты по дням за 365 дней, расход в день и «хватит на N дней» AccumulationRegister_ЗапасыНаСкладах (остаток = Σ приход − Σ расход по паре склад + номенклатура)
Дефицит материалов — «чего не хватит» AccumulationRegister_ПотребностьВЗапасах: Receipt = обеспечение, Expense = сама потребность. Дефицит = потребность − обеспечение
Склады, МОЛ, тип склада, категории номенклатуры, границы остатков Catalog_СтруктурныеЕдиницы (тип, МОЛ_Key, префикс подразделения), Catalog_КатегорииНоменклатуры, Catalog_Номенклатура
Что по открытым заказам ещё не отгружено строки Document_ЗаказПокупателя_Запасы с полями студии ДомП_Отгрузка и ДомП_КоличествоКОтрузке
Перемещения, поступления, потери и расхождения Document_ПеремещениеЗапасов (+ табличная часть _Запасы), Document_ЗаказПоставщику_Запасы, Document_ИнвентаризацияЗапасов, Document_СписаниеЗапасов — только за последние 12 месяцев

Потребность к отгрузке берётся так: ДомП_КоличествоКОтрузке, если оно больше нуля, иначе Количество. Так не завышается потребность у частично отгруженных заказов.

Что в складе не разводится
Остаток считается по паре склад + номенклатура: характеристики, партии и ячейки не разделяются. Поэтому «сколько именно этого размера лежит» по складу не показать — только общее количество позиции.

Правила формирования

  1. Один клиентский заказ = один заказ-наряд (товары + работы + материалы).
  2. Материалы привязаны к работе через КлючСвязи.
  3. Каждое изделие/работа → свой заказ на производство в профильный цех.
  4. Фундамент — монтажная работа, норма материалов зависит от размера.
  5. Отгрузка — через состояния заказа и поля строк.

Подводные камни

Задвоение выручки в «Продажи»
Регистр AccumulationRegister_Продажи задваивает выручку (подчинённые документы пишут свои движения). Правильный источник — СуммаДокумента заказов.
Фильтр Period не работает
$filter=Period ge … возвращает 400 на регистрах — тянуть целиком и фильтровать на клиенте.
Разные имена поля номенклатуры
«Работы» — Номенклатура_Key, «Запасы» — Номенклатура.
Размеры — неструктурированный текст
В Содержание вручную, нужна нормализация.
Состояние ≠ статус бригадира
«На монтаже» читается из доп. реквизита, не из СостояниеЗаказа.
Формулы — в конфигурации
Алгоритмы расчёта материалов не видны через OData.

Источники истины

Что нужноПравильный источник
Выручка по филиалу/менеджеруСуммаДокумента заказов с положительной суммой; отменённые заказы («ВариантЗавершения» = «Отменен») и заказы с пометкой «аннулирован» не считаются продажей и в выручку не входят
Товары vs работытабличная часть («Запасы»=товар, «Работы»=услуга)
Материалы на работусвязка по КлючСвязи
Состав изделияCatalog_Спецификации → Состав
РазмерСодержание (парсинг)

Кто участвует

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

Шапка заказа

ПолеЧто это
Контрагентклиент
Подразделение (филиал) — СтруктурнаяЕдиницаПродажигде оформляется заказ
ОрганизацияИП
Ответственныйменеджер
Вид заказаОсновной / АртБетон

👤 Менеджер — что заполняет

  1. Товары (Запасы), Работы (со спецификацией/характеристикой/размером), Материалы (из спецификации).
  2. Доп. реквизиты: кладбище, ФИО усопшего, контакт, платежи/рассрочка, действия с демонтированным, планируемая дата.
  3. Статус для менеджера → «Передан».

👷 Бригадир — монтаж

Смотрит: назначенный бригадир, комментарий/график, примечания, действия с демонтированным.

Заполняет: статус бригадира («Принят» → «На монтаже» → «Готов к выдаче»), дату монтажа, сдельный наряд.

📦 Кладовщик — отгрузка

Сверяет: резерв, резерв-отгрузку, количество к отгрузке. Отгружает: флаг ДомП_Отгрузка в строках «Запасы» (дату ДатаОтгрузки не заполняет — см. «Подводные камни», реальная дата отгрузки = ДатаИзменения заказа). Перемещает между складами. Переводит состояние в «Отгружен».

Закрытие заказа

Создан → Жду уточнения → Передан → На монтаже → Готов к выдаче → Перемещен → Отгружен → Готов и принят бригадиром → Готов и принят заказчиком → Завершен.

Завершен — финал (после отгрузки, монтажа, принятия заказчиком, расчёта). АртБетон — упрощённо: Создан → Отгружен → Завершен.

Три системы статусов
СостояниеЗаказа (14 статусов), «Статус для менеджера» (Передан/Принят/Жду уточнения), «Статус для бригадира» (Принят/На монтаже/Готов к выдаче) — параллельные, не путать.

Шапка заказ-наряда (вкладка «Главное»)

ГруппаПоляЧто это
ДокументNumber, Date, ВидОперации, ВидЗаказаномер/дата; «ЗаказНаряд»; Основной/АртБетон
СостояниеСостояниеЗаказастатус из 14
КлиентКонтрагент, Договорзаказчик, договор
Орг/филиалОрганизация, СтруктурнаяЕдиницаПродажиИП; подразделение (филиал)
ОтветственностьОтветственный, Авторменеджер; кто создал
ДеньгиСуммаДокумента, Валюта, НДС, ВидЦен, БанковскийСчетсумма, валюта, НДС, цены, счёт
СрокиСтарт, Финиш, КСА_ДатаВыполненияРаботплан даты
ДоставкаСпособДоставки«Самовывоз» и др.

Табличные части (27) — что используется

ВкладкаНазначениеСтатус
Запасы (Товары)памятник, плита, вазаиспользуется
Работыфундамент, монтаж, гравировкаиспользуется
Материалыцемент, арматураиспользуется
Предоплата (Оплата)авансы/платежииспользуется
СкидкиНаценкискидкииспользуется
ДополнительныеРеквизитыкладбище, ФИО, статусыиспользуется
ОтмененныеЗапасыотменённые позициииспользуется
Исполнителиисполнители с КТУпусто
Калькуляциякалькуляцияпусто
ПлатежныйКалендарьграфик платежейпусто
МатериалыЗаказчика / Ресурсы / Доставка / Подаркипрочиепусто

Оплата (Предоплата)

СуммаПлатежа, СуммаРасчетов, ОплатаБонусами, ОплатаСертификатом. График рассрочки — текстом в доп. реквизите. ПлатежныйКалендарь не используется — так и задумано.

Специалисты: художник, керамист и др.

6 ролей: художник, керамист, монтажник, пильщик, фрезеровщик, сварщик/маляр. У каждой — флаг на номенклатуре (КСА_Художник…) и поле эскиза в шапке (КСА_ЭскизХудожник…).

Как это работает
Специалисты в заказ-наряде не назначаются — конкретного исполнителя назначает позже начальник производства (через заказ на производство и сдельный наряд). В заказ-наряде по специалисту пишут только комментарий при необходимости.

Доп. реквизиты — полная карта

ПолеТипПримеры
Кладбище / участоксправочникСеверо-Восточное, Западное, Южное, Морозовка
ФИО усопшего + датытекст«Козлов Николай Федорович 12.04.1954–27.04.2024»
Контакт для связитекстномер + имя
Платежи / рассрочкатекст«Рассрочка до 31.10.2026», аванс/остаток
Действия с демонтированнымсправочникутилизировать / оставить / захоронить / закопать
Статус для менеджерасправочникПередан / Принят / Жду уточнения
Статус для бригадирасправочникПринят / На монтаже / Готов к выдаче
Назначенный бригадирсотрудникПлатонов, Матюхина…

Анализ камня — что это простыми словами

Раздел «Анализ камней» отвечает на один вопрос: что и сколько докупить, чтобы хватило камня и комплектов (тумб и цветников) под то, что уже продано и зарезервировано. Данные берутся из 1С и обновляются сами — открывать 1С для этого не нужно.

ВкладкаЧто показывает
🪨 Камнивсе камни (стелы) с продажами, резервом, сборкой, свободным остатком и «к закупке»
🧱 Тумбы, 🌿 Цветникито же по комплектам; если на вкладке «Камни» отмечены камни «+», появляются колонки «Нужно» и «Дефицит» — чего не хватает под выбранные камни; позиции, которых не хватает, помечены галочкой автоматически (чего хватает — без галочки: закупать нечего). Кнопка «+» здесь добавляет позицию в список закупки отдельно от комплектов — она показывается на вкладке «Заказ» в блоке «Выбрано вручную»
📋 Заказатьсписок закупки: отмеченные камни + автоматически подобранные под них тумбы и цветники, с заменой
🛒 Заказтот же расчёт в виде дашборда: итоги сверху, группы камней по тумбам (или по цветникам), дефицит, «чем заменить», правка «докупить»
Как начать работу
Откройте «Камни», нажмите + у нужных камней — они попадут в список закупки (на вкладках «Тумбы» и «Цветники» так же можно отметить конкретные позиции к закупке отдельно от комплектов). Дальше смотрите вкладку «Заказ»: там по группам видно, чего не хватает и чем можно закрыть дефицит.

Что означает каждая цифра и откуда она

ПоказательЧто значитОткуда берётся в 1С
Проданосколько камня продано за выбранный периодрегистр Продажи, по дате продажи. Это тот же источник, что у отчёта 1С «Продажи по номенклатуре» — количество и выручка совпадают с ним до рубля
Зарезервированосколько уже обещано клиентам, но ещё не отгруженорезерв по заказам (регистр Заказы покупателей) + потребность производства (регистр Потребность в запасах) — ровно как колонка «В резерве» в карточке товара 1С
В сборкесколько камня ушло в собранные изделия (например, «изделие из камня»). Строка кликабельна: по нажатию — список документов сборки с заказом, заказом на производство и тем, что собралидокументы Сборка запасов (регистр Запасы на складах): расход минус приход. 1С пишет на позицию три записи — расход со склада-отправителя, приход на склад цеха и расход в цехе, поэтому расхода вдвое больше прихода, а нетто и есть «ушло в изделие»
Всеговесь спрос за периодПродано + Зарезервировано + В сборке
Свободносколько можно продать прямо сейчасостаток по всем складам (База + витрины) минус резерв минус производство — так же считает «Свободно» карточка 1С. Рядом процент: какую часть спроса закрывает остаток
Расходсколько камня уйдёт клиентамПродано + Зарезервировано
К закупкесколько нужно докупитьОбъём периода (продано + зарезервировано + потребность производства) − свободный остаток, не меньше нуля. Закупку планируем от того, сколько ушло за период, а свободный остаток — то, чем можем распоряжаться: зарезервированное уже продано и занято под заказы
Надо / Есть / Не хватает (для тумб и цветников)сколько комплектов нужно под камни и чего не хватаетна каждый камень нужен один комплект: «Надо» = расход камней, «Есть» = свободный остаток позиции, «Не хватает» = Надо − Есть
Почему «Резерв считается как проданное»
Зарезервированный камень уже уйдёт клиенту (заказ оплачен или в производстве), в свободном остатке его нет — поэтому он понижает «Свободно» так же, как продажа.

Комплекты: как подбираются тумбы и цветники

  • На каждый камень нужен один комплект: тумба + цветник.
  • Кто кому подходит берётся из 1С — регистр «Сопутствующие товары» (в карточке камня список сопутствующих).
  • Основная тумба — самая маленькая из подходящих, ширина которой не меньше ширины камня (камень должен встать). Основной цветник — ближайший по длине камня.
  • Если в 1С связей нет — позиция подбирается по правилу в том же материале (в таблице помечено «по правилу»).
  • Замена — ближайший больший размер того же материала: большую тумбу или цветник можно подрезать, меньшую — нет. Свободный остаток замены сначала закрывает её собственную потребность, а остаток распределяется по дефицитам — поэтому пишем «закроет 12 из 46», а не «есть 60».
  • Варианты замены (в том числе из 1С) видны в колонке «Замена» и в раскрытой строке группы.

Можно править «докупить» руками

На вкладке «Заказ» число в колонке «докупить» — редактируемое. Решили закупить больше или меньше — впишите своё значение и нажмите Enter.

  • Правка сохраняется в базе и видна всем, кто открывает дашборд; переживает перезапуск.
  • Потребность в тумбах и цветниках пересчитывается сразу: на каждый камень нужен комплект, поэтому формула такая: потребность комплектов = max(расход, докупить + свободный остаток). Купили «в запас» — комплектов тоже нужно больше, и сразу видно, хватит ли их.
  • Меньше расхода потребность не опускается: те камни всё равно уйдут клиентам, комплекты под них нужны.
  • Правленое число подсвечено синим, рядом ✕ — вернуть расчёт, кнопка «Сбросить правки закупки» — сбросить все.
На вкладке «Камни» цифра «К закупке» остаётся расчётной
Там показано, сколько нужно по расчёту, без ваших правок — это аналитика. Ваши решения о закупке видны и учитываются на вкладке «Заказ».

Когда обновляются данные

Дашборд сам забирает данные из 1С по расписанию (настраивается в «Настройки → Синхронизация», там же кнопка «Запустить сейчас»):

ЧтоКак частоГде видно
Продажи по номенклатурераз в 3 часаколонка «Продано»
Заказы (продажи и резерв по заказам)каждые 15 минутзаказы, должники, монтаж
Деньги и склад: остатки, резерв, потребность производства, сопутствующиераз в час«Свободно», «Зарезервировано», подбор комплектов
Движения склада (детали строки)раз в 3 часараскрытая расшифровка: приход, расход, остаток на начало

В шапке раздела есть подпись «данные: заказы … · склад … · движения …» — это реальная давность каждой части; если что-то отстало от расписания, оно подсвечивается.

Чего в расчёте нет — чтобы не удивляться

  • Камень, ушедший в изделие («изделие из камня»), считается в колонке «В сборке», а не в «Продано»: продано само изделие, а камень — его составляющая. Если посчитать и там и там, будет задвоение.
  • «Продано» — по дате продажи, а не по дате заказа: заказ, оформленный в одном месяце, а отгруженный в другом, попадёт в месяц отгрузки.
  • У складских движений нет привязки к заказу, поэтому нельзя сказать «эта сборка — под заказ №…»; видно только объём.
  • Заказы, у которых состояние удалено в 1С, не считаются активными (в работе, в долгах, в сроке), но их резерв, если он ещё живой, учитывается.
  • Отрицательные итоги по заказу (сняли больше, чем ставили — правка) в резерв не берутся: так же считает 1С.

Техническая документация для агента-разработчика

С чего начать
Код: app.py (Flask, вся логика и синхронизация) + index.html (SPA, весь интерфейс в одном файле). База — SQLite cache/analytics.db (в контейнере /app/cache/analytics.db). Деплой: bash start.sh — пересоздаёт контейнер analytics:ro на порту 8580 и копирует app.py/index.html внутрь; хост — источник истины, файлы не смонтированы.

Источники данных и синхронизация

Чтение 1С — только GET по OData: https://1c.dp-cloud.ru/unf/odata/standard.odata, учётка «Чтение» (read-only), AUTH_HEADER = Basic base64(USER:PASS). Загрузка регистров — pull_register_lines(entity): берёт Recorder,RecordSet, листает $top=1000&$skip, пропускает записи Active is False. Документы — page_orders()/_odata(), отбор Posted eq true and DeletionMark eq false.

Раздел расписания (key)Метка в metaФункцияПишет в таблицыЧто даёт странице
saleslast_sales_syncsync_sales()stock_sales(product_key,d,qty,amount)Продано и выручка
orderslast_syncdo_sync() → sync_incremental/sync_fullorders, itemsзаказы, состояния, резерв «запасным путём»
registerslast_reg_syncsync_registers() → sync_stock_meta, sync_stock, sync_assembly, sync_need, sync_related, деньги/расчётыstock, stock_move, stock_asm_doc, stock_asm_move, stock_asm_line, stock_asm_prod, stock_need, stock_prod_need, stock_related, order_ordered, stock_nom, stock_whСвободно, Зарезервировано, подбор комплектов
stocklast_stock_deep_syncsync_stock_docs()stock_move (движения по дням и типам)В сборке, детали строки (приход/расход/остаток на начало)
heavy / files / staff / reconcilelast_heavy_sync, last_nc_index, last_staff_sync, last_full_sync_run_heavy, _nc_index_bg, _run_staff, sync_reconcileпрочеене влияет на «Анализ камня»

Расписание описано в SYNC_SECTIONS (интервал по умолчанию, минимум, варианты, «сколько идёт»), метки — в SYNC_META, ручной запуск — SYNC_RUNNERS + /api/sync/run. Циклы (reg_loop, warm_loop, stock_deep_loop, staff_loop, nc_loop) раз в минуту проверяют _sync_due(key); интервалы читаются из таблицы sync_settings (кэш 5 с), поэтому смена интервала действует без перезапуска.

Особенности OData 1С (проверено)

  • Фильтры на регистрах не работают: $filter=Номенклатура_Key eq … → HTTP 400. Тянем регистр целиком и фильтруем локально.
  • $orderby на регистрах/документах ненадёжен — не полагаться.
  • Табличные части читаются навигацией: Document_ЗаказПокупателя(guid'…')/Запасы. В строках ТЧ заказов поле номенклатуры называется Номенклатура, в регистрах — Номенклатура_Key.
  • У документов отбор Posted eq true and DeletionMark eq false; учётка read-only, запись в 1С невозможна.

Как считаются цифры в коде

Всё для вкладок «Камни/Тумбы/Цветники» считает build_stones(from_d, to_d, group, pick, plan, only_pick, drop_alts) в app.py:

  • Продано — SUM(qty), SUM(amount) FROM stock_sales WHERE d BETWEEN from_d AND to_d (по дате продажи). Если таблица пуста (первый запуск) — запасной путь: закрытые заказы (Завершен/Отгружен) по дате заказа.
  • Зарезервировано — «Резерв» строк заказов по живым заказам (см. ниже), иначе запасной путь: строки открытых заказов.
  • Остаток по всем складам — SUM(qty) FROM stock (все склады, База + витрины). Отдельно остаток по «Склад База» и по витринам — для расшифровки.
  • Потребность производства — stock_prod_need.need (регистр ПотребностьВЗапасах: Receipt − Expense, только положительные).
  • В сборке — по stock_move с rec_type='СборкаЗапасов' за период: SUM(exp) − SUM(recv) по всем складам (изделия собирают и в цехах). Расшифровка по документам — таблицы stock_asm_move, stock_asm_doc, stock_asm_prod, stock_asm_line (см. панель «Модалка „В сборке (в изделия)“»): они собираются из тех же строк регистра, поэтому сумма в модалке совпадает с колонкой.
  • Обороты склада (расшифровка) — stock_move только по «Склад База»: остаток на начало (d < from), приход, расход.

Формулы (build_stones):

  • res_all = reserved + prod_need — колонка «Зарезервировано»;
  • free = stock_all − reserved − prod_need — «Свободно»;
  • need_buy = max(0, sold + reserved + prod_need − free) — «К закупке» (объём периода минус свободный остаток);
  • total = sold + res_all + in_assembly — «Всего» (считается на клиенте);
  • покрытие спроса cov = min(100, round(free / (sold + res_all) · 100)) — процент рядом с «Свободно».

Группы номенклатуры

Группа определяется по папке в дереве номенклатуры: _group_map(c, folder_names) поднимается по parent_key и ищет точное совпадение имени папки. Наборы имён: STELE_FOLDER_NAMES («стелы», «стеллы», «стэлы», «стэлы, нп»…), TUMBA_FOLDER_NAMES («тумба», «тумбы»), CVETNIK_FOLDER_NAMES («цветник», «цветники», «цветники мрамор», «цветники, заглушки»). Метаданные групп — STONE_GROUPS (title, word, search, about). Размеры из названия — _nm_nums(name) (L, W, T), материал и вид — _nomen_kinds(c).

Модалка «В сборке (в изделия)»: документы сборки

В раскрытии камня строка «В сборке (в изделия)» кликабельна: asmOpen(key) → GET /api/stones/asm → asmRender(). По каждому документу видно дату, номер и вид операции, склад, заказ покупателя (номер, дата, статус), заказ на производство (номер, дата, цех) и что собрали (ТЧ «Продукция»).

ТаблицаЧто внутриОткуда в 1С
stock_asm_docшапки: номер, дата, вид операции, заказ покупателя, заказ на производство, склад, документ-основаниеDocument_СборкаЗапасов (4 950 документов)
stock_asm_moveдвижения по документу, позиции, складу и дню: recv, expAccumulationRegister_ЗапасыНаСкладах с фильтром Recorder_Type eq 'StandardODATA.Document_СборкаЗапасов'
stock_asm_lineТЧ «Запасы» самого документа по позицииDocument_СборкаЗапасов_Запасы — для сверки с движениями
stock_asm_prodТЧ «Продукция»: что собрали (название и количество)Document_СборкаЗапасов_Продукция
Почему расхода вдвое больше прихода
На каждую позицию 1С пишет три записи: расход со склада-отправителя, приход на склад цеха и расход в цехе. Пара «расход отправителя + приход цеха» — внутрицеховое перемещение, она гасит сама себя. Поэтому нетто = расход − приход и есть реально ушедшее в изделие: колонка «В сборке» не задвоена (проверено 22.09.2026: ш120*60*7 — 13.3 по кэшу и 13.3 по девяти документам; 972 документа из 974 сошлись до копейки).
Если движения расходятся с документом
Значит документ правили после проведения: в 1С движения остались старые, а табличная часть новая. Модалка помечает такие строки значком ⚠ с подсказкой. Примеры: 00НФ-002205 от 10.08.2026 (движения 6 596.42 против 1 674.15 в документе) и 00НФ-000531 от 01.04.2026 (5 821.77 против 2 212.18) — материал «Отсев». По камням таких нет.

Особенности: период берётся тот же, что у таблицы (STONES.from/to), поэтому в подвале модалки видно «✓ совпадает» или «⚠ расхождение» с колонкой. Показываются последние 500 документов. У 1 120 документов из 4 950 заказа покупателя нет (массовая сборка) — пишем «без заказа». У изделий-приёмников нетто отрицательное (они не расходуются, а появляются); в группу камней такие позиции не входят.

Синк: sync_assembly() вызывается в разделе registers сразу после sync_stock() (метка last_asm_sync, ~26 с на прогон, 53 тыс. движений). Грабли: фильтр регистра по типу регистратора работает, а по Period — нет («Сегмент пути Period не найден»); $orderby=Ref_Key обязателен, иначе 1С теряет строки при постраничной выгрузке.

План комплектов: /api/plan

  1. _related_map(c) — stock_related: камень → сопутствующие (тумбы/цветники) из 1С.
  2. _pick_weights(c, pick, from_d, to_d) — «расход» каждого камня = продано (из stock_sales) + резерв + производство.
  3. build_stones(..., "stele", pick, plan={"rows":{},"by_kind":{}}) — берём свободный остаток камней (нужен для учёта решений о закупке).
  4. _eff_need(weights, free_by, buy_plan) — потребность с учётом правок «докупить»: calc = max(0, расход − свободно), buy = buy_plan или calc, eff = max(расход, buy + свободно).
  5. _build_plan(pick, kinds, related, eff) — по каждому камню основная тумба (минимальная подходящая по ширине) и цветник (ближайший по длине); остальные связи — «альтернативы», ближайший больший размер того же материала — «замена»; копится for_qty (разбивка потребности по камням).
  6. api_plan — собирает items (роли «нужно»/«альтернатива»/«замена»), распределяет свободный остаток альтернатив по дефицитам (сначала больший дефицит, с уменьшением cap, чтобы один остаток не пообещать дважды) → поля can / covers / why / own_need / own_deficit / own_for; считает totals и fresh.
  7. api_stones вызывает build_stones(..., drop_alts=True) — на вкладках тумб и цветников строки-«альтернативы» не показываются, остаются «нужно» и «замена».

Резерв: «В резерв» строк заказов по живым заказам

Резерв — это поле Резерв строки заказа (колонка «В резерв» в карточке), но только по живым заказам: строка хранит резерв годами и после закрытия заказа, поэтому без фильтра резерв раздувается (по шц50*7*5 — 256 вместо 6). Две таблицы: order_reserve(order_ref, product_key, qty) — резерв строк (пишет синк заказов: инкрементально по изменившимся, полная сверка целиком); order_ordered(order_ref, product_key, qty) — незакрытое заказанное количество из регистра «Заказы покупателей» (пишет sync_order_ordered() в цикле регистров). Резерв по позиции = SUM(MIN(ordered, reserve)) по пересечению — считается на чтении в reports/stones.py, поле orders = число живых заказов.

Проверка: шц50*7*5 → резерв 6 (Г01193 1 + Нк0290 1 + Ж00045 4, заказ Ю00258 без резерва), «Свободно» = 7 − 6 = 1 — совпадает с панелью номенклатуры 1С. Старый способ (сумма заказанного по регистру) давал 11 и «Свободно» −4: он считал необеспеченные заказы резервом.

Продажи: sync_sales()

Регистр Продажи → stock_sales(product_key, d, qty, amount) (агрегация по позиции и дате, ~37,5 тыс. строк, прогон ≈2 мин). Проверка: ш120*60*7 за 01.11.2025–21.09.2026 → 283 шт / 14 631 533 ₽, ровно как в отчёте «Продажи по номенклатуре». По группе «Камни» 3198 шт против 3201 шт фактических отгрузок по движениям склада — задвоения нет.

Правки «докупить»: /api/plan/buy

GET — текущие правки; POST {"key": "…", "qty": 25} — поставить, qty: null — вернуть расчёт, {"items":[…]} — пачкой, {"reset": true} — сбросить все. Хранение — stone_buy_plan(product_key, qty, updated_at, updated_by). На клиенте правка применяется мгновенно (локальный пересчёт), затем сохраняется в базу и обновляет план (stonesLoad()), чтобы пересчитались вердикты замен.

API страницы

МетодЧто делаетКлючевые поля ответа
GET /api/stones?group=stele|tumba|cvetnik&pick=…&only_pick=1&from&toтаблицы вкладок Камни/Тумбы/Цветникиstones[] (sold, sold_amount, reserved, prod_need, in_assembly, stock_all, free, need_buy, total-части, tumba_/cvetnik_ ключи и остатки), totals, fresh, materials, note
GET /api/plan?pick=…&from&toплан закупки для вкладок «Заказать» и «Заказ»stones[] (buy_plan, buy_calc, buy, need_eff, free, tumba_/cvetnik_), items[] (роль, need, free, deficit, for_detail, alts с can/covers/why), totals, fresh
GET|POST /api/plan/buyчтение/запись решений о закупке камняitems: {ключ: количество}
GET /api/stones/asm?key=…&from&toдокументы сборки по одному камню — модалка «В сборке (в изделия)»docs[] (number, doc_date, vid, wh, order, prod_order, products[], qty, exp, recv, own, warn), total, doc_count, shown, warn, note, fresh
GET /api/sync/settings, POST /api/sync/runрасписание и ручной запуск разделовrows[] с интервалами и метками last

Авторизация: @app.before_request требует сессию для всех /api/*, кроме логина; раздел определяется по префиксу пути (API_SECTION): /api/stones, /api/plan* → раздел stones.

Фронтенд: где что лежит

  • Состояние: STONES_GROUP (вкладка), STONES_PICK (отмеченные камни, localStorage dsh_pick_stones), PLANN_* (данные, режим группировки, раскрытые строки), PLANN_BUY (текущие правки «докупить»).
  • renderStones() — таблица вкладок Камни/Тумбы/Цветники: сортировка (dpTh/dpSortRows), группы по материалам, «+»-кнопки, раскрытие строки с тремя мини-таблицами (Склад База · витрины · итог по камню), колонка «В сборке».
  • renderPlanNew() — вкладка «Заказ»: KPI, группы по тумбам/цветникам, «чем заменить», правка «докупить» (attachBuy, applyBuy, saveBuy, refreshZone), локальный пересчёт потребности (EFF, needPos).
  • stonesSetAge()/stonesFresh() — подпись «данные: …» с реальной давностью разделов (orders/registers/stock) и подсветкой опоздавших.
  • Стили раздела — блок #sec-stones ... в <style> (палитра секции #sec-stones{--an-*}, таблицы table.t-stones и table.stnp-t).

Грабли, на которые уже наступали

Резерв нельзя выводить из статусов заказов
Раньше «Зарезервировано» считалось как «все незакрытые заказы целиком». Это давало лишние единицы: (1) у заказов с удалённым в 1С состоянием резерв мог быть уже снят; (2) у заказа с отрицательным итогом (правка) резерв завышался. Правильно — сумма положительных итогов по заказам из регистра + производственная потребность.
«Продано» по закрытым заказам ≠ отчёт 1С
По закрытым заказам и дате заказа выходило 268 шт, по отчёту — 283: 1С считает по дате продажи (отгрузке). Источник — регистр Продажи.
У раздела не было своей палитры CSS
#sec-stones не имел блока --an-*, из-за чего рамки, тени и приглушённые цвета не рисовались вовсе (в браузере border-bottom был 0px none). Лечится блоком переменных, как в других разделах.
Одинаковые номера заказов
В кэше встречаются два разных заказа с одним номером (например «00НФ-Ж00045» от 15.02.2025 и от 08.04.2026). При сверках матчить по (номер, дата), а не по номеру.
«Изделие из камня» — отдельная позиция
Это сборное изделие (в 1С приходит через «Сборка запасов», потом продаётся). В группу камней оно не входит, сопутствующих связей не имеет; камень, ушедший в него, виден колонкой «В сборке». Списание камня в сборку идёт по всем складам (в цехах тоже).
Регистр «Продажи» и предупреждение о задвоении
В базе знаний есть заметка о задвоении выручки в этом регистре. Для количества проверено: задвоения нет — по группе «Камни» регистр дал 3198 шт против 3201 шт фактических отгрузок по движениям склада. Отчёт 1С «Продажи по номенклатуре» строится на том же регистре, поэтому с ним совпадение точное.

Как сверять с 1С (рецепты)

Что сверяемОтчёт 1СНаша колонкаЧто должно сойтись
Продажи за период«Продажи по номенклатуре»«Продано» (+ выручка в расшифровке)количество и сумма до рубля (проверено: ш120*60*7 → 283 шт / 14 631 533 ₽)
Резерв по заказам«История резервов» (или карточка товара, колонка «В резерве» без производства)«Зарезервировано» минус производственная часть (видно в подсказке к ячейке)сумма по заказам (проверено: ш120*60*7 → 50, г70*90*6 → 2, 10 тумб/цветников)
Свободный остатоккарточка товара, «Свободно»«Свободно»остаток по всем складам − резерв − производство
Остаток по складам«Остатки товаров на складах»«Остаток» / расшифровка по складамсумма по всем складам; База и витрины — отдельно

Диагностика в интерфейсе: подсказка к «Зарезервировано» показывает разбивку «по заказам покупателей N + в производство M»; подпись «данные: …» — давность каждой части; если расходится остаток, а не резерв, смотрите время последней выгрузки складского раздела (часовая).

Журнал решений 21–22.09.2026

Что сделалиПочему
Колонка «В сборке»; «Всего» = продано + резерв + в сборкекамень, ушедший в изделие, не виден в продажах — нужно было его посчитать
Переделаны таблицы раздела (палитра секции, компактные колонки, единицы в шапке, «К закупке»)таблицы не читались: не было рамок, числа уезжали от названий
На вкладках Тумбы/Цветники убраны строки-«альтернативы», включён режим «Нужно/Дефицит»build_stones не отдавал список выбранных камней, и режим не включался; альтернативы оставлены в подсказке «чем заменить»
Резерв переведён на регистр «Заказы покупателей» (только положительные итоги по заказам)расхождения с 1С из-за заказов с удалённым состоянием и отрицательных итогов
«Продано» переведено на регистр «Продажи» (дата продажи)требование «видеть ровно как в 1С»; совпадение с отчётом «Продажи по номенклатуре»
Правка «докупить» с пересчётом потребности комплектовнужно решать, сколько закупать, и сразу видеть, хватит ли тумб и цветников
Подпись «данные: …» с реальной давностьюраньше показывалось время запроса, а не выкачки — давность была не видна
Строка «В сборке (в изделия)» стала кликабельной: модалка с документами сборки, заказами и изделиямицифра без расшифровки не проверялась: по клику видно, какими документами и в какие изделия ушёл камень. Проверено: сумма модалки сходится с колонкой (1С пишет три записи на позицию — нетто и есть расход в изделие)
Вкладка «🪨 Анализ камня» в базе знанийописание раздела простыми словами для владельца + техническая часть для следующего агента

Что осталось за рамками

  • План считает комплекты только под выбранные камни; потребность комплектов под собранные изделия (в сборочных документах вместе с камнем списываются и цветники) не считается — изделие это отдельная позиция номенклатуры.
  • У складских движений нет привязки к заказу: объём «в сборку» виден, а «под какой заказ» — нет.
  • Расхождения по остатку возможны только из-за давности выгрузки (склад — раз в час). Если нужно чаще — интервал меняется в «Настройках → Синхронизация».

Пользователи дашборда

Сотрудники 1С

Показаны только те, у кого есть учётная запись в 1С — учётки дашборда заводятся именно им (ФИО, логин 1С, группы ролей видны сразу). Сотрудники без учётки в 1С в этот список не попадают. Данные обновляются автоматически раз в сутки, вручную — кнопкой «Обновить сотрудников из 1С».

Журнал входов и изменений

Роли и доступ к разделам

Отметьте, какие разделы открыты роли. Проверка идёт на сервере: если раздел выключен, данные не отдаются вообще — просто спрятать пункт в меню недостаточно. Личный набор разделов у конкретной учётки (вкладка «Пользователи») важнее роли.

Новая роль

например: «Снабженец» — видит только склад и монтаж
Название роли
Код (латиницей, для служебных нужд)
Короткое пояснение (видно в карточке учётки)
Разделы

Личные наборы разделов

Учётки, которым разделы выданы не по роли, а своими галочками. Менять — в карточке учётки на вкладке «Пользователи».

Расписание синхронизации

Интервал — как часто дашборд сам забирает данные из 1С. Чаще — свежее цифры, но больше нагрузка на 1С-базу: разделы ходят в одну и ту же базу и мешают друг другу (регистры выкачиваются ~2,5 минуты). «Выключено» — раздел обновляется только кнопкой «Запустить сейчас». Смена интервала действует сразу, перезапуск не нужен.

Порядок и правила

как считается расписание
• Время запуска считается от последнего успешного прогона раздела, а не по календарю: если прогон шёл долго или упал, следующий стартует через выбранный интервал после него.
• Ручной запуск сдвигает расписание — после кнопки «Запустить сейчас» раздел подождёт свой интервал.
• «Полный проход по заказам» — перечитать состояния и доп. реквизиты всех 10,5 тыс. заказов; изменённые заказы и так приходят инкрементом, поэтому чаще часа его гонять незачем.
• «Документы заказов»: за один проход обходится часть филиал-годов облака, полный круг складывается из нескольких проходов — поэтому интервал здесь в часах.
• Время указано по Омску (UTC+6), сервер хранит расписание в UTC — переход на летнее время не влияет.
Скачать файл
ВремяУровеньИсточникСообщение
читаю журнал…