创建应用程序

使用 bench 命令行工具创建一个 Frappe 应用脚手架。

创建应用

在开始之前,请确保你位于 bench 目录中。要确认这一点,请运行 bench find .

$ bench find .
/home/frappe/frappe-bench is a bench directory!

要创建我们的图书馆管理应用,请运行 new-app 命令:

bench new-app library_management

你会看到一些提示和类似下面的输出。你可以手动输入信息,或者直接按回车选择默认值。

App Title (default: Library Management):
App Description: Library Management System
App Publisher: Faris Ansari
App Email: [email protected]
App Icon (default 'octicon octicon-file-directory'):
App Color (default 'grey'):
App License (default 'MIT'):
'library_management' created at /home/frappe/frappe-bench/apps/library_management

Installing library_management
$ ./env/bin/pip install -q -U -e ./apps/library_management
$ bench build --app library_management
yarn run v1.22.4
$ FRAPPE_ENV=production node rollup/build.js --app library_management
Production mode
✔ Built js/moment-bundle.min.js
✔ Built js/libs.min.js
✨  Done in 1.95s.

系统会提示你填写应用的相关信息,填写完成后,一个名为 library_management 的应用将在 apps 文件夹中创建。

要查看 octicons 图标库中所有支持的图标完整列表,请访问 https://primer.style/octicons/

应用目录结构

你的应用目录结构应该类似于这样:

apps/library_management
├── README.md
├── library_management
│   ├── hooks.py
│   ├── library_management
│ │ └── __init__.py
│ ├── modules.txt
│ ├── patches.txt
│ ├── public
│ │ ├── css
│ │ └── js
│ ├── templates
│ │ ├── __init__.py
│ │ ├── includes
│ │ └── pages
│ │ └── __init__.py
│ └── www
└── pyproject.toml
  • library_management: 此目录将包含你应用的所有源代码

    • public: 存放静态文件,生产环境中将由 Nginx 提供这些文件
    • templates: 用于渲染 Web 视图的 Jinja 模板
    • www: 根据其目录路径提供服务的网页
    • library_management: 应用自带的默认模块
    • modules.txt: 应用中定义的模块列表
    • patches.txt: 用于数据库迁移的补丁条目
    • hooks.py: 用于扩展或拦截框架提供的标准功能的钩子
    • pyproject.toml: 指定应用的构建方式,你可以在此处可选地添加第三方 Python 依赖,这些依赖会在应用安装时被安装。

下一步:创建站点

安装与设置Bench

Bench 是用于管理 Frappe 应用和站点的命令行工具。

安装

如果你还没有安装 Bench,请按照安装指南进行操作。安装完成后,你应该能够运行以 bench 开头的命令。

运行以下命令来测试你的安装是否成功:

$ bench --version
5.1.0

创建 frappe-bench 目录

让我们创建项目文件夹,它将包含我们的应用和站点。运行以下命令:

$ bench init frappe-bench

这将在你当前的工作目录中创建一个名为 frappe-bench 的目录。它将执行以下操作:

  1. env 目录下创建一个 Python 虚拟环境。
  2. 获取并安装 frappe 应用作为 Python 包。
  3. 安装 frappe 的 node 模块。
  4. 构建静态资源。

目录结构

.
├── Procfile
├── apps
│   └── frappe
├── config
│   ├── pids
│   ├── redis_cache.conf
│   ├── redis_queue.conf
│   └── redis_socketio.conf
├── env
│   ├── bin
│   ├── include
│   ├── lib
│   └── share
├── logs
│   ├── backup.log
│   └── bench.log
└── sites
    ├── apps.txt
    ├── assets
    └── common_site_config.json
  • env:Python 虚拟环境

  • config:Redis 和 Nginx 的配置文件

  • logs:每个进程(Web、Worker)的日志文件

  • sites: 站点目录

    • assets: 生产环境中通过 Nginx 提供的静态资源
    • apps.txt: 已安装的 Frappe 应用列表
    • common_site_config.json: 所有站点通用的站点配置
  • apps: 应用目录

    • frappe: Frappe 应用目录
  • Procfile: 开发环境中运行的进程列表

启动 Bench 服务器

现在我们已经创建了 frappe-bench 目录,可以通过运行以下命令来启动 Frappe Web 服务器:

