Выручка по дням
Структура выручки по филиалам
два столбика — прошлый период и текущий · клик по филиалу — его незавершённые заказыВыручка по менеджерам
Заказы по состояниям
заказы, созданные в периоде (включая заказы с нулевой суммой), по текущему состояниюКрупнейшие незавершённые
Сейчас на монтаже
Номенклатура
Δ считается к прошлому периоду той же длины; «—» если базы не было или она меньше 100 ₽Нарушения регламента — по классу: сначала грубые, внутри класса по сумме
- Деньги — остатки по регистру «Денежные средства» на момент последнего синка регистров. «Карта директора» в 1С проходит как касса, но в разделе вынесена отдельной строкой «На карте»; переводы между своими кассами не доход и не расход — по умолчанию из прихода/расхода исключены.
- Нам должны — главная цифра считается по правилу «как в 1С»: остаток = сумма заказа − фактические оплаты (расходные строки регистра «Расчёты с покупателями» без внутренних зачётов предоплаты), в сумму входят только заказы с приёмкой бригадира («Принят»). Это та же цифра, что в разделе «Должники» и в отчёте 1С. Состояние заказа и отгрузка на отбор не влияют. Срок («тишина») — сколько дней по заказу нет движений денег.
- Сальдо регистра расчётов (раскрывается по строке «Сальдо регистра шире на …» под карточкой) — сколько
всего числится за покупателями в 1С: начислено минус оплачено, по всем заказам. Это ещё не сумма к взысканию.
Расшифровка идёт столбиком, и строки складываются в итог ровно:
- − вне заказов — строки того же регистра, где не указан заказ: предоплаты, возвраты покупателям, зачёты предоплаты, ввод остатков (по контрагентам).
- − отгружено, приёмки бригадира нет — заказ отгружен и долг по регистру есть, но бригадир ещё не отметил «Принят»; в отчёт 1С по должникам такие заказы не попадают.
- − заказы в других состояниях — долг по регистру числится, но заказ ещё в работе, создан или в производстве.
- = сальдо по принятым и отгруженным — что осталось от сальдо после этих вычетов.
- + принято, но ещё не отгружено — приёмка есть, а состояние ещё не «Отгружен/Завершен»: в 1С долг по ним есть, а в сальдо выше их не было.
- + разница правил расчёта — по принятым и отгруженным заказам правило «сумма заказа − фактические оплаты» отличается от сальдо регистра: внутренние зачёты предоплаты не считаются оплатой, а возвраты покупателю и корректировки долга в сальдо есть. Может быть и минусом.
- Предоплаты — деньги уже у нас, но за них ещё не сделана работа; авансы вне заказов в сумму не входят и показаны отдельной строкой.
Сколько денег у нас сейчас, где именно они лежат и как двигались по месяцам. Предоплаты клиентов здесь не учитываются — это ещё не наши деньги; подробности по ним и по долгам — на странице «Должники».
Движение денег по месяцам
приход, расход и остаток на конец месяцаГде деньги сейчас
доли касс и счетов по остатку
Кассы и счета — остатки
остаток, движение за месяц и переводы внутри компании- Заказы под риском — плановая дата (Финиш) уже прошла либо заказ не менялся дольше 21 дня либо застрял на статусе «Отгружен». Просрочка и «завис» пересекаются: один заказ может попасть в обе группы.
- Три статуса в одной колонке — «состояние» заказа в 1С, приёмка менеджером и статус бригадира: это разные поля, подпись слева указывает источник.
Заказы, которые выбились из сроков: обещанная дата уже прошла, заказ давно не менялся или застрял на статусе «Отгружен». Каждая строка — конкретный заказ, который стоит проверить.
Срок прошёл или заказ завис
плановая дата просрочена больше чем на 3 дн либо заказ не менялся больше 21 дн. Для заказов на монтаже плановая дата не учитывается, порог тишины — 45 днЗависли на отгрузке
статус «Отгружен» без изменений больше 21 дня, до «Завершен» не доведеныФилиалы
Изделие
Смета
Справочник цен
Последние расчёты
Таблица шире экрана — прокрутите её вправо мышью или пальцем.
| Номенклатура | Ед. | В наличиипо складу | Резервживые заказы | Свободнов наличии − резерв | Заказанопокупателями | Требуетсядля производства | Ожидается поставказаказы поставщикам | Прогнозпосле заказов и поставок | Проданоза период | Расходпродано + резерв + произв. | К производствурасход − свободно |
|---|
| Время | Статья | Контрагент | На что | Касса, счёт | Документ | Сумма |
|---|
| Менеджер | Начислено | По текущим заказам | К начислению | Выручка по нашим заказам |
|---|
| Месяц | Начислено | По текущим заказам | К начислению | Как в отчёте бухгалтера |
|---|
Должники
Готовность к монтажу
Сравнение: позиции
Склад
раздел переделывается с нуляКамни
Что это и зачем
База «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,10 | 335 | 2,5 | 23 |
| 1,5 × 2,4 × 0,10 | 127 | 3,5 | 33 |
| 1,8 × 2,4 × 0,10 | 142 | 4,5 | 41 |
| 2,4 × 2,4 × 0,10 | 203 | 5,5 | 40 |
| 2,4 × 2,4 × 0,15 | 195 | 8 | 40 |
| 3,0 × 2,4 × 0,10 | 206 | 7 | 54 |
| 3,0 × 2,4 × 0,15 | 100 | 10 | 67 |
Заказы на производство по цехам
| Цех | Что производит | Заказов, 2026 |
|---|---|---|
| Каменный | памятники, плиты, вазы, столы | 2 679 |
| Сварочный | оградки, металл | 869 |
| Малярный | гравировка, портреты, покраска | 862 |
| Плиточный | плитка, облицовка | 333 |
Структура заказа на производство
- Продукция — что производим (Работа/Запас).
- Операции — тех. операции с нормами времени.
- СоставБригады — исполнители.
- СписокНоменклатуры — текстовая сводка.
Сборка и сдельная оплата
Сборка запасов — фактическая сборка из материалов. Сдельный наряд — сдельная оплата работ (монтаж, гравировка).
Кто и как оформляет (исправленные роли)
- Менеджер оформляет заказ на производство из заказ-наряда:
Ответственный_Key= тот же менеджер, что ведёт заказ; указывает цех (СтруктурнаяЕдиница_Key). - Начальник профильного цеха (каменного / малярного / сварочного / плиточного) принимает задачу и назначает исполнителя на операции (
Операции.Исполнитель). - Бригада (работники + КТУ) назначается в СдельномНаряде →
СоставБригады(в самом заказе на производство бригада пустая). Это оплата труда.
Состояния производства
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 сотрудник).
Шапка: к каким справочникам ведут поля
| Поле | Справочник |
|---|---|
Ответственный_Key | Catalog_Сотрудники — менеджер (тот, кто ведёт заказ) |
Автор_Key | Catalog_Пользователи (НЕ Сотрудники) — через OData не читается |
СостояниеЗаказа_Key | Catalog_СостоянияЗаказовНаПроизводство (свой справочник) |
ДокументОснование / ЗаказПокупателя_Key | Document_ЗаказПокупателя — две параллельные связи на один заказ-наряд |
Организация_Key / СтруктурнаяЕдиница* | Catalog_Организации / Catalog_СтруктурныеЕдиницы |
ХозяйственнаяОперация_Key | Catalog_ХозяйственныеОперации = «Сборка» |
Положения реквизитов (где хранится значение): ПоложениеЗаказаПокупателя=ВТабличнойЧасти, ПоложениеСклада=ВТабличнойЧасти, ПоложениеИсполнителя=ВШапке, ПоложениеСтруктурнойЕдиницыОпераций=ВШапке.
Неочевидные механики (полная трассировка + журнал)
КлючПродукцииЗаказ= 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 — их не держат на складе, производят в цеху. Резервируются только складские готовые (памятники-заготовки ш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 месяцев |
Потребность к отгрузке берётся так: ДомП_КоличествоКОтрузке, если оно больше нуля, иначе
Количество. Так не завышается потребность у частично отгруженных заказов.
Правила формирования
- Один клиентский заказ = один заказ-наряд (товары + работы + материалы).
- Материалы привязаны к работе через
КлючСвязи. - Каждое изделие/работа → свой заказ на производство в профильный цех.
- Фундамент — монтажная работа, норма материалов зависит от размера.
- Отгрузка — через состояния заказа и поля строк.
Подводные камни
AccumulationRegister_Продажи задваивает выручку (подчинённые документы пишут свои движения). Правильный источник — СуммаДокумента заказов.$filter=Period ge … возвращает 400 на регистрах — тянуть целиком и фильтровать на клиенте.Номенклатура_Key, «Запасы» — Номенклатура.Содержание вручную, нужна нормализация.СостояниеЗаказа.Источники истины
| Что нужно | Правильный источник |
|---|---|
| Выручка по филиалу/менеджеру | СуммаДокумента заказов с положительной суммой; отменённые заказы («ВариантЗавершения» = «Отменен») и заказы с пометкой «аннулирован» не считаются продажей и в выручку не входят |
| Товары vs работы | табличная часть («Запасы»=товар, «Работы»=услуга) |
| Материалы на работу | связка по КлючСвязи |
| Состав изделия | Catalog_Спецификации → Состав |
| Размер | Содержание (парсинг) |
Кто участвует
Четыре роли: менеджер (создаёт и наполняет заказ-наряд), начальник цеха (принимает задачу по своему цеху и назначает исполнителей на операции), бригадир (монтаж), кладовщик (отгрузка, перемещения, склад). Плюс общий жизненный цикл состояний.
Шапка заказа
| Поле | Что это |
|---|---|
Контрагент | клиент |
Подразделение (филиал) — СтруктурнаяЕдиницаПродажи | где оформляется заказ |
Организация | ИП |
Ответственный | менеджер |
Вид заказа | Основной / АртБетон |
👤 Менеджер — что заполняет
- Товары (Запасы), Работы (со спецификацией/характеристикой/размером), Материалы (из спецификации).
- Доп. реквизиты: кладбище, ФИО усопшего, контакт, платежи/рассрочка, действия с демонтированным, планируемая дата.
- Статус для менеджера → «Передан».
👷 Бригадир — монтаж
Смотрит: назначенный бригадир, комментарий/график, примечания, действия с демонтированным.
Заполняет: статус бригадира («Принят» → «На монтаже» → «Готов к выдаче»), дату монтажа, сдельный наряд.
📦 Кладовщик — отгрузка
Сверяет: резерв, резерв-отгрузку, количество к отгрузке. Отгружает: флаг ДомП_Отгрузка в строках «Запасы» (дату ДатаОтгрузки не заполняет — см. «Подводные камни», реальная дата отгрузки = ДатаИзменения заказа). Перемещает между складами. Переводит состояние в «Отгружен».
Закрытие заказа
Создан → Жду уточнения → Передан → На монтаже → Готов к выдаче → Перемещен → Отгружен → Готов и принят бригадиром → Готов и принят заказчиком → Завершен.
Завершен — финал (после отгрузки, монтажа, принятия заказчиком, расчёта). АртБетон — упрощённо: Создан → Отгружен → Завершен.
СостояниеЗаказа (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 | Функция | Пишет в таблицы | Что даёт странице |
|---|---|---|---|---|
sales | last_sales_sync | sync_sales() | stock_sales(product_key,d,qty,amount) | Продано и выручка |
orders | last_sync | do_sync() → sync_incremental/sync_full | orders, items | заказы, состояния, резерв «запасным путём» |
registers | last_reg_sync | sync_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 | Свободно, Зарезервировано, подбор комплектов |
stock | last_stock_deep_sync | sync_stock_docs() | stock_move (движения по дням и типам) | В сборке, детали строки (приход/расход/остаток на начало) |
heavy / files / staff / reconcile | last_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, exp | AccumulationRegister_ЗапасыНаСкладах с фильтром Recorder_Type eq 'StandardODATA.Document_СборкаЗапасов' |
stock_asm_line | ТЧ «Запасы» самого документа по позиции | Document_СборкаЗапасов_Запасы — для сверки с движениями |
stock_asm_prod | ТЧ «Продукция»: что собрали (название и количество) | Document_СборкаЗапасов_Продукция |
нетто = расход − приход и есть реально ушедшее в изделие: колонка «В сборке» не задвоена (проверено 22.09.2026: ш120*60*7 — 13.3 по кэшу и 13.3 по девяти документам; 972 документа из 974 сошлись до копейки).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
_related_map(c)—stock_related: камень → сопутствующие (тумбы/цветники) из 1С._pick_weights(c, pick, from_d, to_d)— «расход» каждого камня = продано (из stock_sales) + резерв + производство.build_stones(..., "stele", pick, plan={"rows":{},"by_kind":{}})— берём свободный остаток камней (нужен для учёта решений о закупке)._eff_need(weights, free_by, buy_plan)— потребность с учётом правок «докупить»:calc = max(0, расход − свободно),buy = buy_plan или calc,eff = max(расход, buy + свободно)._build_plan(pick, kinds, related, eff)— по каждому камню основная тумба (минимальная подходящая по ширине) и цветник (ближайший по длине); остальные связи — «альтернативы», ближайший больший размер того же материала — «замена»; копитсяfor_qty(разбивка потребности по камням).api_plan— собираетitems(роли «нужно»/«альтернатива»/«замена»), распределяет свободный остаток альтернатив по дефицитам (сначала больший дефицит, с уменьшениемcap, чтобы один остаток не пообещать дважды) → поляcan / covers / why / own_need / own_deficit / own_for; считаетtotalsиfresh.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(отмеченные камни, localStoragedsh_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).
Грабли, на которые уже наступали
Продажи.#sec-stones не имел блока --an-*, из-за чего рамки, тени и приглушённые цвета не рисовались вовсе (в браузере border-bottom был 0px none). Лечится блоком переменных, как в других разделах.Как сверять с 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С
Журнал входов и изменений
Роли и доступ к разделам
Новая роль
Личные наборы разделов
Расписание синхронизации
Порядок и правила
• Ручной запуск сдвигает расписание — после кнопки «Запустить сейчас» раздел подождёт свой интервал.
• «Полный проход по заказам» — перечитать состояния и доп. реквизиты всех 10,5 тыс. заказов; изменённые заказы и так приходят инкрементом, поэтому чаще часа его гонять незачем.
• «Документы заказов»: за один проход обходится часть филиал-годов облака, полный круг складывается из нескольких проходов — поэтому интервал здесь в часах.
• Время указано по Омску (UTC+6), сервер хранит расписание в UTC — переход на летнее время не влияет.
| Время | Уровень | Источник | Сообщение |
|---|---|---|---|
| читаю журнал… | |||