Типовой дом за пять минут: шаблоны проектов и задач в ERPNext для тех, кто строит одно и то же
Шаблон проекта в ERPNext — это Project Template со списком типовых задач, где каждая задача заранее знает свой старт, длительность, вес и зависимости. При создании проекта выбираете шаблон, и задачи появляются сами. Ниже как собрать шаблон, что копируется, что нет, и где поведение стоит проверить на стенде.
Что такое Project Template в ERPNext и чем он отличается от копирования проекта?
Если компания строит, монтирует или внедряет одно и то же, каждый новый проект начинается с одинакового набора задач. Раньше такой набор копировали: брали прошлый проект, дублировали, правили даты. Это работает, пока в копии не окажется чужих комментариев, фактических дат и прочего мусора. Шаблон решает проблему иначе: в нём хранится только заготовка, а настоящий проект рождается из неё чистым. Наш вариант внедрения ERPNext для таких компаний описан на странице ERPNext под ключ, и шаблоны проектов относятся к самому быстрому, что в нём можно настроить.
Устройство я проверил по исходному коду версии 15, у версии 16 то же самое. Project Template состоит из двух полей: тип проекта (Project Type) и таблица Tasks. В таблице нет описаний задач, там только ссылки на документы Task. Сами «шаблонные» задачи это обычные документы Task, у которых включена галочка Is Template. Отдельного документа Task Template в системе нет, и это один из самых частых вопросов: роль шаблона задачи играет задача с флагом.
Что происходит при создании проекта. В форме Project есть поле «From Template». Если выбрать шаблон и сохранить проект, при отсутствии у проекта задач система копирует в него все задачи из шаблона. Если у проекта не задана дата начала, он стартует сегодня; если не задан тип проекта, берётся тип из шаблона. Сравните с копированием: вы получаете чистые задачи в статусе Open без истории.
Поэтому шаблон лучше копирования в трёх случаях. Когда набор задач стабилен и редко меняется. Когда проекты ведут разные руководители, и нужна единая схема. И когда нужно быстро обучить нового сотрудника, потому что ему не надо помнить порядок работ. Для сравнения: единый порядок онбординга сотрудника я разбирал в материале про онбординг за один день, там тот же принцип повторяемого процесса.
Как собрать шаблон: задачи, порядок, зависимости, веса
Порядок сборки такой. Сначала создаёте задачи-шаблоны: Task, включаете Is Template и заполняете тему, описание, приоритет и вес (Weight). У шаблонной задачи появляются два особых поля: Begin On (Days) и Duration (Days). Первое задаёт, на какой день после старта проекта задача начинается, второе сколько дней она длится. Затем создаёте Project Template, выбираете тип проекта и добавляете задачи в таблицу Tasks.
Иерархия и зависимости настраиваются тоже на задачах-шаблонах. Поле Parent Task объединяет подзадачи под групповой задачей; родитель при этом должен быть отмечен как группа (Is Group) и сам быть шаблонной задачей. Таблица Dependent Tasks описывает зависимости: зависимая задача тоже должна быть шаблонной. Если вы укажете обычную задачу, система вернёт ошибку «Dependent Task is not a Template Task». Эти проверки есть в коде, так что ошибаться придётся сознательно.
Что даёт вес. В проекте есть настройка «% Complete Method» со значениями Manual, Task Completion, Task Progress и Task Weight. Если выбрать Task Weight, процент выполнения проекта считается с учётом весов задач, а не поровну. Для дома фундамент и отделка не равны по трудоёмкости, и взвешенный процент честнее показывает реальное положение. Веса обычно задаю в сумме на 100, чтобы читать их как проценты.
Как копируются поля. Из шаблонной задачи в проектную переносятся тема, описание, вес, тип задачи, цвет, приоритет, связанная заявка и признак группы. Даты рассчитываются от даты старта проекта по формуле: начало равно старту плюс Begin On, окончание равно началу плюс Duration (в коде v15 это методы calculate_start_date и calculate_end_date). Если получившаяся дата выпадает на выходной из списка выходных (Holiday List) компании, она сдвигается вперёд на ближайший рабочий день. Иерархия и зависимости переносятся тоже: после создания задач система сопоставляет шаблонные задачи с проектными и расставляет Parent Task и Dependent Tasks.
Чего не копируется, и это стоит знать заранее. Флаг Is Milestone в списке копируемых полей кода я не нашёл, значит, в проектных задачах его придётся ставить вручную или добавить собственной настройкой. Эта оговорка есть и в версии 16. Полезно сразу прогнать на тестовом проекте и посмотреть, что именно получилось, до того как строить на шаблоне процесс компании.
- Task с Is Template: тема, описание, вес, приоритет.
- Begin On (Days) и Duration (Days): расписание от старта проекта.
- Parent Task и Dependent Tasks: только между шаблонными задачами.
- Project Template: тип проекта и таблица Tasks.
- Is Milestone не копируется из шаблона: ставится в проекте.
Вехи и оплата по этапам: Is Milestone и Payment Terms
Отдельного объекта «веха» в ERPNext нет. Есть флажок Is Milestone на задаче, и всё. Как я проверил в коде версии 15, этот флаг не участвует в проверках и расчётах: он нужен как отметка для фильтров, отчётов и для людей. Поэтому когда в статьях пишут «веха автоматически запускает оплату», будьте осторожны: такой связи в полях задачи нет, у задачи нет ссылки на график оплат.
Как я решаю задачу оплаты по этапам. График платежей задаётся в документах продаж через Payment Terms Template, и каждая строка графика описывает долю и срок. Названия строк делаю такими же, как названия вех: «Фундамент принят», «Отделка принята». Связь между вехой задачи и платежом ведёт человек: руководитель проекта, закрывая веху, сообщает бухгалтеру, что пора выставлять счёт по соответствующей строке. Это не автоматика, и я не обещаю её без разработки.
Другой приём для структуры этапов: родительская задача с подзадачами. Родитель отражает этап, подзадачи работы внутри него, и система следит за границами: она сравнивает ожидаемую дату окончания дочерней задачи с датой родительской и не даёт сохранить подзадачу, если та заканчивается позже родителя. Для вех я использую именно эту связку плюс флаг, чтобы этап был виден и в дереве задач (у Task есть древовидное представление), и в отчётах.
Если оплата по этапам для вас ключевая, договорённость о критериях приёмки лучше записать в описании задачи-вехи, а не держать в голове. Тогда в споре с заказчиком вы показываете чёткое описание, а не пересказ. Подобные вопросы согласования документов и этапов можно автоматизировать отдельно; о маршрутах согласования договоров у меня есть материал про автоматизацию согласования.
Как создать новый объект из шаблона и что получится автоматически
Создание нового объекта занимает пару минут. Открываете Project, указываете название («Дом №14»), клиента, при необходимости заказ покупателя, дату начала и в поле «From Template» выбираете шаблон. Сохраняете. Система создаёт задачи с датами, весами и зависимостями. Дальше руководитель проекта назначает ответственных и при необходимости правит сроки.
Что получается автоматически. Набор задач в статусе Open. Даты от старта проекта с учётом выходных. Иерархия и зависимости как в шаблоне. Вес каждой задачи. Тип проекта из шаблона, если вы сами его не указали. А вот ответственные не назначаются: шаблон не знает, кто будет работать на конкретном объекте, и это правильно. Назначение делается после создания, отдельным шагом, и я включаю его в список действий руководителя проекта.
Поведение дат стоит понимать, чтобы не удивляться. В коде задачи есть автоперенос: когда у задачи меняется срок окончания, зависимые от неё задачи в статусе Open, которые начинаются раньше этой даты, сдвигаются на следующий день после неё с сохранением длительности. Задачи в других статусах система не двигает. Кроме того, система не даёт завершить задачу, пока не завершены или не отменены задачи, от которых она зависит, и не даёт сохранить задачу с датами вне периода проекта. Эти проверки защищают от ошибок, но требуют, чтобы у проекта были заданы разумные даты начала и окончания.
Когда стоит править сам шаблон, а не проект. Если в трёх проектах подряд вы вручную удаляли или добавляли одну и ту же задачу, шаблон устарел. Исправления вносят в шаблонные задачи и в Project Template, и они действуют только на новые проекты: уже созданные проекты остаются как были. Это ожидаемо, но об этом полезно предупредить команду, чтобы никто не ждал, что старые проекты обновятся сами.
Сроки и представления: Gantt, Kanban и Calendar без драмы
Для задач есть несколько представлений: список, канбан, календарь, диаграмма Ганта и дерево. Календарь и Гант строятся по полям ожидаемых дат, начала и окончания, а полоска прогресса по полю процента выполнения. Дерево задач работает на иерархии Parent Task. У списка есть массовые действия: можно выделить задачи и одним действием перевести их в Open или Completed. Для руководителя проекта это самое полезное сочетание: канбан для статусов, гант для сроков.
Про диаграмму Ганта скажу осторожно. В нашей базе знаний есть оговорка: в старых версиях (десятой и двенадцатой) при перетаскивании полосок встречались ошибки с датами, например связь удалялась, а стрелка оставалась, или даты съезжали на месяц назад. Для версий 15 и 16 стабильность перетаскивания в базе знаний не подтверждена и вынесена в проверку на стенде. Поэтому я меняю сроки в форме задачи, а гант использую для просмотра, пока не проверю перетаскивание на своей версии.
Простой тест, который я провожу на тестовом проекте. Создать проект из шаблона. Перетащить полосу одной задачи на несколько дней вперёд и посмотреть, сдвинулись ли зависимые задачи и не изменились ли даты у остальных. Затем проверить то же через форму задачи. Затем удалить связь и убедиться, что стрелка исчезла. Результат записываю: он нужен команде как факт про их версию, а не как мой пересказ чужих баг-репортов.
Отчётность по проекту строится дальше: время сотрудников через табели, затраты и рентабельность объекта. Эти темы выходят за рамки статьи, и я их разбираю отдельно в материалах про проекты, Gantt и табели и про центры затрат. Здесь достаточно сказать, что шаблон даёт каркас, а учёт времени и затрат накладывается на те же задачи.
Как «Каркасный Город» ведёт типовой дом на 22 рабочих места
Условный пример. Компания по строительству каркасных домов «Каркасный Город», 22 рабочих места: прораб, пять бригадиров, проектировщик, сметчик, снабженец, администрация и рабочие бригад. Строят один типовой дом по одному проекту, но десятки раз в год. Цифры вымышлены для иллюстрации: это не реальный клиент и не нормативы стройки.
Они заводят пять задач-шаблонов с весами в сумме 100 и дополняют каждую расписанием. Условные значения: фундамент (старт на 0-й день, 14 дней, вес 20), каркас стен (14-й день, 21 день, вес 25), кровля (35-й день, 10 дней, вес 15), инженерные сети (45-й день, 14 дней, вес 15), отделка (59-й день, 21 день, вес 25). Каждая следующая зависит от предыдущей. Сводка: | Задача | Begin On, дн. | Длительность, дн. | Вес | Дата при старте 2 ноября | |---|---|---|---|---| | Фундамент | 0 | 14 | 20 | 02.11 – 16.11 | | Каркас стен | 14 | 21 | 25 | 16.11 – 07.12 | | Кровля | 35 | 10 | 15 | 07.12 – 17.12 | | Инженерные сети | 45 | 14 | 15 | 17.12 – 31.12 | | Отделка | 59 | 21 | 25 | 31.12 – 21.01 |
Даты в таблице посчитаны по формуле без учёта списка выходных: если дата окажется выходным днём в Holiday List компании, система сдвинет её вперёд, и новогодние праздники сдвинут отделку. Это ожидаемо и хорошо видно на примере: отделка начинается 31 декабря, а на деле стартует после каникул. Руководитель проекта видит это сразу при создании объекта и может скорректировать сроки в форме.
Работа с шаблоном выглядит так. Когда подписан договор на дом №14, руководитель проекта создаёт Project, выбирает шаблон и дату старта. Появляются пять задач, затем он назначает ответственных: бригадира на фундамент, бригадира на каркас и так далее. На задачах «Фундамент» и «Отделка» ставит вручную флажок Is Milestone, потому что они соответствуют этапам оплаты. Процент выполнения считается по весам: когда фундамент закрыт, проект показывает двадцать процентов.
Что компания проверяет на пилоте. Копируются ли зависимости и вес так, как ожидалось. Сдвигаются ли зависимые задачи при переносе срока. Как ведёт себя гант в их версии при перетаскивании. И что показывают представления для прораба, которому нужен простой список задач на сегодня. По итогам двух проектов шаблон правят: добавили задачу «Приёмка фундамента» перед каркасом. В примере это 20 минут работы, и новые дома получают исправленный набор сразу.
Чего шаблон не делает и что проверить на стенде
Перечень ограничений, который я проговариваю заказчику до запуска. Шаблон не назначает ответственных. Он не копирует флаг вехи. Он не связывает веху с платежом. Он не обновляет уже созданные проекты после изменений. Он не знает о различиях между объектами: если дом на склоне требует дополнительной задачи, её добавляют в проект вручную. И он не заменяет сметы и спецификацию договора: это отдельные документы, и спецификацию договора не стоит путать с производственной спецификацией (BOM) ERPNext.
Ещё одно ограничение, о котором часто забывают: шаблон хранит расписание в днях от старта, а не в датах. Если у вас внутри этапа есть жёсткие даты (поставка кровельных материалов к конкретному числу), их нужно заводить в проектных задачах. И ещё: чем больше задач в шаблоне, тем менее вероятно, что он пригодится как есть. Я держу шаблон на уровне этапов и ключевых работ, а не на уровне каждого гвоздя: сорок задач на дом уже много для бригадира.
Что я проверяю на демостенде перед запуском. Первое: создание проекта из шаблона на вашей версии, с копированием зависимостей и весов. Второе: перенос срока у задачи и сдвиг зависимых. Третье: поведение ганта при перетаскивании. Четвёртое: ручная расстановка Is Milestone и использование в отчётах. Пятое: как выглядит процент выполнения при выборе метода Task Weight. Результаты записываю в короткий протокол и прикладываю к договору внедрения. Показать это могу на демостенде по запросу.
Куда двигаться дальше. Если типовых проектов у вас несколько (дом, баня, гараж), делайте отдельный шаблон на каждый тип и не пытайтесь собрать универсальный: универсальные шаблоны вырождаются в список «на всякий случай». Если нужен контроль перерасхода материалов по спецификации, это уже другая цепочка документов; общий взгляд на системы учёта есть в материале про выбор системы учёта на Linux, а про открытую ERP для производства в статье про ERPNext для производства.
- Ответственные не назначаются, шаблон их не знает.
- Флаг Is Milestone не копируется, ставится в проекте.
- Связи вехи с оплатой нет, её ведёт человек.
- Изменения шаблона не меняют уже созданные проекты.
- Перетаскивание в ганте проверить на своей версии.
Частые вопросы
Как создать шаблон проекта в ERPNext?
Создайте задачи с галочкой Is Template, заполните Begin On и Duration, затем заведите Project Template, выберите тип проекта и добавьте эти задачи в таблицу Tasks. При создании проекта выберите шаблон в поле From Template, и задачи появятся сами.
Чем Task Template отличается от Project Template?
Отдельного DocType Task Template в версиях 15 и 16 нет: шаблонная задача это обычная Task с флагом Is Template и статусом Template. Project Template собирает такие задачи в таблицу и добавляет тип проекта.
Можно ли задавать зависимости между задачами?
Да: Parent Task, таблица Dependent Tasks и вес Weight переносятся из шаблона. Зависимости и родитель в шаблоне допустимы только между шаблонными задачами. Завершить задачу нельзя, пока её зависимости не завершены или не отменены.
Как в ERPNext показать вехи для оплаты по этапам?
Отдельной сущности вех нет: у задачи есть флаг Is Milestone, который не копируется из шаблона и не связан с графиком оплат. Этапы можно показать родительской задачей с подзадачами, а оплату привязывать вручную.
Работает ли диаграмма Ганта в ERPNext стабильно?
Гант строится по ожидаемым датам задач. В старых версиях (10, 12) были ошибки с датами при перетаскивании, для 15 и 16 стабильность в базе знаний не подтверждена. Меняйте сроки в форме задачи и проверьте перетаскивание на тестовом проекте.
Источники
- ERPNext version-15, DocType Task, Project Template и Project — Поля Is Template, Begin On (Days), Duration (Days), Weight, Is Milestone, Parent Task, Dependent Tasks; Project Template (project_type, tasks); Project: From Template и % Complete Method. https://github.com/frappe/erpnext/tree/version-15/erpnext/projects/doctype
- ERPNext version-15 и 16, project.py: создание задач из шаблона — Копируемые поля, расчёт дат с учётом списка выходных, сопоставление Parent Task и зависимостей; Is Milestone не копируется. https://github.com/frappe/erpnext/blob/version-15/erpnext/projects/doctype/project/project.py
- ERPNext version-15, task.py и task_calendar.js — Проверки (даты в пределах родителя и проекта, завершение зависимых), перенос зависимых задач в статусе Open, поля представлений календаря и ганта. https://github.com/frappe/erpnext/blob/version-15/erpnext/projects/doctype/task/task.py
- Документация ERPNext: Project Template и Task — Назначение шаблона проекта и таблицы задач, поля Parent Task, Depends On, Weight, Is Milestone, статусы задач. https://docs.frappe.io/erpnext/project-template