$ cd frappe-bench
$ bench start
18:16:36 system | redis_cache.1 started (pid=11231)
18:16:36 system | redis_socketio.1 started (pid=11233)
18:16:36 system | redis_queue.1 started (pid=11234)
18:16:36 system | socketio.1 started (pid=11236)
18:16:36 system | web.1 started (pid=11237)
18:16:36 system | watch.1 started (pid=11240)
18:16:36 system | schedule.1 started (pid=11241)
18:16:36 system | worker_short.1 started (pid=11242)
18:16:36 redis_queue.1 | 11234:C 10 Jul 2020 18:16:36.320 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
18:16:36 redis_queue.1 | 11234:C 10 Jul 2020 18:16:36.320 # Redis version=6.0.5, bits=64, commit=00000000, modified=0, pid=11234, just started
18:16:36 redis_queue.1 | 11234:C 10 Jul 2020 18:16:36.320 # Configuration loaded
18:16:36 system | worker_long.1 started (pid=11244)
18:16:36 redis_cache.1 | 11231:C 10 Jul 2020 18:16:36.318 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
18:16:36 redis_cache.1 | 11231:C 10 Jul 2020 18:16:36.318 # Redis version=6.0.5, bits=64, commit=00000000, modified=0, pid=11231, just started
18:16:36 redis_cache.1 | 11231:C 10 Jul 2020 18:16:36.318 # Configuration loaded
18:16:36 redis_cache.1 | 11231:M 10 Jul 2020 18:16:36.320 * Increased maximum number of open files to 10032 (it was originally set to 256).
18:16:36 redis_queue.1 | 11234:M 10 Jul 2020 18:16:36.325 * Increased maximum number of open files to 10032 (it was originally set to 256).
18:16:36 system | worker_default.1 started (pid=11245)
18:16:36 redis_cache.1 | 11231:M 10 Jul 2020 18:16:36.337 * Running mode=standalone, port=13000.
18:16:36 redis_cache.1 | 11231:M 10 Jul 2020 18:16:36.337 # Server initialized
18:16:36 redis_cache.1 | 11231:M 10 Jul 2020 18:16:36.337 * Ready to accept connections
18:16:36 redis_queue.1 | 11234:M 10 Jul 2020 18:16:36.367 * Running mode=standalone, port=11000.
18:16:36 redis_queue.1 | 11234:M 10 Jul 2020 18:16:36.367 # Server initialized
18:16:36 redis_queue.1 | 11234:M 10 Jul 2020 18:16:36.367 * Ready to accept connections
18:16:36 redis_socketio.1 | 11233:C 10 Jul 2020 18:16:36.359 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
18:16:36 redis_socketio.1 | 11233:C 10 Jul 2020 18:16:36.359 # Redis version=6.0.5, bits=64, commit=00000000, modified=0, pid=11233, just started
18:16:36 redis_socketio.1 | 11233:C 10 Jul 2020 18:16:36.359 # Configuration loaded
18:16:36 redis_socketio.1 | 11233:M 10 Jul 2020 18:16:36.374 * Increased maximum number of open files to 10032 (it was originally set to 256).
18:16:36 redis_socketio.1 | 11233:M 10 Jul 2020 18:16:36.417 * Running mode=standalone, port=12000.
18:16:36 redis_socketio.1 | 11233:M 10 Jul 2020 18:16:36.418 # Server initialized
18:16:36 redis_socketio.1 | 11233:M 10 Jul 2020 18:16:36.418 * Ready to accept connections
18:16:37 socketio.1 | listening on *: 9000
18:16:41 web.1 | * Running on http://0.0.0.0:8000/ (Press CTRL+C to quit)
18:16:41 web.1 | * Restarting with fsevents reloader
18:16:41 watch.1 | yarn run v1.22.4
18:16:41 watch.1 | $ node rollup/watch.js
18:16:42 watch.1 |
18:16:42 watch.1 | Rollup Watcher Started
18:16:42 watch.1 |
18:16:42 watch.1 | Watching...
18:16:42 web.1 | * Debugger is active!
18:16:42 web.1 | * Debugger PIN: 100-672-925
18:16:43 watch.1 | Rebuilding frappe-web-b4.css
18:16:44 watch.1 | Rebuilding frappe-chat-web.css
18:16:44 watch.1 | Rebuilding chat.js
18:16:45 watch.1 | Rebuilding frappe-recorder.min.js
18:16:48 watch.1 | Rebuilding checkout.min.js
18:16:48 watch.1 | Rebuilding frappe-web.min.js
18:16:51 watch.1 | Rebuilding bootstrap-4-web.min.js
18:16:52 watch.1 | Rebuilding control.min.js
18:16:54 watch.1 | Rebuilding dialog.min.js
18:16:57 watch.1 | Rebuilding desk.min.css
18:16:57 watch.1 | Rebuilding frappe-rtl.css
18:16:58 watch.1 | Rebuilding printview.css
18:16:58 watch.1 | Rebuilding desk.min.js
18:17:04 watch.1 | Rebuilding form.min.css
18:17:04 watch.1 | Rebuilding form.min.js
18:17:07 watch.1 | Rebuilding list.min.css
18:17:07 watch.1 | Rebuilding list.min.js
18:17:09 watch.1 | Rebuilding report.min.css
18:17:09 watch.1 | Rebuilding report.min.js
18:17:12 watch.1 | Rebuilding web_form.min.js
18:17:12 watch.1 | Rebuilding web_form.css
18:17:13 watch.1 | Rebuilding email.css
18:17:13 watch.1 | Rebuilding social.min.js
18:17:13 watch.1 | Rebuilding barcode_scanner.min.js
18:17:15 watch.1 | Rebuilding data_import_tools.min.js

这将启动多个进程,包括基于 Gunicorn 的 Python Web 服务器、用于缓存、任务队列和 SocketIO 发布/订阅的 Redis 服务器、后台 Worker、用于 SocketIO 的 Node 服务器以及用于编译 JS/CSS 文件的 Node 服务器。

Web 服务器将在端口 8000 上开始监听,但目前我们还没有任何站点可供服务。下一步是创建我们的应用,并创建一个安装了该应用的站点。

请确保不要关闭运行 bench start 的终端。要运行 bench 命令,请打开另一个终端,并 cd 到 frappe-bench 目录中。

到目前为止,你做得很好!

下一步:创建应用

安装

系统要求

本指南假设您使用的是个人电脑、VPS 或裸机服务器。您还需要使用 *nix 系统,因此支持任何 Linux 发行版和 macOS。如果您是 Windows 用户,可以在 WSL 中使用 Ubuntu。我们仅正式支持以下发行版。

  1. macOS
  2. Debian / Ubuntu

在此处了解更多关于架构的信息。

前置要求

依赖项 Frappe v14/v15 Frappe v16/develop
MariaDB 10.6.6+ 11.8
Python 3.10+ 3.14
NodeJS 18+ 24
Redis / valkey 6 6+
Yarn 1.12+ 1.22+
pip 20+ 25.3+
  • wkhtmltopdf:0.12.6 版本,带有修补过的 qt – 用于生成 PDF
  • cron:bench 的定时任务 – 自动证书续期、定时备份

macOS

安装 Xcode 工具的命令行版本。

xcode-select --install

安装 Homebrew。它可以让您在 macOS 上轻松安装软件包。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

(它可能会在最后提示您运行一些额外的命令,这将确保 brew 在您的 PATH 中可用)

安装 wkhtmltopdf

curl -L https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-2/wkhtmltox-0.12.6-2.macos-cocoa.pkg -O

installer -pkg wkhtmltox-0.12.6-2.macos-cocoa.pkg -target ~

现在,您可以通过运行以下命令轻松安装所需的软件包

brew install git redis [email protected] pkg-config mariadb-connector-c

如果您计划使用 PostgreSQL 而不是 MariaDB,那么您可以包含 postgresql

在此安装过程中,系统会提示您设置 MySQL root 密码。如果没有提示,您需要自行初始化 MySQL 服务器设置。您可以通过运行以下命令来完成:

sudo mariadb-secure-installation

请记住:仅在设置过程中未提示您输入密码时才运行此命令。

然后,继续执行通用步骤

Debian / Ubuntu

您应该运行 Debian 13+ 或 Ubuntu 24.04+,否则某些软件包可能会出现问题。

更新您系统的软件包索引

sudo apt update

安装 gitredismariadb

sudo apt install git redis-server libmariadb-dev mariadb-server mariadb-client pkg-config

在此安装过程中,系统会提示您设置 MySQL root 密码。如果没有提示,您需要自行初始化 MySQL 服务器设置。您可以通过运行以下命令来完成:

sudo mariadb-secure-installation

请记住:仅在设置过程中未提示您输入密码时才运行此命令。

请务必记住此密码,因为稍后会用到它。

安装 wkhtmltopdf

sudo apt install xvfb libfontconfig

从 https://wkhtmltopdf.org/downloads.html 下载并安装 wkhtmltopdf 软件包,然后运行此命令来安装该软件包。

sudo dpkg -i wkhtmltox_file.deb

通用依赖项

安装 nvm、node 和 yarn

我们建议使用 nvm 安装 node

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

nvm 安装完成后,您可能需要关闭终端并打开另一个标签页/窗口,或者 source 您的 shell 的 rc 文件(例如:~/.bashrc~/.zshrc。然后运行以下命令来安装 node。

nvm install 24

通过运行以下命令验证已安装的版本:

$ node -v
v24.12.0

最后,使用 npm 安装 yarn

npm install -g yarn

** 安装 uv 和 python **

我们建议使用 uv 来管理 python

curl -LsSf https://astral.sh/uv/install.sh | sh

uv 安装完成后,您可能需要关闭终端并打开另一个标签页/窗口,或者 source 您的 shell 的 rc 文件(例如:~/.bashrc~/.zshrc。然后运行以下命令来安装 python。

uv python install 3.14 --default

或者,对于版本 15,您可以选择 3.10-3.13 之间的版本。

安装 Bench CLI

通过 pip 安装 bench

uv tool install frappe-bench

通过检查版本来确认 bench 安装成功

bench --version

创建您的第一个 bench。

mkdir ~/frappe
cd ~/frappe
bench init my-bench

恭喜,您已在系统上成功安装了 bench。

先决条件

以下资源列表可帮助您开始使用 Frappe 构建应用程序。

1. Python

Frappe 使用 Python 3 进行服务器端编程。强烈建议您在开始使用 Frappe 框架构建应用程序之前,先学习 Python。

资源:

  1. Codecademy Python 教程
  2. Python 官方教程

2. MariaDB / Postgres

要使用 Frappe 创建数据库驱动的应用程序,您必须了解数据库管理和常见 SQL 查询的基础知识。

资源:

  1. Codecademy SQL 教程
  2. DigitalOcean 提供的 MySQL 基础教程
  3. MariaDB 入门指南

3. HTML / CSS

如果您想使用 Frappe 框架构建用户界面,您需要学习基本的 HTML / CSS 以及 Bootstrap CSS 框架。

资源:

  1. Codecademy HTML/CSS 教程
  2. Bootstrap 入门指南

4. JavaScript / jQuery

要自定义表单并创建交互式用户界面,您必须学习 JavaScript 和 jQuery 库。

资源:

  1. 现代 JavaScript 教程
  2. Codecademy JavaScript 教程
  3. Codecademy jQuery 教程

5. Jinja 模板

要构建 Web 视图和打印模板,您需要学习 Jinja 模板语言。

资源:

  1. Jinja 文档

6. Git / GitHub

学习如何使用 Git 和 GitHub 为开源项目做贡献,这两个强大的工具可以帮助您管理代码并与他人分享。

资源:

  1. Git 基础教程
  2. 如何为开源项目做贡献

如果您对这些工具的基础知识已经熟悉,那么您就可以开始使用 Frappe 框架构建应用程序了。

下一步:创建 Bench

介绍

什么是 Frappe 框架?

Frappe,发音为 fra-pay,是一个全栈、开箱即用的 Web 框架,使用 Python 和 Javascript 编写,并以 MariaDB 作为数据库。它是驱动 ERPNext 的框架,非常通用,可用于构建数据库驱动的应用程序。

为什么选择 Frappe?

Frappe 与其他框架的关键区别在于,元数据也被视为数据。这使得您可以非常轻松地构建前端。我们信奉单体架构,因此 Frappe 几乎包含了构建现代 Web 应用程序所需的一切。它拥有一个功能齐全的管理界面,称为 Desk,可处理表单、导航、列表、菜单、权限、文件附件等众多功能,开箱即用。在此处了解更多信息。

主要特性

  1. 全栈框架:Frappe 涵盖前端和后端开发,允许开发人员使用单一框架构建完整的应用程序。
  2. 内置管理界面:提供预构建、可自定义的管理仪表板,用于管理应用程序数据,减少开发时间和精力。
  3. 基于角色的权限:全面的用户和角色管理系统,用于控制应用程序内的访问和权限。
  4. REST API:为所有模型自动生成 RESTful API,便于与其他系统和服务的集成。
  5. 可自定义的表单和视图:使用服务器端脚本和客户端 JavaScript 进行灵活的表单和视图自定义。
  6. 报表生成器:强大的报表工具,允许用户无需编写任何代码即可创建自定义报表。

安装

在您使用 Frappe 之前,需要先进行安装。我们提供了一份完整的安装指南,涵盖了所有可能性,本指南还将帮助您了解后端技术栈。

学习与社区

  1. Frappe School – 通过维护者或社区提供的各种课程学习 Frappe 框架和 ERPNext
  2. GitHub – 探索源代码、贡献代码,并与 Frappe 社区协作。
  3. 讨论论坛 – 在我们的论坛上与我们不断壮大的社区交流,提问、帮助他人并成为社区的一员。
  4. buildwithhussain.com – 观看 Frappe 框架在实际应用中构建世界级 Web 应用程序的案例。

避免页签系列问题的文档命名

当您在 ERPNext 中保存文档(如销售发票、库存录入、付款单等任何带有自动生成编号的内容)时,系统需要确定序列中的下一个编号(例如 0001、0002、0003 等)。

为了确保两个文档永远不会获得相同的编号,ERPNext 在名为 tabSeries 的表中为每个命名系列维护一个计数器。在分配下一个编号之前,它会锁定该计数器,防止其他操作同时访问,然后加 1,最后解锁。这个过程在瞬间完成,因此通常您不会察觉到。

如果同时创建数百个文档,并且它们都使用相同的命名系列,那么它们都需要同一个计数器。同一时间只能有一个操作持有锁,因此其他操作必须排队等待。

当排队等待的时间变长时,您可能会遇到以下情况:

  • 文档保存耗时较长
  • 批量导入或批量提交速度缓慢甚至卡住
  • 出现类似“Record has changed since last read in table ‘tabSeries’”的错误,或数据库锁/死锁超时
  • 后台任务在队列中堆积

在业务高峰期、月末或为应对负载而增加更多工作进程后,这个问题会变得更加严重,因为现在有更多的交易在争抢同一个计数器。

为什么定制化会加剧此问题

一个非常常见的原因是定制化配置强制大量交易使用单一、受限的命名系列。所有交易都汇聚到一个计数器上,导致该计数器成为整个操作的瓶颈。规模越大,这个单一计数器后面的排队就越长。

简单的解决方法:使用多个命名系列

计数器是按命名系列分别锁定的。因此解决方法很简单:

为不同的交易组分配各自的命名系列,这样它们就会使用不同的计数器,不再相互等待。

与其在一个计数器前排长队,不如开设多个计数器。每个队列独立并行运行。

拆分系列的好方法

选择任何能自然区分您交易的方式。例如:

按以下方式拆分 示例系列
分支机构 SINV-MUM-.YYYY.-.####, SINV-DEL-.YYYY.-.####
项目 SINV-PROJ-A-.####, SINV-PROJ-B-.####
成本中心 SINV-CC01-.####, SINV-CC02-.####
部门 SINV-SALES-.####, SINV-SUPPORT-.####

每种情况的核心思想都是一样的:同时运行的交易不应都挤在同一个计数器上。您将它们分散得越开,每个交易需要等待的时间就越短。

针对超大规模操作的额外建议

如果您经常一次性创建大量文档:

  • 将大批量导入分散到多个系列中,以分担负载,而不是将所有内容都导入到一个系列下。
  • 在导入/API 调用时尽可能自行提供名称。如果文档已有名称,ERPNext 将完全跳过计数器。无需锁定,无需等待。例如,客户 ID 是根据客户名称本身生成的。
  • 避免将所有内容强制归入一个狭窄系列的定制化配置。审查任何自定义命名逻辑,确保它不会将所有交易都汇聚到单个计数器上。
  • 如果流程允许,稍微错开超大型任务的启动时间,而不是在同一瞬间全部触发。

一个文档对应多行的报表

有时,报表中同一单据编号可能会出现在多行中。这通常并不意味着单据被重复了,而是表示该报表针对该单据显示了多条匹配的数据行。

这种情况在包含子表字段、链接记录或详细的会计和库存分录的报表中很常见。

最常见原因:选择了子表

许多 ERPNext 单据都有子表。例如:

  • 一张销售发票包含多个销售发票项目
  • 一张采购订单包含多个采购订单项目
  • 一个付款计划可以有多个到期日。
  • 一笔交易可以有多个税费、扣款或会计行。

当报表包含子表中的字段时,报表会为每个子表行显示一行。

例如,如果销售发票 SINV-0001 有 3 个项目行,并且报表包含销售发票项目中的字段,则报表可能会显示:

SINV-0001    Item A
SINV-0001    Item B
SINV-0001    Item C

该发票仍然是一个单据。报表只是针对每个项目行显示了一次该发票。

为什么会这样

报表是基于数据库行构建的。父单据和子表之间是一对多的关系。

一个父单据可以对应多个子表行:

Sales Invoice
  - Item 1
  - Item 2
  - Item 3

当报表包含子表数据时,Frappe 需要分别显示每个子表行,以便子表值可见。这是预期行为。

报表显示多行的其他原因

1. 包含了多个子表

如果报表包含多个子表中的字段,行数可能会进一步增加。

例如,如果一张发票有 3 个项目行和 2 个税行,一个结构不佳的自定义报表可能会显示比预期更多的行,因为两个子表被连接在一起了。

在这种情况下,请检查报表设计,只包含所需的子表。

2. 报表显示分类账或明细分录

有些报表本身就是明细级别的报表,并非设计为每个单据显示一行。

例如:

  • 总分类账样式的报表可能为每个会计分录显示一行。
  • 库存报表可能为每个库存分类账分录显示一行。
  • 应收或应付报表可能根据发票、付款或未结引用显示行。

同一个凭证号可能出现多次,因为一个单据可以生成多个分类账分录。

3. 报表包含具有多个匹配项的链接记录

一个单据可能连接到多个相关记录。例如,一张发票可以链接到多个付款分录、交货单、序列号、批次或会计引用。

如果报表包含来自这些链接记录的数据,则父单据可能会针对每个匹配的链接记录显示一次。

4. 自定义查询报表存在连接问题

在自定义查询报表中,如果 SQL 查询在没有正确条件的情况下连接表,则可能会出现重复行。

例如,连接父表和子表时,如果没有将子表行与其父单据匹配,可能会产生过多行。

请检查查询是否使用正确的父字段连接子表,例如:

child.parent = parent.name

当子表是共享的或查询需要更具体时,还要检查 parenttypeparentfield 等字段。

5. 报表未进行分组

如果目标是每个单据显示一行,则报表可能需要进行分组或聚合。

例如,报表可以不单独显示每个项目行,而是按销售发票分组并显示:

  • 总数量
  • 总金额
  • 项目行数
  • 首个或最后一个日期

这取决于您需要的是汇总报表还是明细报表。

如何检查行重复的原因

  1. 打开其中一个重复的单据。
  2. 检查其子表中是否有多行,例如项目、税费、付款计划或其他明细表。
  3. 在报表中,检查是否有任何选定的列来自子表。
  4. 如果是自定义报表,请检查连接和筛选条件。
  5. 确定报表应显示明细行还是每个单据一行汇总行。

如何实现每个单据显示一行

如果您希望每个单据显示一行,请尝试以下方法之一:

  • 从报表中移除子表列。
  • 仅使用父 DocType 中的字段。
  • 使用分组,例如按单据名称分组。
  • 使用聚合值,如求和、计数、最小值或最大值。
  • 构建一个自定义查询报表或脚本报表,使其每个父单据返回一行。

总结

当报表包含子表数据或其他明细级记录时,同一单据出现多行通常是预期行为。

关键问题是:报表应显示每一行明细,还是应将单据汇总为一行?

如果报表旨在回答项目级、税务级、分类账级或库存条目级的问题,则多行是正确的。如果旨在回答单据级的问题,请使用父字段、分组或自定义报表设计。

  • 报表
  • 报表生成器
  • 查询报表
  • 脚本报表
  • 子表 / 表格 DocType

帮助文章索引

以下是一些帮助文章,可帮助您根据需求配置系统。

系统

  • 文档版本管理
  • 在持续进行的消息中添加附件
  • 复制粘贴多条记录
  • 重命名文档
  • 批量重命名
  • 删除和恢复文档
  • 删除自定义报表
  • 恢复已删除的文档
  • 重复记录
  • 检查文档之间的链接
  • 选择字段中的筛选选项
  • 自动化分配
  • 发送和接收邮件时出错
  • 最大用户数限制问题
  • 权限级别错误
  • 权限错误问题
  • 使用预生成的报表
  • 未收到邮件
  • 表单中的最大字段数
  • 制作自定义报表
  • 删除自定义报表
  • 报表中一个文档显示多行
  • 在标准报表中添加列
  • 使用 Jinja 获取子表值
  • 创建字段后更改自定义字段的数据类型
  • 按公司设置命名系列
  • 使用 Web 表单请求反馈
  • 管理主数据的树形结构
  • 为任何字段设置默认值
  • 设置精度
  • 设置语言
  • 编辑已提交的文档
  • 删除已提交的文档
  • 设置命名系列的当前值
  • 设置工作流的简单步骤
  • 树形主数据重命名
  • 报表中的信头
  • 将文档类型与事件日历同步
  • 基于层级结构的用户权限
  • 在打印格式中添加/删除字段
  • 自定义打印格式中的表格
  • 自定义打印格式中的字段可见性
  • 移除打印格式中的描述
  • 以文字形式打印美元的“分”

会计

  • 合并科目
  • 更改上级科目
  • 冻结科目
  • 冻结会计凭证
  • 通用应收科目
  • 销售退货管理
  • 从销售发票交货
  • 默认应收/应付科目
  • 资本科目的付款凭证
  • 登记备用金凭证
  • 坏账处理
  • 采购发票科目类型错误
  • 分别登记允许和收到的折扣
  • 为日记账凭证添加参考
  • 付款凭证中的发票折扣
  • 从所有者权益科目中提取工资
  • 买一赠一定价规则
  • 无金额调整
  • 远期支票凭证
  • 差额凭证
  • 设置税费
  • 未对账
  • 期末结账凭证
  • ERPNext QuickBooks 迁移工具
  • 处理对账单
  • 付款条款状态报表
  • 公司间日记账凭证
  • 在单独往来单位科目中预付款
  • 会计年度错误
  • 舍入科目验证消息
  • 删除与总账凭证关联的凭证
  • 发票舍入问题
  • 自定义现金流量表
  • 导出特定年份或筛选条件的数据
  • 分配贷项通知单和付款
  • 核对供应商预付款
  • 临时科目余额
  • 计算运费税费
  • 已收货但未开票的目的
  • 期末结账

采购

  • 服务采购发票
  • 价格调整的借项通知单
  • 采购跟踪报表
  • 提交后修改采购订单

销售

  • 销售人员目标分配
  • 在销售周期中更改项目费率
  • 销售交易中的销售人员
  • 记录销售合作伙伴的佣金
  • 批量提前关闭订单
  • 关闭销售订单
  • 提交后修改销售订单
  • 应用折扣
  • 从销售订单请求原材料
  • 设置公司销售目标
  • 无项目的销售发票
  • 子公司之间的直运
  • POS 中的忠诚度积分兑换
  • 以不同计量单位销售

资产

  • 将资产从库存项目转换为固定资产项目

客户关系管理

  • 自动化潜在客户创建
  • 潜在客户、联系人和客户之间的区别

库存

  • 使用条形码跟踪项目
  • 项目估值设置和交易
  • 原材料估值
  • 退回拒收项目
  • 重新包装凭证
  • 国际贸易术语和指定地点
  • 快速库存余额
  • 质量检验摘要
  • 迁移到永续盘存制
  • 先进先出和移动平均法
  • 非库存项目的永续盘存
  • 预计数量
  • 序列化和批次项目的期初库存余额凭证
  • 关联库存仓库和科目
  • 在项目主数据中维护供应商项目代码
  • 以不同计量单位采购
  • 生产废料管理
  • 客户提供的项目
  • 单一原材料生产多种成品
  • 不创建物料清单进行生产
  • 物料消耗
  • 生产分析
  • 未结工单报表
  • 需求驱动预测
  • 产品计划报表
  • 停机分析
  • 工单消耗物料
  • 针对工单退回的物料
  • 针对工单发出的项目
  • 从交货单和采购收货单进行物料转移
  • 允许超额交货/开票
  • 物料编码

项目

  • 制作彩色甘特图
  • 在项目中批量分配任务
  • 项目盈利报告
  • 项目管理与费用控制
  • 从客户门户创建项目

网站

  • 在ERPNext网站中禁用注册功能
  • 网站首页设置
  • 网站横幅尺寸调整
  • ERPNext的SEO优化
  • ERPNext中的301重定向

ERPNext农业模块

概述

农业模块是作为 ERPNext 的一个领域应用而创建的,专为农场和以农业为核心的组织设计。它旨在帮助用户记录农作物和土地信息,跟踪农业活动,并维护与田间相关的观察数据,例如植物、土壤、水分、天气、病害和肥料信息。

该应用以独立的开源代码仓库形式在 Frappe 组织下提供。然而,在新的 ERPNext 站点上使用之前,应仔细评估其适用性。

维护与兼容性状态

重要提示: 农业应用似乎并未像 ERPNext 核心以及其他积极开发的 Frappe 应用那样得到同等水平的积极维护。该代码仓库没有发布任何正式版本,用户不应假定它与最新的 ERPNext 或 Frappe Framework 版本兼容。

如果您计划使用它,请先在预发布站点上进行测试,并确认它与您具体的 ERPNext、Frappe Framework 和 Python 版本兼容。若用于生产环境,请准备好审查代码、应用修复程序,或在必要时维护一个分支(Fork)。

GitHub 代码仓库

源代码:github.com/frappe/agriculture

该代码仓库将该应用描述为 ERPNext 的农业领域应用。

基本功能

  • 农作物记录: 维护与组织所种植农作物相关的信息。
  • 土地记录: 跟踪农业用地或田块信息。
  • 植物分析: 记录与植物相关的观察数据和测量结果。
  • 土壤、水分和天气跟踪: 维护可能影响作物规划和作业的田间环境观测数据。
  • 病害跟踪: 记录作物或植物的病害信息,以供参考和后续跟进。
  • 肥料跟踪: 作为农业作业的一部分,跟踪与肥料相关的信息。

何时使用

仅当您确实需要农业领域对象,并且愿意自行验证或维护该应用时,才考虑使用它。它可能作为自定义农业工作流的起点很有用,但在未经测试的情况下,不应将其视为适用于当前 ERPNext 版本的即插即用模块。

安装

代码仓库的 README 文件展示了标准的 Frappe 应用安装流程:

bench get-app agriculture
bench --site your-site-name install-app agriculture

仅在确认兼容性之前,于开发或预发布环境中运行这些命令。

  • 在安装前,检查代码仓库的活动情况、未解决的问题和拉取请求。
  • 先在测试站点上安装该应用。
  • 在使用真实数据之前,运行迁移和基本工作流。
  • 确认其 DocTypes 和报表是否满足您的运营需求。
  • 如果该应用与您的 ERPNext 版本不兼容,建议将其作为自定义应用的参考,而不是直接在生产环境中安装。
  • GitHub 上的 Frappe Agriculture

ERPNext教育模块

概述

Frappe Education 是一款面向 Frappe 和 ERPNext 生态系统的开源教育管理应用。它帮助学校、学院、辅导机构及其他学术机构在一个系统中管理学术行政、学生信息、课程、招生、费用、排课以及学生自助服务。

该应用基于 Frappe 框架构建,并与 ERPNext 协同工作,因此机构可以在管理学术运营的同时,继续使用 ERPNext 进行会计和其他业务流程管理。

GitHub 仓库

源代码:github.com/frappe/education

该仓库将 Frappe Education 描述为一个开源的教育管理系统,旨在简化教育机构中的行政和学术流程。

何时使用 Frappe Education

当机构需要一个由 ERPNext 支持的系统来管理学术运营(而不仅仅是一个学习管理系统)时,应使用 Frappe Education。当需要以结构化的方式管理学生记录、教师、课程、招生、费用收取和学术日程时,该应用非常有用。

主要功能

  • 学生和教师管理:维护学生、监护人和教师的基本资料及学业记录。
  • 招生管理:管理学生申请和招生流程,从咨询到注册入学。
  • 专业与课程:定义学术专业、课程、班级、学期和课程安排。
  • 考勤管理:跟踪学生出勤情况,并将其用于学术行政管理和报告。
  • 费用管理:创建收费结构、安排收费计划并跟踪付款状态。
  • 学生门户:让学生访问课程表、考勤、费用和成绩等信息。

与 ERPNext 的集成方式

Frappe Education 扩展了 ERPNext,以支持教育领域的特定工作流程。ERPNext 提供更广泛的 ERP 基础,而 Frappe Education 则添加了教育机构所需的学术对象和流程。这使得它非常适合那些希望在同一个生态系统中同时拥有教育管理和 ERP 式会计或运营功能的组织。

  • Frappe Education GitHub 仓库
  • Frappe Education 官方网站
  • Frappe Education 文档