1C:ENTERPRISE 8.3 实用开发者指南-示例和标准技术(Session1-Session3)
1C:ENTERPRISE 8.3(1课-3课)
本博客是全网首个关于1C:Enterprice的中文指南,支持快速吸收使用 1C:Enterprise 8.3 软件开发和调整应用程序的技术
在这篇博客中我会基于实际应用示例,演示各种系统对象的结构、功能和用法。使用内置语言编写的程序(包括涉及查询语言的程序)均附有详细的注释。
本博客既可作为对1C:Enterprice的实践指南,也可作为目前唯一一篇中文1C:Enterprice的参考书。本书中采用的解决方案充分考虑了1C:Enterprise软件开发过程中积累的经验,并展示了该软件8.3版本提供的诸多新可能性和机制。
注明:本指南主要针对不熟悉 1C:Enterprise 软件的初级开发人员。
简要目录
第 1 课 (0:40)。简介,创建信息库。(Introduction, Creating an Infobase.)
第 2 课 (00:45)。子系统。(Subsystems.)
第 3 课 (02:10)。目录。(Catelogs.)
第 4 课 (01:30)。文件。(Documents)
第 5 课 (02:00)。理论课。(Theoretical Lesson.)
第 6 课 (00:50)。累积寄存器。(Accumulation Registers.)
第 7 课 (00:25)。简化版报告生成接口。(Simple Report.)
第 8 课 (01:10)。模板。编辑模板和表单。(Templates. Editing Templates and Forms.)
第 9 课 (00:50)。定期信息寄存器。(Periodic Information Registers.)
第 10 课 (00:30)。枚举。(Enumerations.)
第 11 课 (01:20)。跨多个寄存器发布文档。(Posting a Document across Multiple Registers.)
第 12 课 (00:40)。营业额累积登记簿。(Cumulative turnover register)
第 13 课 (04:30)。报告。(Reports.)
第 14 课 (03:20)。服务提供凭证过账优化。(Optimization of Posting the Services Rendered Document.)
第 15 课 (02:50)。特征类型图表。(Chart of Characteristic Types.)
第 16 课 (01:50)。会计。(Accounting.)
第 17 课 (01:00)。计算类型图表,计算寄存器。(Chart of Calculation Types, Calculation Register.)
第 18 课 (03:40)。使用计算寄存器。(Using a Calculation Register.)
第 19 课 (01:30)。数据库搜索。(Database Search.)
第 20 课 (01:00)。执行计划作业。(Executing Scheduled Jobs.)
第 21 课 (00:40)。在文档表单中编辑登记记录。(Editing Register Records in the Document Form.)
第 22 课 (01:00)。用户列表及其角色。(User List and Their Roles.)
第 23 课 (01:10)。桌面和命令界面设置。(Desktop and Command Interface Setup.)
第 24 课 (06:10)。数据交换。(Data Exchange.)
第 25 课 (00:30)。功能选项。(Functional Options.)
第26课 (01:00). 选择与输入的基础(Choices and Input on Basis)
第27课 (02:10)。形态发展技巧(Techniques of Form Development)
开发人员的快速参考。(Developer's Quick Reference.)
词汇表。(Glossary.)
介绍
本博客是专门为 1C:Enterprise 8.3 平台的最终版本发布而编写的。
1C:Enterprise 8.3 是第 8版平台架构的二次彻底变革,是自首次发布以来最重要的变革。
一方面,本博客针对性的描述了 1C:Enterprise 8.3 平台版本中对于开发最重要的所有主要功能:托管界面的设计、托管表单的开发、使用报告变体及其设置的新机会、发布文档的新方法、桌面设置、命令界面、使用功能选项等。
另一方面,本博客现在独立开设了一个章节,介绍如何使用语法助手,以及如何使用调试器分析现有代码并开发自己的代码。这些信息无疑将帮助新手开发人员学习 1C: Enterprise 8.3 脚本的众多功能。此外,还演示了在数据库记录和字段级别限制访问权限的示例。
目标
本博客基于一个真实案例,该案例为一家从事个人服务领域的小型公司开发应用程序。在阅读过程中,读者将学习 1C:Enterprise 8 中的主要开发方法,以及会计、工资单等各类经济活动自动化领域的知识。
为什么选择这个特定例子?
一方面,大多数人都熟悉服务业,经常会接触家电维修、汽车保养、洗衣干洗、发型设计等各类服务场景,容易对案例产生代入感。另一方面,通过维护业务中的具体活动,能够直观展示 1C:Enterprise 8 的系统能力 —— 既涉及客户服务管理、材料需求对接、服务成本核算等业务流程,也涵盖人力资源管理、工资计算等功能模块,同时还能说明会计账务处理流程。由于业务场景丰富,博客可全面展示利用系统现有信息生成各类会计报表和汇总报告的能力。
本博客主要面向刚开始开发应用程序的新手开发者,讲解风格细致入微,即便只具备编程基础知识的读者也能轻松理解。如果您刚刚开始接触 1C,或对其完全陌生但希望掌握该系统,博客将逐步指导您了解 1C:Enterprise 8 中应用程序开发的主要阶段,证明开发能力可以通过系统学习逐步掌握。对于经验丰富的开发人员,博客也有助于其更新技能或深入了解开发细节。
如何阅读本博客?
博客采用接近教程的形式,包含独立课程。每节课开头会标注预计学习时间,方便读者评估平均学习时长。课程结束后设有测验,供读者检验知识掌握情况。
博客附有简短目录,列出课程及其时长;课程内包含更详细的子目录,帮助读者快速定位特定内容;所有课程的详细目录汇总于博客末尾。每节课都是应用程序开发的完整环节,建议新手从头到尾完整完成每节课,避免中途衔接困难。
课程按照由浅入深的顺序编排,逐步讲解 1C:Enterprise 8 的核心开发方法与不同领域。博客包含大量 1C: Enterprise 脚本代码的图表和示例,并配有详细解释,读者若觉得解释过于详尽可选择性跳过。部分课程包含理论内容,可随进度学习或延后阅读,不影响开发示例的实践操作。
第五节特别设置理论课,通过实例详细介绍调试器和语法助手的使用方法,助力读者进一步自学 1C: Enterprise 脚本,并处理任务执行中可能出现的错误。
博客中创建的配置存储于随附光盘的演示信息库。光盘包含四个信息库,分别对应第 8、13、20 和 27 课的学习内容,方便读者快速查找所需配置片段,核对书中示例的执行效果。
平台培训版的限制
1C平台的培训版存在一些限制,无法完整执行本书中的示例。这些限制并不多,比如:
第24课涵盖数据交换。平台的培训版本不支持测试示例第二部分(分布式信息库)的运行。但可以将能够充分学习第一部分(更通用的部分,即通用交换机制)。
第 20 课涵盖了计划作业。平台的培训版本不支持同时启动两个会话:一个用于作业调度程序,另一个用于普通用户会话。但可以连续运行它们,以确保它们都能正常运行。
在第 22 课中,将创建系统用户列表。平台的培训版本不允许为用户创建密码,也不支持使用操作系统工具启用身份验证。但学习这方面内容并非至关重要,因为仍然可以代表每个创建的用户运行软件。只是这些用户没有密码。
第 1 课 简介,创建信息库
第一课重点熟悉 1C:Enterprise 8 和主要开发工具 Designer。
将了解平台、配置和应用程序等术语的含义。还将了解各种 1C:Enterprise 8 启动模式。
还将了解什么是配置对象、如何创建新对象以及定义它们的属性。
最后,将创建一个新的空信息库来开发我们的培训配置。
编程还是开发?
我到底在做什么?!每个从事过 1C工作,或者仅仅了解过这个领域的人,都会时不时地问自己这个问题。
“我在编程,”这是最常见的回答。“用什么语言?”——“1C。”“你在做什么?”——“1C。”“是用什么语言编写的?”——“1C。”“招聘懂1C语言的会计”、“需要兼职1C语言程序员……”等等。
这类说法随处可见,你可能也听过。普通听众可能不怎么在意,但对 1C(企业开发)有所了解的人,这类问题会让人困惑,因为1C指的是完全不同的概念,而“程序”这个词 更是让人摸不着头脑。
如果你的目标是学习使用 1C 进行编程,那么这并不是一个完全正确的目标。1C:Enterprise 8 包含一个脚本,但这个脚本并非开发过程中最重要的部分。而且,这本书并没有教你人们通常理解的编程。这本书教授的是在 1C:Enterprise 8 平台上开发应用程序。这个过程当然包含编程,但编程只是开发工具之一。
重要的是,你从一开始就了解这一点,只要刚开始操作 1C:Enterprise 8。
为了帮助准确理解我们将在本书中共同创造的内容,我将首先概述 1C:Enterprise。
总体概述
1C:Enterprise 是一款通用软件,用于自动化公司的财务和运营活动。由于这些活动可能非常多样化,1C:Enterprise 能够适应其应用领域的特定需求。这种能力可以用“可配置性”来概括,它描述了根据特定公司和特定任务集的需求定制系统的能力。
之所以能够做到这一点,是因为 1C: Enterprise 不仅仅是一个由一组固定文件组成的程序。相反,它是一套由开发人员和用户使用的多样化软件工具。从逻辑上讲,该系统可以分为两个紧密相关的主要组件:配置和 控制配置功能的平台。
为了更容易理解这些系统组件之间的关系,我们将其比作CD播放器。众所周知,听音乐需要播放器。然而,鉴于“人人皆有其乐”,市面上有各种各样的CD,可以满足各种口味。
要收听曲目,你需要将 CD 放入播放器,播放器就会播放录制的音乐。此外,最新的 CD 播放器甚至允许您录制自己选择的音乐,即创建新的 CD。
就其本身而言,如果没有 CD,播放器就毫无用处,同样,如果没有播放器,CD 本身也是毫无用处的(除非可以作为咖啡杯的杯垫)。
回到1C:Enterprise,你可以说平台是一种“播放器”,而配置则是一张“CD”。平台允许配置运行,并允许修改配置或创建新配置。
只有一个平台(1C:Enterprise 8)和多种配置。应用程序要运行,始终需要平台和一些配置(单个配置,图 1.1)。
该平台本身不执行任何自动化任务,因为它的目的是提供一个配置可以运行的环境。对于配置而言也是如此:为了执行其预期的任务,它需要一个管理其运行的平台。
图 1.1.多种配置和单一平台
配置与应用
现在我们终于可以回答上一节提出的问题了。在阅读实现演示示例的过程中,我将开发一个配置。
需要说明一下下文将要用到的术语中存在的一些小歧义。这种歧义源于我们使用了不同的术语来指代同一个对象:配置和应用程序。
这两个术语均指 1C(企业)中由平台管理且所有用户可见的部分。当然,也有一些用户使用平台设备,但这些用户属于高级用户。具体使用哪个术语取决于具体语境。
在谈论开发人员的工作时,我们会使用“配置”一词,因为在 1C:企业级架构中,这是一个更精确的术语。相反,“应用程序”一词的使用范围更广,也更容易被 1C:企业级架构的用户理解。
因此,由于自动化任务可能千差万别,正如我们上面提到的,1C 公司及其合作伙伴开发了各种应用程序,每个应用程序都旨在实现人类活动某一特定领域的自动化。现有应用程序的示例如下:
- 1C:Small Business Management 8,
- 1C:Accounting 8,
- 1C:Enterprise 8. Trade Management,
- 1C:Payroll and Human Resources 8,
- 1C:Enterprise 8. Manufacturing Enterprise Management,
- 1C:Consolidation 8.
还有许多其他标准应用程序。标准应用程序本质上是通用的,可以满足同一领域最广泛的公司的需求。这是一件好事。
另一方面,这种通用性最终不可避免地会导致这样一种情况:一些公司不会使用应用程序的大量功能,而某些功能则会缺失(不可能满足所有人)。
可配置性的作用就在于此 ,因为除了管理配置的功能之外,平台还提供资源,使你用户以自定义正在使用的配置。此外,如果用户出于某些原因决定不使用标准配置,平台还允许用户从头创建自己的配置。
请注意,在一段话中,我们从应用程序跳到了配置。这是没有办法的。一种方法对用户更有意义,另一种方法对开发者更有意义。
所以,现在我们回到CD播放器的类比,我们可以根据自己的喜好修改CD上录制的旋律,甚至可以用自己的音乐制作光盘。而且我们不需要任何乐器。创作旋律所需的一切都包含在CD播放器中。
系统运行模式
为了提供这些功能,1C: Enterprise 有两种不同的操作模式:1C: Enterprise和Designer。
1C:企业模式是最基本的模式:它允许用户使用软件。在这种模式下,用户输入数据、处理数据并获得结果。
设计器模式供开发人员和信息库管理员使用。此模式提供修改现有配置或创建新配置所需的工具。
由于本书的目的是教您创建自己的配置并修改现有配置,因此接下来的讨论将主要讨论在设计器模式下使用系统。我们只会偶尔在 1C:企业模式下运行系统来检查我们的工作。
如果您学习本书,我们假设您的计算机上已经安装了 1C: Enterprise 8。如果没有,现在就应该安装它,因为接下来的文字将引导您了解该软件的使用逻辑。
创建信息库
安装 1C: Enterprise 应该没问题。有关安装过程的详细信息,请参阅“1C:Enterprise 8.3 管理员指南”。
您还应该能够毫无困难地启动软件并创建具有空配置的信息库。
请注意!为了创建本书中的示例,你需要一个用于开发新配置的信息库,而不是一个基于模板创建的信息库。
运行 1C:企业版。在打开的对话框中,将看到正在使用的信息库列表。如果列表为空,系统将提示您创建一个新的信息库。如果列表中有任何可用的信息库(即您已安装演示配置),请点击“添加”以创建新的信息库(图 1.2)。
图 1.2.创建信息库。步骤 1
在打开的对话框中选择创建一个新的信息库(图 1.3)。
点击“下一步”。接下来选择“创建没有配置的信息库...”(图 1.4)。
图 1.4.创建信息库。步骤 3
点击“下一步”。下一步,为您的信息库定义一个名称,并选择“在此计算机上…” 作为其位置类型(图 1.5)。
点击“下一步”。接下来指定信息库的目录。默认语言为英语(图 1.6)。
图 1.6.创建信息库。步骤 5
单击“下一步”。现在单击“完成” (图 1.7)。
在 1C:企业启动对话框中,信息库列表将包含新创建的空信息库(图 1.8)。
图 1.8.1C:Designer 模式下的企业启动
在设计师模式下(Designer Model)
设计师模式简介
现在,让我们在设计器模式下运行 1C: Enterprise。为此,请在启动对话框中单击“设计器” (见图 1.8)。
显示设计器窗口(图 1.9)。
这是我将用来创建配置的工具。Designer 主菜单位于窗口标题正下方,包含文件、编辑、配置、管理等项目,每个菜单项都有多个子项,可在 Designer 中执行各种操作。
设计器工具栏位于主菜单下方,包含一些图标,用于访问最常用的操作 —— 这些操作也可以通过菜单完成。因此,执行一个操作有两种方式:选择特定菜单项,或单击相应的工具栏按钮。
大量不熟悉的图标可能会让新手开发人员感到困惑。不过不用担心,随着时间推移,你会轻松区分它们。只需将鼠标光标指向任意按钮并悬停几秒,就会出现工具提示,描述该按钮的功能(见图 1.9)。
你最初可能会使用菜单项,但最终会更多使用工具栏,因为它更便捷。如果需要,你可以通过添加或删除特定按钮来自定义工具栏(图 1.10)。
配置对象树
我们先从第一个命令开始 —— 打开配置,这个命令始终用于对配置进行操作。你可以通过 “配置” 菜单项中的 “打开配置” 来执行,也可以单击相应的工具栏按钮(见图 1.9)。
操作完成后,会显示配置对象树(见图 1.11)。
可以说,配置对象树是开发人员的核心工具,它几乎涵盖了配置结构的所有信息。
你可能会好奇:为什么在创建任何内容之前,这棵树就已经包含信息了?
为了方便开发人员,所有配置项都被合并成组,此时树状图会展示这些组。如果你沿着树形图浏览并点击 “+” 符号,会发现所有组都是空的。唯一的例外是 “常用四种语言” 组,你会在其中找到标题为 “英语” 的内容。平台自行创建了 “英语” 项,因为在本例中,设计人员使用的是英语界面。
显然,你已经准备好开始实际操作了,但首先需要了解一些术语。我在讨论配置内容时,有意识地避免使用特定术语。现在是时候定义一些术语并讨论配置对象了。
配置对象的定义
配置本质上是一种定义,它规定了用户在 1C:企业模式中可访问的数据范围。
同时,配置还会定义处理数据的所有可用例程,包括数据在屏幕上的展示方式、打印输出格式等信息。1C:企业平台会基于这些定义创建具有相应结构的数据库,并支持用户对数据进行操作。
为了快速、便捷地针对特定应用场景定制 1C: Enterprise,配置中包含的所有定义都以 “配置对象” 这一逻辑项的形式存在。你可能已浏览过《1C: Enterprise 8.2 开发人员指南》这类文档,其中对配置对象有简要介绍。
在这篇博客里,我不会重复文档中的定义 —— 我的目标不是将 1C:企业系统设计背后的策略解读为聚焦业务要素的元数据结构,而是教你如何正确、高效地使用 1C:企业的功能。因此,我会从日常工作的角度解释配置对象的本质,这种解释同样能帮助你准确理解这些对象在实际任务中的作用。
一方面,配置对象可看作构成配置的 “积木块”。一套积木通常包含多种形状的组件,比如长块、短块、矩形块、正方形块等。你可以按需选择不同组件的数量(例如 5 个长块和 3 个短块),并通过多种方式将它们组合在一起。
配置对象也是如此:我们只能创建特定类型的配置对象,但可以根据需求创建任意数量的同类型对象。不同类型的对象通过属性(更准确地说,是不同的属性集合)区分,且对象之间可以建立交互关系,这种关系也能由我们定义。
配置对象与积木块的相似性还体现在:积木中既有可以互相连接的组件,也有像车轮这样无法直接连接、但能通过轴实现转动的组件 —— 即同一套积木中的不同组件有不同的功能逻辑。
类似地,配置对象的行为也因其类型而异:某些对象支持特定操作,另一些对象则不具备这些操作,但拥有自己的专属操作集。
配置对象的结构特性可以用汽车来类比:汽车由大量零件组成,发动机是其中之一,而发动机本身又由多个零件构成,同一个零件可能在不同发动机中被使用。
同理,“复杂” 配置对象由 “简单” 对象组成,同一个 “简单” 对象也可以成为多个复杂对象的组成部分。这种结构让配置对象更易于使用 —— 如果掌握了某个 “简单” 对象的工作逻辑,当它作为 “复杂” 对象的一部分时,你也能以相同的方式处理它。
最后,配置对象最重要的属性在于其实用性:它并非开发人员用于描述任务的抽象结构,而是对应企业运营中真实存在的具体对象。
例如,每家公司都会用各类单据确认交易执行情况,配置中就包含 “Document(单据)” 类型的对象;每家公司都需要维护员工列表、物品或商品目录,配置中也提供了专用的 “目录” 类型对象,方便开发人员创建这些列表的数字化版本。
如前所述,平台会基于配置对象创建包含数据的数据库表。在文档中,配置对象及其对应的数据库表集通常会被统一命名。例如,若配置中包含 “Employees(员工)” 目录对象,平台根据该对象创建的表集也会被称为 “Employees 目录”。
在这篇博客中,我会避免模糊的表述:当讨论配置层面的内容时,会使用 “员工目录配置对象” 这样明确的术语;当涉及数据库层面时,则直接引用 “员工目录”。
添加配置对象
在开始添加初始配置对象之前,请注意,为了开发你自己的配置来自动化公司的经济活动,开发人员只能使用平台中严格指定的有限配置对象集。开发人员无法创建自己的配置对象。只能将系统中可用的标准对象添加到配置中。
在开始之前,我们应该解释一些用于操作设计器的技术。
要打开或关闭配置,请使用“配置4打开配置”或“配置4关闭配置”菜单项。相应的工具栏按钮也可用。
配置打开后,其内容将显示在配置树窗口中(见图 1.11)。此窗口可以像其他 Windows 窗口一样关闭,但关闭后,配置本身仍保持打开状态(即仍可进行编辑)。要再次显示配置树窗口,请使用“配置”菜单命令。
有几种方法可用于添加新的配置对象。你可以选择最清晰、最方便的方法。
第一种方法. 将光标移动到所需的配置对象分支,然后在配置窗口命令栏中选择操作4添加 按钮(图 1.12)。
第二种方法。 你可以使用右键单击后打开的上下文菜单。将光标定位到所需的配置对象分支上,然后右键单击。在弹出的菜单中,选择“添加” (图 1.13)。
图 1.12.添加配置对象
图 1.13.添加配置对象
第三种方法. 将光标移动到所需的配置对象分支,然后单击配置窗口命令栏中的添加(带有图标 +)(图 1.14)。
我们认为最后一种方法是最方便的,因此将来我们主要会使用它。
属性面板
那么,让我们开始吧!
让我们为我们的配置定义一个名称,并使用此示例来介绍开发人员可以用来定义创建的配置对象的各种属性的属性面板。
属性面板 是一个专用的服务窗口,用于编辑配置对象的所有属性及其他相关信息。由于不同的配置对象属性差异很大,因此此窗口的内容会根据当前对象(光标所在的配置对象)而有所不同。
现在突出显示配置对象树中的配置根项并双击它以打开其属性面板。
选择StartersGuide作为配置名称。
相应的同义词是自动定义的,但您可以根据需要进行更改。将来,我们将在 1C:Enterprise 工作窗口中看到此内容(图 1.15)。
当开发人员执行某些操作时,属性面板会自动打开。但开发人员始终可以通过选择上下文菜单(通过右键单击访问)中的“属性”命令来手动打开对象的属性面板。
在这种情况下,属性面板也会以类似的方式打开并停靠在设计器的工作区内。这意味着,当任何配置对象被高亮显示时,其属性窗口将始终打开。不过,有一个便捷的选项,可以使用属性面板窗口标题中的图钉图标来“分离”属性面板(图 1.16)。
在此状态下,当鼠标指针移动到任何其他窗口时,属性面板将最小化为单独的右侧面板(图 1.17)。
图 1.16.分离属性面板
图 1.17.附加面板上的按钮
当光标移动到最小化调色板的图标时,它会再次打开。
除了属性面板之外,其他设计器窗口(例如配置树窗口)的行为方式也类似(可以停靠、隐藏等)。
在 1C:企业模式下初始化调试
现在让我们验证一下 1C:企业模式中的初始修改。
为此,请选择“调试 ”> “开始调试”或单击设计器工具栏上的相应按钮。软件将分析配置中更改的可用性,并提示您更新数据库配置(图 1.18)。
我们不会详细讨论为什么会发生这种情况,因为这将在“主配置和数据库配置”(第 92 页)中描述。
在 Designer 提示中选择“是”。显示 1C:Enterprise 窗口(图 1.19)。
在 1C 中:企业模式
应用程序界面的外观
图 1.19.1C:企业
窗口标题显示配置的名称。空白处是应用程序的工作区。此区域目前未填充任何项目。
1C:Enterprise 窗口中的配置标题没有显示任何内容。因为我们尚未创建任何配置对象,也尚未创建子系统来显示此类对象。
下一课将讨论作为1C(Enterprise界面开发)基础的子系统。现在,在浏览完第一课的总结后,请测试一下你的知识,看看你对所讨论内容的掌握程度。
测验
- 1C:Enterprise 系统的可配置性是什么?
- 该系统的主要组成部分有哪些?
- 平台和配置有什么区别?
- 1C:Enterprise 的两种运行模式分别有什么用处?
- 什么是配置对象树?
- 什么是配置对象?
- 系统根据配置对象创建什么?
- 如何添加新的配置对象?
- 属性面板有何用途?
- 如何在调试模式下启动 1C:Enterprise?
第 2 课 子系统(Subsystems)
在本课中,我们将学习称为子系统的配置对象作为 1C:Enterprise 8 接口声明性描述的基础。
我们将创建多个子系统来定义应用程序的逻辑结构。我们还将自定义它们在应用程序界面中的外观和顺序。
子系统的定义
子系统是构建1C(Enterprise interface)的主要元素。因此,在开始开发配置时,首先要指定子系统的分类。
在这样做时,开发人员面临一项关键任务:仔细考虑子系统的分类,然后将要创建的配置对象链接到子系统,同时注意所有细节。
在简单的应用中可以避免使用子系统,但我们将考虑使用子系统的一般情况。
子系统配置对象旨在分离配置中的一些功能部分,这些部分是所创建应用程序的逻辑部分。
这些对象位于公共对象分支中,使我们能够创建由子系统和从属子系统组成的树状结构(图 2.1)。
图 2.1.配置中的子系统结构
顶级子系统是主要的接口项,因为它们生成应用程序的各个部分(图 2.2)。
每个配置对象可能包含在一个或多个子系统中,并在这些子系统中显示。
展望未来,我们将在此提及,子系统与角色可见性相结合,使我们能够为用户提供易于使用且功能丰富的界面,而无需任何不必要的项目。例如,库存管理员需要能够接收和发放产品,但他们完全不需要查看任何与会计和服务提供相关的内容。
因此,子系统的可用性决定了应用程序的结构,安排了整个用户界面,并能够按逻辑相关的部分对各种文档、目录和报告进行排序,以便用户更轻松地查找和使用它们。请注意,每个特定用户只能看到其工作所需的部分(即应用程序的功能)。
即使对于像我们这样的小型配置,我们也可以定义代表不同主题领域的多个功能组件。
因此,我们可以将与会计有关的所有内容放入单独的子系统中。
此外,工资单代表另一个独特的功能领域。
我们公司“Jack of All Trades”的整个生产流程可以分为材料记录和提供服务。
此外,数据库的特定管理员功能使我们拥有一个只有管理员才能访问的单独子系统。
因此,我们现在将在配置中创建五个新的 Subsystem 对象,并分别命名为:
Accounting、Payroll、GoodsManagement、RenderingServices和Enterprise。具体操作如下。
添加子系统
在设计师模式下
关闭应用程序并返回设计器。要创建新的子系统,请点击配置对象树中分支名称左侧的“+”图标,展开“Common”分支。现在突出显示子系统分支,打开其上下文菜单并选择添加或单击配置窗口的命令栏中的相应按钮(图 2.3)。
图 2.3.向配置对象树添加新子系统
这将打开配置对象编辑窗口。
它专为复杂的配置对象而设计,并可以通过逐步的过程快速创建它们。
窗口下方的“下一步”和“上一步”按钮用于保持步骤的顺序。“下一步 ”按钮可 用于设置对象属性
按正确的顺序(以避免遗漏任何内容或跳转到需要上一步数据的位置)。如果你发现之前遗漏了某些内容或犯了错误,可以使用“后退” 按钮返回上一步。以后,您可以通过立即选择所需选项卡(例如“数据”选项卡)来定义对象的属性。打开配置对象编辑窗口时,会选择“常规”选项卡。
笔记
在开发过程中,为了编辑对象属性,有时可能需要重新打开配置对象编辑窗口。为此,请在配置对象树中选择所需的项,然后单击配置窗口命令栏中的“更改当前项 (F2)”按钮,或双击所选项。
现在选择 子系统的名称为Accounting。平台将根据该名称自动创建同义词 Accounting(图 2.4)。
图 2.4.定义子系统的名称和同义词
配置对象的名称和同义词
名称是任何配置对象的主要属性。创建新对象时,系统会自动分配一个名称。
您可以使用自动分配的名称,但最好将其更改为您理解的名称。名称可以随意,只要以字母开头且不包含某些特殊字符(例如空格)即可。
为了提高可读性,通常使用直观易懂的名称。如果名称包含多个单词,则删除空格,并将每个单词的首字母大写。对象名称是唯一的,用于通过 1C:Enterprise 脚本调用该对象的属性和方法。
每个配置对象都具有Synonym属性。它用于存储配置对象的“替代”描述。此描述将由我们的软件界面项使用。换句话说,它就是用户将会看到的内容。因此,同义词几乎没有任何限制,并且可以用常见的、易于理解的形式编写。
子系统图标
为了增强应用程序界面,我们还可以分配一个用于显示子系统的图标。
首先,点击“图标”字段中的选择按钮(见图 2.4)。在图标选择窗口中,将您想要的图片添加到“来自配置”选项 卡的列表中。为此,请点击“添加” (图 2.5)。
图 2.4
图 2.5.选择一个图标来表示子系统
系统将创建一个通用图片配置对象并打开一个窗口来编辑其属性。
将此图标命名为Accounting。要定义图片本身,请单击“从文件中选择” (图 2.6)。
图 2.6.通用图片配置对象编辑器
现在,在本书附带的磁盘上浏览到 存储所有图片的名为Image的文件夹,并指定所需的图像文件。
为了能够预览图像,请选中“预览”。
突出显示名为Accounting的文件并单击打开(图 2.7)。
图 2.7.选择一个图标来代表一个子系统
选定的图片将显示在共享图片编辑器中。
现在关闭共享图片配置对象的编辑器,并返回到会计子系统的图片选择窗口。现在,你会看到“来自配置”选项卡 上显示的图片列表 包含新添加的图片。单击“确定”(图 2.8)。
所有这些操作都会在配置对象树的“共享图片”分支中显示一个名为“会计”的图片 。我们可以编辑此图片并将其用于我们的配置中(图 2.9)。
图 2.8.选择一个图标来表示一个子系统。
图2.9.配置对象树中的常用图片。
现在我们回到名为Accounting的子系统配置对象的编辑器。你会看到我们选择的图片(具有相同的名称)现在已被指定为该子系统的图标(图 2.10)。
因此1C:Enterprise界面会显示该子系统的同义词作为部分名称,并且所选图标将显示在此同义词下方。
如果子系统没有图标,该部分仍会显示在界面中。在这种情况下,部分名称附近会显示一个默认图标。
现在再次选中“子系统”分支,并在配置对象树中单击“添加”,以创建名为 GoodsManagement 和 RenderingServices 的新子系统。将共享图片“Goods”和“Services”指定为这些子系统的图标(首先,你需要使用与会计子系统相同的步骤,从名为 Goods 和 Services 的文件中添加它们)。
图 2.10.选定的图片被指定为子系统的图标
现在我们将使用另一个程序来添加子系统。首先打开其中一个新创建的子系统的上下文菜单。选择“添加”。此菜单项包含两个子项。如果选择“子系统”,你将能够添加与突出显示的子系统具有相同层级的子系统。选择“下属子系统”将允许你添加一个从属于突出显示子系统的子系统(图 2.11)。
图 2.11.向配置对象树添加新子系统
由于我们的配置中不需要复杂的多级结构,因此请选择第一个选项并添加名为Payroll的子系统。使用名为Payroll的共享图片为该子系统分配一个图标(应首先从名为Payroll的文件中添加)。
最后,添加一个名为Enterprise的子系统,用于访问管理员和服务功能。
应用程序的部分面板
在 1C 中:企业模式
在调试模式下运行 1C: Enterprise,并记录修改后的效果。开发中的应用程序的外观已经发生了变化(图 2.12)。
在主菜单下方,我们可以看到应用程序的部分面板,其中显示了所有已创建的子系统。所有部分都带有我们在属性中选择的图标。
各部分以超链接形式呈现。点击超链接,用户可以打开相关文档、目录、报告等。由于我们尚未创建任何配置对象来填充这些部分,因此部分列表目前为空。
笔记
请注意,名为“Desktop”的部分默认自动生成。此部分用于托管用户最常访问的文档、报告和其他项目。
部分顺序
在设计师模式下
但是我们对子系统的排列顺序并不完全满意。让我们修改它。
关闭应用程序并返回设计器。突出显示名为StartersGuide的配置对象树的根,右键单击它以打开上下文菜单,然后选择“打开配置命令界面” (图 2.13)。
图 2.13.打开配置命令接口的设置窗口
在打开的命令界面窗口中,你将看到已创建的子系统(应用程序的各个部分)列表。使用“向上”和“向下”按钮可以更改列表中各个部分的排列方式。
第一个子系统应该是那些展示公司生产运营的子系统:货物管理和提供服务。
紧随其后的是那些展示会计和工资的子系统:会计和工资。最后一个是名为企业的子系统(图 2.14)。
在 1C 中:企业模式
在调试模式下运行 1C:Enterprise,注意应用程序部分面板中显示子系统的顺序已经根据我们的偏好发生了变化(图 2.15)。
关闭应用程序并返回设计器。在下一课中,我们将开始创建初始配置对象,将它们分配给各个子系统,并 在 1C:企业界面中演示它们的用法。
警告
成功完成每节课后,建议使用主菜单中的“AdministrationDump Infobase”保存配置。如果你遇到问题并希望恢复到已运行的版本,此功能将非常有用。为此,请使用“AdministrationRestore Infobase”。
理论。配置对象编辑器和属性面板
乍一看,对象编辑器和属性面板似乎是多余的。事实上,属性面板反映了配置对象的所有属性。那么,为什么要在此基础上创建对象编辑器呢?如果对象编辑器已经存在,我们为什么还需要属性面板呢?它以不同的布局呈现相同的信息。
配置对象编辑器主要用于快速创建新对象。快速创建需要输入对象的详尽信息。因此,您需要了解对象结构的所有信息,但这需要时间。那么,我们该如何快速创建对象呢?
很简单。对象编辑器基于“主控”机制。其流程引导开发人员按照正确的顺序输入所需数据。数据输入顺序的设计使得先前输入的数据可以作为后续数据输入的基础。使用“下一步” 和“后退” 按钮进行导航。在每个步骤中,都会提示开发人员输入一组逻辑相关的信息。
现在假设您已经熟悉了对象的结构,或者只需要更改一些对象属性。为了避免从头“重演”整个过程,对象编辑器提供了选项卡,可让你直接进入进行所需调整的步骤。因此,对象编辑器可以帮助我们快速创建新的配置对象,同时在编辑现有对象时,可以轻松访问所需的属性。
但说到属性面板,它提供了一个绝对无可替代的功能。它的优势在于其结构不与任何特定类型的配置对象绑定。因此,它的内容会根据当前对象而变化。凭借这一点,它可以“记住”所选的属性,并且当沿着树向下移动到另一个对象时,它会高亮显示相同的属性,但针对的是新选择的对象。
属性面板的这个功能至关重要,例如,如果你需要在配置的三十多个目录中快速找到属于某个特定目录的目录。在这种情况下,你可以在任意目录的属性面板中使用鼠标选择“所有者”属性。然后转到配置对象树,并使用或者 箭头按钮。
测验
- 为什么要使用子系统配置对象?
- 如何使用子系统对象定义配置的逻辑结构?
- 如何管理配置中显示子系统的顺序?
- 什么是配置对象编辑器?它与属性面板有何不同?
Lesson 3. 目录(Catalogs)
在本节课中,我将带大家了解 目录(Catalog) 配置对象。我会介绍这个对象的用途、结构以及主要属性。
通过实际案例,你将学习如何创建目录,定义其结构中的主要条目,并向其中填充数据。
此外,我会详细讲解一个特定的配置对象 ——表单(Form)。你会了解目录配置对象中存在哪些表单类型,以及它们适用的场景。
最后,课程结尾我会分享一些关于配置修改机制的理论知识。
啥是目录(What Catalogs are)
目录配置对象旨在操作数据列表。通常,每家公司都会使用员工列表、产品列表、客户列表、供应商列表等。这些列表的属性和结构在目录类型的配置对象中定义,平台通过这些对象创建数据库表,用于存储目录中的信息。
一个目录由条目构成。例如,员工是员工目录中的一个条目,产品是产品目录中的一个条目,依此类推。用户可以向目录中添加自有条目,如新增员工、创建新产品或录入新客户。
在数据库中,目录的每个条目对应存储该目录信息的主表中的一条独立记录(图 3.1)。
通常,每个目录条目会包含用于进一步定义该条目的附加信息。例如,产品目录中的所有条目可能包含关于制造商、保质期等附加信息。这些信息集对目录中的所有条目一致,它们通过目录配置对象的属性定义,而属性本身也是配置对象(图 3.2)。
由于这些配置对象与目录对象存在关联关系,因此它们被称为从属于目录对象。
开发人员需手动创建大部分属性,但每个目录配置对象都有一组默认的标准属性,如代码、描述等(见图 3.2)。需要注意的是,标准属性的可用性取决于目录的属性。
Fig. 3.1. 设计师模式、1C:企业模式和数据库中的产品目录
Fig. 3.2. 标准目录属性和开发人员创建的属性
例如,分层目录会有 “父级” 标准属性。如果某个目录从属于另一个配置对象,它将具有 “所有者” 属性。如果我将标准 “代码” 属性的长度设置为零,该目录将不再具备此属性。“描述” 属性也是如此。但目录至少需要具备 “代码” 或 “描述” 这两个属性中的一个,否则目录将失去意义。
因此,在数据库中,目录存储为一个表,其行保存列表项,每一列对应一个属性(可以是默认属性或开发人员创建的属性)。因此,该表的单元格存储特定目录项的某个属性值(图 3.3)。
Fig. 3.3. 设计师模式、1C:企业模式和数据库中的产品目录
此外,每个目录项都可以包含一组结构相同但数量不同的信息,这些信息针对不同的目录项而存在。
例如,“Employess” 博客中的每个条目可能包含员工家庭成员的信息。对于一位员工,这可能仅包括配偶,而另一位员工的家庭可能由配偶、一个儿子和一个女儿组成。
要定义这类信息,你可以使用目录配置对象的表格部分。这些部分本质上是目录的从属配置对象。在这种情况下,数据库将创建额外的表,用于存储从属于特定目录项的表格部分(图 3.4)。
Fig. 3.4. 设计师模式、1C:企业模式和数据库中的产品目录
请注意,该软件会为你隐藏与数据存储相关的全部技术细节:创建目录时会在数据库中自动生成多个表,这些表通过唯一字段(Link)关联,表字段也会自动设置为特定类型等等,所有这些方面都会自动处理。你唯一需要做的是在目录配置对象中添加一个从属的表格部分对象。
为了便于管理,目录项可以根据某种原则进行分组。
例如,在 “家用电器” 博客中,可以创建以下分组:冰箱、电视、洗衣机等。目录配置对象的 “分层” 属性决定了是否可以在博客中创建此类分组。在这种情况下,被标识为分组的目录项将作为该分组中包含的所有子项和子分组的父项。这种分层结构被称为 “文件夹和项目的层次结构”(图 3.5)。
Fig. 3.5. 具有文件夹和项目层次结构的分层目录
还有一种可能存在的层级结构是商品层级。此时,父级不再是一组目录商品,而是某个具体的目录商品本身。比如,我在创建博客内容时,可以用这种层级结构来规划 “部门” 目录 —— 某个主部门可以作为父级,下辖多个子部门(图 3.6)。这样的层级设计能更清晰地展现目录内商品的从属关系,方便你在浏览博客时快速理解内容架构。
Fig. 3.6. 具有项目层次的分层目录
一个目录中的条目可能从属于另一个目录的条目或文件夹。例如,“度量单位” 目录可能从属于 “产品” 目录。这样我就可以说明 “产品” 目录中每个条目的接收度量单位。
在 1C: Enterprise 中,这可以通过为每个目录配置对象定义目录所有者列表来实现。在这种情况下,“产品” 目录将成为 “度量单位” 目录的所有者(图 3.7)
Fig. 3.7. 产品目录 - 计量单位目录的所有者
有时会出现这样的情况:无论用户如何操作,目录中都需要始终包含某些特定条目。例如,在一家公司的标准业务流程中,所有产品都需要先送达主仓库,然后再根据需求分发给其他仓库。在这种情况下,“仓库” 目录中必须始终存在 “主仓库” 这一条目,否则货物接收流程将无法正确完成。通过目录配置对象,我可以定义任意数量的此类目录条目,这些条目被称为预定义目录项(图 3.8)。
Fig. 3.8. 具有预定义主要项目的仓库目录
预定义项与常规项的不同之处在于,它们是在设计器中创建的,用户无法删除。不过,用户仍可对这类项执行其他所有操作,重命名也同样可行。在界面中,预定义的目录项会标有特殊图标(见图 3.8)。
目录形式(Forms of Catalogs)
根据我想对博客目录进行的操作,需要以不同视图展示目录内容。例如,若要选择某个博客目录项,将目录以列表形式查看会更方便;而若要修改其中某个目录项,更好的方式是在单一表单上查看该目录项的所有属性(图 3.9)。
Fig. 3.9. 客户目录项的列表表单和编辑表单
博客中所需的用于展示目录数据的所有表单均可自动生成,且平台能够识别在何种场景下应使用哪些表单。
通常情况下,在不同场景中展示一个目录至多需要五个表单。
需要注意的是,在设计器的不同位置,相同表单可能会有略微不同的名称(见表 3.1)。下表列出了这些表单的不同名称:
- In the catalog context menu (open the default form…), in the configuration tree, and in the catalog properties palette.
- In the form wizard.
- On the Forms tab of the catalog editor.
Table 3.1. Catalog Forms
在上下文菜单和属性面板中(图 3.12) | 在表单向导中(图3.11) | 在“表单”选项卡上 (图3.10) |
Object form | Catalog item form | Item |
Folder form | Catalog folder form | Folder |
List form | Catalog list form | List |
Choice form | Catalog choice form | Choice |
Folder choice form | Catalog folder choice form | Folder choice |
关键在于,配置对象的属性显示在上下文菜单和属性面板中。所有配置对象的属性都相同。同时,表单向导和表单选项卡会以更方便开发人员理解的视图形式呈现这些属性。因此,不同的配置对象的属性会有所不同(图 3.10、3.11、3.12)。
图 3.10.在“表单”选项卡上对表单名称进行分类
图 3.11.表单向导中的目录表单名称
图 3.12.属性面板中的目录表单名称
项目表单用于创建或编辑目录项目。
文件夹表单用于创建或编辑目录文件夹。文件夹包含的信息通常比目录项本身少得多。因此,它需要一个与目录项表单不同的单独表单(图 3.13)。
图 3.13.目录的项目表单和文件夹表单
列表形式用于展示目录项列表。
选择形式用于在某种表单字段中选择目录项之一。同时,选择形式比列表形式更简单,因为列表形式可能显示多个属性,而当你在文档等场景中选择某项时,通常只需知道其名称。因此,可使用单独的简化形式进行选择(图 3.14)。
文件夹选择形式用于在某种表单字段中需要选择目录文件夹(而非目录项)的场景。文件夹选择形式比目录项选择形式更简单,因为文件夹通常包含的信息比目录项本身少得多。
对于所有参考配置对象(目录、文档等),将使用对象形式,但需要说明的是,当我提及 “对象” 时,指的是信息库对象,即对象存储中的条目。对于目录,它是目录项;对于文档,它是文档;对于会计科目表,它是科目,等等。
图 3.14.目录的选择形式和列表形式
在设计器中可定义任意形式的表单。表单作为从属配置对象存在,用于创建这些定义(图 3.15)。
通常,表单配置对象从属于某个应用程序对象,但它也可以独立存在。
根据需要,1C: Enterprise 平台会使用表单配置对象中的定义来创建供用户操作的表单程序对象。
因此,表单是数据库中数据的可视化呈现。我以方便你使用的格式展示这些数据,并允许定义相关功能,帮助你处理显示的数据。
图 3.15.设计器中的目录表单项
A "Simple" Catalog
现在我们对目录配置对象的特性有所熟悉,我们将创建一些这样的对象,以便定义将在我们的数据库中使用的目录。
由于我们公司 Jack of All Trades 是提供家电服务的,因此我们显然需要存储一定数量的信息列表以作记录。
首先,我们需要一份提供服务的公司员工名单。
然后我们需要一份该公司合作的客户名单。
接下来我们需要一份我们公司提供的服务清单,以及一份可能消耗的材料清单。
此外,我们还需要一份万事通公司存储材料的仓库清单。
我们将首先从最简单的开始:员工名单和客户名单。
首先,我们将创建一个目录来存储客户的姓名。
在设计师模式下
首先在设计器中打开我们的培训配置,突出显示 配置对象树中的目录分支,然后单击配置窗口命令栏中的添加(图 3.16)。
图 3.16.创建新的目录配置对象
在配置对象编辑器中,我们将Clients定义为目录的名称。平台将根据该名称自动创建同义词Client。提醒一下,Synonym 属性用于在软件界面中表示对象。
开发人员还可以指定其他属性来定义对象的自定义呈现方式。这些属性是可选的。如果未定义,则在 1C:Enterprise 界面中将使用目录配置对象的同义词来表示此对象。但这并非总是最佳选择,您稍后会了解到这一点。
配置对象表示(Configuration Object Presentation)
对象展示名称决定了单数形式的对象名称,并用于标准命令中,例如在创建此类对象的命令(如 “新建客户”)中。当对象的同义词定义为复数形式或描述多个对象时,需要使用对象展示名称。因此,用于打开目录列表和创建新目录条目的命令会自动添加到界面中。
如果同义词以复数形式定义,那么用于打开列表的命令(如 “客户”)非常适合需要查看所有客户的场景。但对于 “创建新目录条目” 这类针对单个对象的命令(如 “一个客户”),复数形式就不合适了。此时,我们需要一个单数形式的展示名称 ——“客户”。对象展示名称不仅用于描述 “添加新客户” 命令在界面中的显示方式,还会用在客户表单的标题中(除非有扩展对象展示名称可用),以及客户引用的展示中。
扩展对象展示名称用于定义对象表单的标题,例如 “创建新目录条目” 表单的标题。如果省略此属性,则会改用 “对象展示名称” 属性。
列表展示名称定义了对象列表的名称,并用于标准命令的名称中,例如 “打开客户列表” 命令。当同义词以单数形式定义时,应指定列表展示名称。例如,在处理 “收货单” 这类文档时经常需要这样做,此时列表展示名称应使用复数形式的配置对象名称(如 “收货单”)。
扩展列表展示名称用于定义列表表单的标题(如目录列表表单的标题)。如果省略此属性,则会改用 “列表展示名称” 属性。
现在,我们定义两个属性:“对象展示名称 - 客户” 和 “列表展示名称 - 客户们”。后者其实可以省略,因为目录同义词与 “列表展示名称” 属性一致(见图 3.17)。不过,“客户列表” 这样的名称虽然直观,但在应用界面中,“员工列表”“客户列表”“仓库列表” 等名称连续出现时,视觉效果可能不够理想。
对象与子系统的关联(Object Affiliation with Subsystems)
现在点击 “下一步”,进入目录配置对象编辑器的 “子系统” 选项卡。该选项卡用于定义将显示此目录的子系统。
在子系统列表中,我看到了之前在定义应用程序结构过程中创建的子系统。我建议将客户列表放在 “渲染服务” 部分,因为每项服务都与特定客户相关联。在 “会计” 部分生成的会计记录也可供客户查看。
因此,我们现在应该在列表中检查 Accounting 和 RenderingServices 子系统(图 3.17)。
图 3.18. 定义显示目录的子系统列表
现在打开其中一个已勾选子系统(例如 “财务”)的编辑器,并导航至 “内容” 选项卡。我会看到该子系统的对象中现在包含一个新的目录配置对象 ——“客户”(图 3.19)。
需要注意的是,“内容” 选项卡还允许你修改子系统中包含的对象列表。
图 3.19. 子系统中包含的对象的内容
目录代码和说明(Catalog Code and Description)
现在,我将回到目录配置对象编辑器并导航到 “数据” 选项卡。
在这里,我想关注的是代码长度和描述长度。
代码长度是目录的一个重要属性。通常,目录代码用于标识目录项,每个目录项都包含唯一值。平台可以检查代码的唯一性,并为目录项提供自动编号功能。因此,代码长度会影响目录中可包含的项目数量。
代码最大长度为 9 个字符。这意味着代码范围可以从 1 到 999999999,这对于我所在的 “万事通杰克” 小公司来说完全足够。
现在来看描述长度。对我而言,25 个字符显然太少,因此我会将长度增加到 50 个字符(图 3.20)。
图 3.20. 定义目录代码和描述的长度
添加新项目的命令(The Command of Adding a New Item)
在启动 1C:Enterprise 之前,我会先配置应用程序界面,让添加新目录项的操作更便捷。
在 1C:Enterprise 中,有一个通用的标准算法用于设置打开列表和创建新配置对象的标准命令。下面我以目录为例来介绍这个算法,实际上它也适用于文档、科目表等其他场景。
打开目录列表的命令和创建目录新条目的命令,会被添加到显示该目录的界面板块(子系统)中。但默认情况下,创建新条目的命令在应用程序界面中是隐藏的。
这是因为通常需要经常查看目录列表,而创建新目录项的操作频率较低。因此,只有当某个目录(配置对象)所在的界面板块中,用户的主要操作是创建新条目时,才需要启用该命令。
接下来,我要让创建新客户的标准命令显示在 “RenderingServices” 板块的操作面板上。具体步骤如下:在配置对象树中选中 “Subsystems” 分支,打开其上下文菜单,然后选择 “All subsystems”(图 3.21)。
Fig. 3.21. 打开子系统设置窗口
在打开的 “所有子系统” 窗口中,高亮显示左侧 “子系统” 列表中的 “RenderingServices”(渲染服务)。右侧的 “命令界面” 列表将显示所选子系统的所有命令。
创建目录时,名为 “Navigation Panel.Normal” 的文件夹会添加 “Clients”(客户)命令以打开此列表,该命令默认启用。此时,“Action Panel.New”(操作面板 - 新建)中会出现新命令 “Client: New”(新建客户),用于创建新的目录项,不过该命令默认不显示。
现在,我将演示如何让这个命令可见(如图 3.22 所示)。
对于 “Accounting”(会计)子系统,无需向操作面板添加任何命令,因为这对应用程序中的工作没有实际意义。
这里假设,大多数与客户相关的日常操作由负责服务渲染的账户经理执行,这些操作包括在需要时在数据库中创建新客户。而会计部门仅需处理数据库中的数据以生成规定的报告。
因此,新建客户的命令应添加到经理操作的 “Rendering Services”(渲染服务)子系统中。由于不期望会计人员添加新客户,会计子系统中的该命令将保持不可见状态。
Fig. 3.22. 子系统设置窗口
不过,会计仍有这样的操作机会:可通过客户列表创建新客户(打开客户列表后添加新客户)。无需通过列表即可创建新条目的命令是否可用,仅取决于便捷性因素,而非用户权限限制。正因如此,我在此将这一便捷功能提供给管理员而非会计。
现在关闭 “客户” 目录编辑器,并以调试模式启动 1C:Enterprise。在设计器显示的提示中,确认更新配置的意向。你会看到自动生成的窗口,其中列出了配置结构的变更情况。在本例中,我们添加了 “客户” 目录。
点击 Accept (fig. 3.23).
Fig. 3.23. 配置结构修改列表
In the 1C:Enterprise Mode
导航面板和部分面板(The Navigation Panel and the Sections Panel)
软件窗口将以 1C:Enterprise 模式打开。你会发现,现在如果导航到 “渲染服务” 或 “会计” 板块,导航面板会显示在窗口左侧的垂直窗格中(图 3.24)。
导航面板展示了所选章节的结构,通常用于快速跳转到所选软件章节内的各个列表。当前导航面板包含打开第一个列表 “客户” 的命令 —— 请注意,“客户” 命令的名称由我为该目录定义的 “列表展示” 属性决定。如果未定义此属性,则会使用目录配置对象的同义词来展示列表名称。
在 “渲染服务” 章节中,还会显示操作面板(见图 3.24)。操作面板包含与章节面板中所选当前章节对应的命令,这些命令分为以下默认组:“新建”“报表”“工具” 以及开发者创建的组。“新建” 组包含用于创建新信息库对象的命令,例如文档和目录项。
当前 “渲染服务” 章节的操作面板中,“新建” 组包含用于创建第一个目录 “客户” 项的命令,这是我为该章节界面设置为可见的命令。现在,我将使用此命令为目录创建新项,而无需打开客户列表。
需要注意的是,创建新项的默认命令名称由我为该目录定义的 “对象展示” 属性决定。如果省略此属性,命令名称将使用目录配置对象的同义词:“客户”-“客户”。这既不方便(因为它与用于打开列表的命令完全重复),也不准确(因为创建目录新项时,实际是创建单个新客户)。
此外,“会计” 章节没有任何操作面板,因为对于此子系统,我未开启 “新建” 命令组中创建新项的命令的可见性。而且,“报表” 或 “工具” 组中也没有其他可见命令。因此,如果某个组中没有命令,整个组将不可见;如果没有任何可见的组,操作面板本身也不会显示。
创建新的目录项(Creating New Catalog Items)
现在我的目录还是空的,所以我要在这里添加一些条目。为此,需使用 “渲染服务” 部分操作面板中的 “客户端” 命令。
这会打开一个用于创建目录条目的表单 —— 默认对象表单(图 3.25)。
我将使用 “迈克尔・约翰逊” 作为新客户端的名称。代码会自动生成,因此我不需要输入任何代码。
点击保存和关闭(Click Save and Close.)
一条消息将显示在右下角,告知你已创建或修改的项目。此外,点击信息面板(位于应用程序窗口底部)中的链接将打开该项目。该面板(见图 3.24)会自动显示关于最近系统操作的信息,让你无需使用列表即可确认所需项目已记录,为你提供了额外的便利。
现在,我要添加另一个名为 Peters Smith 的客户。
最后一个名为 Shelley Jackson 的客户,我将使用客户列表的表单来添加。为此,请使用 “渲染服务” 部分导航面板中的 “客户” 命令。列表的默认表单将在应用程序工作区中打开,位于导航面板的右侧(见图 3.26)。
若要向目录添加新条目,可使用表单命令栏中的 “新建” 按钮,或按下 “Insert” 键。
点击 “新建” 后,请注意:添加新客户时,“名称” 字段会显示红色虚线框。这表示默认情况下,该字段启用了填充检查。如果此字段留空并尝试保存客户信息,系统将显示错误消息(图 3.27)。
出现这种情况,是因为部分标准对象属性会自动应用填充检查,例如目录名称(若目录的主要展示方式使用其描述)。
图 3.27 新目录项输入时出现的错误消息
现在让我们输入 Shelley Jackson 作为客户名称。
添加商品后,目录将如下所示(图 3.28)。
要打开现有目录项进行编辑,请双击它。点击信息面板中的链接,我们可以打开最近修改的目录项之一进行编辑(见图 3.28)。
理论。标准属性的填充检查(Theory. Fill Check for Standard Attributes)
现在关闭 1C:Enterprise 并返回到设计器模式。
要查看标准目录属性的内容和属性,请点击目录配置对象“客户端”的“数据”选项卡上的“标准属性”。
突出显示列表中的“名称”属性,打开其上下文菜单,然后选择“属性”(图 3.29)。
图 3.29. 目录标准属性的内容
图 3.30. 描述标准属性的属性面板
描述标准属性的属性面板显示,默认情况下,填充检查属性的值为显示错误(图 3.30)。
这意味着,如果描述属性留空,则会显示一条错误消息(见图 3.27)。
带有表格部分的目录(A Catalog with a Tabular Section)
现在,我们可以继续创建配置中将要使用的第二个目录 - 员工目录。
此目录比客户目录稍微复杂一些。这次,我们不仅要存储员工的姓氏、名字和中间名首字母,还将包含其过去工作经历的信息。
这些信息的结构将统一(包括组织、开始和结束日期以及职位),但每个员工的过往工作经历数量会有所不同。因此,我们将使用表格目录组件来存储此类信息。
在设计模式下(In the Designer Mode)
让我们添加一个新的 Catalog 配置对象。我们将其命名为 Employees。
根据名称,同义词将自动填充。
定义 Employee 作为 对象呈现。
我们不会输入任何 列表呈现,而 扩展列表呈现 将是 Employee 列表(图 3.31)。
点击“下一步”,然后导航至“子系统”选项卡。
根据我们的配置逻辑,员工列表应该显示在“渲染服务”和“工资单”部分。没错,当提供服务时,我们需要指定负责的员工。这些信息将用于计算每位员工的工资。
因此,我们应该在子系统列表中勾选“渲染服务”和“工资单”(图 3.32)。
切换到“数据”选项卡。保留代码长度和类型的默认值,并在目录描述长度中输入 50 个字符。
图 3.32. 定义显示目录的子系统列表
表格部分(The Tabular Section)
我们的目标是创建一个包含表格部分的目录。因此,我们将向此目录添加一个名为“PastEmployment”的新表格部分。
为此,请点击目录表格部分列表中的“添加表格部分”(图 3.33)。
图 3.33. 向目录添加新的表格部分
输入表格部分的名称:PastEmployment(图 3.34)。
图 3.34. 向目录添加新的表格部分
现在让我们为 PastEmployment 表格部分创建属性。
为此,请点击目录表格部分列表上的“添加属性”(图 3.35):
我们将添加以下属性:
Organization - type String, length 100;
StartDate - type Date, date format - Date;
EndDate - type Date, date format - Date;
JobTitle - type String, length 100.
对于 StartDate 和 EndDate 属性,我们选择了 Date 日期格式(图 3.36),因为在 1C:Enterprise 8 中,Date 数据类型值同时包含日期和时间。在这种情况下,工作开始和结束的时间并不重要。
最后,我们将编辑命令界面,以便更方便地添加新的目录项。让我们将创建新员工的标准命令添加到 Payroll 子系统的操作面板中。
图 3.35. 向目录的表格部分添加新属性
图 3.36. 目录表格部分的属性
为此,请在配置对象树中突出显示“子系统”分支,打开其上下文菜单并选择“所有子系统”。
在打开的窗口中,突出显示左侧“子系统”列表中的“工资单”。
右侧的“命令界面”列表将显示所选子系统的所有命令。
在“操作面板.New”中,启用“员工:新建”命令的可见性。
我们还看到名为“导航面板.Normal”的文件夹中添加了“员工”命令以打开此列表。该命令默认启用(图 3.37)。
对于 RenderingServices 子系统,我们不会向操作面板添加任何命令,因为在本节中我们不太可能需要向列表中添加新员工。
创建 员工 目录的过程尚未完成。
现在关闭 员工 目录编辑器,并在调试模式下启动 1C:Enterprise。
在 Designer 显示的提示中确认您是否要更新配置。您将看到自动生成的窗口,其中列出了配置结构中的更改。
在本例中,我们已添加 员工 目录。点击“接受”(图 3.38)。
图 3.38. 配置结构中的修改列表
在1c:Enterprise模式里(In the 1C:Enterprise Mode)
在打开的 1C:企业窗口中,我们将看到“员工”命令现在位于“渲染服务”和“工资单”部分的导航面板上。此命令打开员工列表(图 3.39)。
该命令的名称由对象同义词决定,因为我们尚未为此目录定义任何列表呈现。
此外,工资单的操作面板现在包含用于创建新员工的“员工”命令(见图 3.39)。该命令的名称由我们为此目录定义的“对象呈现”属性决定。
现在,我们将使用此命令为目录创建新项目,而无需打开员工列表。
填写表格部分(Filling in the Tabular Section)
使用 Employee 命令。
我们将打开一个表单来创建目录项 - 默认对象表单。表单的标题由 Object presentation 属性定义。
此表单包含一个表格部分,其中包含在设计器中为目录定义的属性。
现在让我们按如下方式创建员工(图 3.40、3.41、3.42):
- Alexander D. Johnson.
- Past employment:
- Company - NTI Company,
- Start date - 2/1/2000,
- End date - 4/16/2003,
- Job title - Senior Technician.
- Past employment:
- John A. Walkman.
- Past employment 1:
- Company - Global Automation Solutions, LLC,
- Start date - 22/01/1996,
- End date -12/31/2002,
- Job Title - Engineer;
- Past employment 1:
- Company - QDA Telecommunications Group,
- Start date - 20/06/1986,
- End date - 21/01/1995,
- Job title - Production manager;
- Past employment 1:
- Michelle V. Turner:
- Past employment:
- Company - Wilson and Beane Construction,
- Start date - 2/6/2001,
- End date - 4/3/2004,
- Job title - master builder.
- Past employment:
可以使用“添加”按钮(图 3.40)添加目录表格部分的行。可以使用表格部分命令栏中的“向上”和“向下”按钮随机排列行(图 3.41)。
要查看已添加员工的列表,请使用“工资单”部分导航面板中的“员工”命令。
列表的默认表单将在应用程序工作区(导航面板右侧)中打开。
图 3.40。填写员工目录项
图 3.41. 填写员工目录项
图 3.42. 填写员工目录项
请注意,表单的标题由我们为此目录定义的扩展列表演示属性决定(图 3.43)。
现在我们可以继续创建下一个目录 - 商品。
分层目录(A Hierarchical Catalog)
《产品目录》将包含 “Jack of All Trades” 提供的服务信息,以及提供这些服务时可能用到的资源信息。
这份目录的结构并不复杂,其唯一的特色是采用分层结构。为了让目录便于使用,我会把服务归为一组,资源归为另一组。
此外,由于 “Jack of All Trades” 提供的服务范围广泛,这些服务还会按逻辑细分为多个类别。资源也会进行同样的逻辑分组。
在设计模式里(In the Designer Mode)
现在我要创建一个新的目录配置对象,并将其命名为 “Products”。根据这个名称,同义词会自动填充。
由于 “Products” 一词不用作单数形式,因此无需定义其他用于在应用程序界面中设置对象展示方式的属性。我们不使用 “对象展示” 和 “列表展示”,而是直接使用对象的同义词 “Products”。
接下来切换到 “子系统” 选项卡。
根据我的配置逻辑,产品列表应在 “商品管理”“渲染服务” 和 “会计” 这几个板块中可用。确实,这个目录与前两个板块直接相关,而且材料和服务列表可能经常需要在会计分析中用到。
因此,我会在列表中勾选这几个子系统(见图 3.44)。
图 3.44. 定义显示目录的子系统列表
我的任务是创建一个分层目录。因此,我需要导航到 “层次结构” 选项卡,并勾选 “分层目录”(图 3.45)。
在 “数据” 选项卡中,保持代码长度和类型的默认值不变,并将目录描述长度设置为 100 个字符。
在启动 1C:Enterprise 之前,我会先配置应用程序界面,以便更方便地添加新目录项。我需要让 “商品管理” 和 “渲染服务” 板块的操作面板上显示用于创建产品列表新条目的标准命令。
具体操作如下:在配置对象树中选中 “子系统” 分支,打开其上下文菜单并选择 “所有子系统”。
在弹出的窗口中,从左侧的 “子系统” 列表中选中 “商品管理”。
图 3.45. 检查分层目录属性
右侧的“命令界面”列表将显示所选子系统的所有命令。
在“操作面板.新建”中,启用“产品:新建”命令的可见性。
我们还看到,名为“导航面板.普通”的文件夹中添加了“产品”命令,用于打开此列表。该命令默认启用(图 3.46)。
Fig. 3.46. 子系统设置窗口
在子系统列表中突出显示“RenderingServices”,并按照相同的步骤操作。
对于“Accounting”子系统,我们不会向操作面板添加任何命令,因为在此部分中我们不太可能需要更新产品列表。
NOTE
你还可以通过点击“命令界面”按钮,从特定子系统的编辑器中打开并自定义该子系统的命令界面片段。
现在我们将填充产品目录。在填充目录的过程中,我们将演示如何创建组以及如何将项目从一个组移动到另一个组。
现在关闭产品目录编辑器,并以调试模式启动 1C:Enterprise。
在设计器显示的提示中确认您要更新配置。你将看到自动生成的窗口,其中列出了配置结构中的更改。在本例中,我们添加了产品目录。
点击接受-Click Accept (fig. 3.47).
图 3.47. 配置结构中的修改列表
在1C:Enterprise模式里(In the 1C:Enterprise Mode)
在打开的 1C:Enterprise 窗口中,我看到 “商品管理”“服务提供” 和 “会计核算” 导航面板中新增了 “产品” 命令(见图 3.48)。由于此目录未定义其他展示名称,该命令的命名由对象同义词决定。
接下来,在 “商品管理” 板块的导航面板中选择 “产品” 命令。此时,应用程序工作区(导航面板右侧)将打开默认的列表界面。
在分层目录中创建项目(Creating Items in a Hierarchical Catalog)
我们将在目录根目录中创建两个组:材料组和服务组。
为此,请点击列表表单命令栏中的“添加新组”(图 3.48)。
图 3.48. 在产品目录中创建组
我们将输入以下组的名称:资源、服务。我们不会填写“父级”和“代码”字段。
现在,点击“+”展开“资源”组,并在该组中创建五个项目:
- Line Transformer, Samsung;
- Line Transformer, GoldStar;
- Transistor, Philips 2N2369;
- Tubing, rubber;
- Electrical conductor.
要将项目添加到已打开的目录组,请点击目录列表表单命令栏中的“新建”。
我们将打开一个用于创建目录项目的表单 - 默认对象表单。请注意,如果从列表表单将新项目添加到某个已打开的组中,则该组将自动用作父组。
在本例中,“资源”组是父组(图 3.49)。
图 3.49. 在资源组中创建项目
要创建新的目录项,你还可以使用“商品管理”和“渲染服务”部分的操作面板中现在提供的“产品”命令(见图 3.48)。
在这种情况下,如果使用操作面板的命令添加某个项目,则该项目不会以任何方式与产品列表关联。因此,软件不知道该项目应该添加到哪个组,你需要手动指定其父级(图 3.50)。
图 3.50. 在资源组中创建项目
创建新材料和服务时,无需打开产品列表。当物品添加到目录中时,应用程序右下角会弹出消息提示,确认添加成功。
接下来,我将扩展 “服务” 分组,并在该分组中创建一些电视机维修服务相关的条目(见图 3.51)。
- Diagnostics;
- Domestic television repair;
- Imported television repair.
还提供与洗衣机安装相关的服务:
- Water hookup;
- Electrical hookup.
图 3.51. 在服务组中创建项目
将项目移动到其他组(Moving Items to Other Groups)
现在,我们将服务分为两个逻辑组:电视维修和洗衣机安装服务。
为此,我们将在“服务”组中再创建两个组:电视
图 3.52. 在服务组中创建新组
若要将服务移动到对应的组中,可在列表窗口中把光标放在想要移动的服务上,通过 “所有操作→移动到组” 功能来实现。在弹出的窗口里,选择一个新组即可完成移动。
你可以在列表中选中多个项目(操作方法是按住 Ctrl 键,同时用鼠标左键点击这些项目),然后一次性将它们全部移动。
或者,你也可以把选中的目录项直接拖放到所需的组中。
另外,你还能打开选中的目录项进行编辑,通过修改 “父级” 字段来完成移动(如图 3.53 所示)。
下面,我将把名为 “诊断”“家用电视维修” 和 “进口电视维修” 的服务移动到 “电视” 组。
同时,把 “水管安装” 和 “电路安装” 这两项服务移动到 “洗衣机” 组。
图 3.53. 将目录项移动到另一个组
现在在“资源”组中创建两个组:无线电部件和杂项。
将“电导体”和“管材、橡胶”放入“杂项”组中。
其余材料放入“无线电部件”组中。
如果我们现在切换到列表的树形视图(“所有操作”-“查看模式”-“树”),我们将看到产品列表以树状结构呈现,如下所示(图 3.54):
包含预定义项目的目录(A Catalog with Predefined Items)
最后,我将创建 “仓库” 目录,其中包含 “万能杰克”(Jack of All Trades)使用的仓库信息。
这个目录将包含一个预定义条目 ——“主仓库”,所有物料都将配送至该仓库。
我的目标是创建一个包含预定义条目的目录。
在设计器模式下
首先,打开设计器并创建一个名为 “Warehouses” 的新目录配置对象。系统会根据名称自动填充同义词。
在 “对象展示名称” 中输入 “Warehouse”。“列表展示名称” 属性将使用同义词 “Warehouses”(见图 3.55)。
图 3.55. 定义主要目录属性
图 3.56. 定义显示目录的子系统列表
切换到 “子系统” 选项卡。
根据我们的配置逻辑,仓库列表应在 “渲染服务” 和 “货物管理” 这两个模块中可用,因为材料交付和服务渲染通常需要按仓库记录。因此,我会在列表中勾选这两个子系统(图 3.56)。
快速选择属性
接下来,我需要填充另一个目录属性 “仓库 - 快速选择”。为此,切换到 “表单” 选项卡,并勾选相应的复选框(图 3.57)。
图 3.57. 检查快速选择属性
默认情况下,当我们单击选择按钮时
在包含目录项的字段中,系统会打开默认表单供用户选择目录项。这可能并不总是很方便,尤其是在目录非分层且已知只包含少量项目的情况下。
“快速选择”属性旨在从包含此目录项的小型下拉列表中选择项目,而不是使用专用表单(图 3.58)。
图 3.58. 从下拉列表中选择仓库
对于仓库列表,此选项最为便捷,因为仓库数量可能很少。
对于其他目录,我们没有定义“快速选择”属性。这是因为“产品”目录是层级目录,快速选择对此目录没有意义。同时,员工列表,尤其是客户列表,可能非常大,因此下拉列表不太方便向下滚动。
预定义项
在“其他”选项卡上,我们点击“预定义”按钮。
将打开预定义目录项列表。
此时列表为空,因此我们点击“添加”,并创建一个名为“主要”的预定义项(图 3.59)。
图 3.59. 填充预定义目录项
请注意,除了描述之外,我们还将为预定义目录项指定一个名称。
将来使用 1C:Enterprise 脚本时,我们将能够使用在设计器中为其指定的名称来引用此目录项。问题是,用户可以编辑预定义目录项的描述,但名称对用户不可见,因此无法修改。
在启动 1C:Enterprise 之前,我们将配置应用程序界面,以便更方便地添加新的目录项。让我们在“商品管理”部分的操作面板上提供创建新仓库的标准命令。
为此,请在配置对象树中突出显示“子系统”分支,打开其上下文菜单,然后选择“所有子系统”。
在打开的窗口中,在左侧的“子系统”列表中突出显示“商品管理”。
右侧的“命令界面”列表将显示所选子系统的所有命令。
在“操作面板.新建”中,启用“仓库:新建”命令的可见性。
我们还看到,名为“导航面板.普通”的文件夹中添加了“仓库”命令,用于打开此列表。该命令默认启用(图 3.60)。
现在关闭 “仓库” 目录编辑器,以调试模式启动 1C:Enterprise。
在设计器显示的提示中,确认更新配置的操作。你会看到自动生成的窗口,其中列出了配置结构的更改内容。在本例中,我添加了 “仓库” 目录。
点击 “接受”(图 3.61)。
图 3.61. 配置结构中的修改列表
在 1C:Enterprise模式下(In the 1C:Enterprise Mode)
在打开的 1C:企业窗口中,我们看到“商品管理”部分的操作面板现在包含用于创建新仓库的“仓库”命令。
该命令的名称由我们为此目录定义的“对象呈现”属性决定(图 3.62)。
图 3.62. 商品管理部分
渲染服务和商品管理部分的导航面板现在都新增了 “仓库” 命令,用于打开仓库列表。由于此目录未定义任何 “列表展示”,该命令名称由对象同义词决定(见图 3.62)。
现在,你可以在商品管理部分的导航面板中选择 “仓库” 命令。应用工作区会在导航面板右侧打开默认的列表形式。
仓库列表中已有一个名为 “主仓库” 的预定义条目,这是我在设计器中创建的。接下来,我将使用操作面板中的 “仓库” 命令向目录添加另一个仓库,命名为 “零售仓库”(见图 3.63)。
图 3.63. 仓库目录的项目
由此,我们将完成创建目录的初步工作,并将讨论一些理论来解决预定义项目以及启动和继续调试时在屏幕上看到的提示。
理论(Theory)
预定义项目(Predefined Items)
请注意,系统对普通目录项和预定义目录项使用了不同的图标。
虽然我可以修改这两类目录项的代码或描述,但只有普通目录项可以标记为删除(或直接删除)。如果您尝试将预定义目录项标记为删除,系统将显示警告(图 3.64)。
图 3.64. 删除预定义目录项时出现错误消息
我们可以明确预定义条目的两个显著特征:
- 配置函数可能依赖预定义条目(因为可以在 1C:Enterprise 脚本中通过其标识符引用它们);
- 预定义条目是数据库对象,无法在 1C:Enterprise 模式下删除。
从配置角度看,这体现了常规目录条目与预定义目录条目的核心差异。
对配置而言,常规条目具有 “临时性”。用户可以随时创建或删除它们。因此,配置或许能够区分不同常规条目,但由于其 “临时” 属性,无法依赖它们执行任何功能。
相比之下,预定义条目是 “永久性” 的。无论用户如何操作,它们始终存在,不会消失。因此,配置可以确定它们的稳定性,并在执行各种功能时依赖它们。这就是每个预定义条目都有唯一标识符的原因 —— 便于在 1C:Enterprise 脚本中引用。
基础配置和数据库配置(The Base Configuration and Database Configuration)
到目前为止,我还没有深入探讨 1C:Enterprise 8 的结构,但现在是时候简单聊一聊这个话题了。
请记住,从用户的角度来看,1C 程序由平台和配置两部分组成。我之前提到过,在任何时候我们都会使用众多可能的配置之一,但严格来说,这种说法并不完全准确。
为什么说不准确呢?因为每个信息库至少包含两种配置。
为什么不完全准确呢?因为实际上用户始终只与一种配置交互,另一种配置是供开发人员或负责修改配置的人员(如数据库管理员)使用的,普通用户看不到它。
供开发人员使用的配置称为基础配置(或简称配置),这就是我在 Designer 中编辑的配置。
用户操作的配置称为数据库配置。
基础配置可以编辑,而数据库配置不能编辑。对数据库配置的更新只能基于源配置进行。
但你可能会自然地问:如果我们有两种配置,一种可以编辑,另一种供用户操作,为什么正在编辑的配置被称为源配置呢?从最终用户的角度看,他们使用的配置才是 “源”。
但关键在于,“基础” 这个名称是从开发人员的视角来命名的,并且具有很强的实际意义。
总的来说,1C:Enterprise 信息库可以存储不止两种配置:基础配置、数据库配置和多个供应商配置。
此外,信息库之外可能存在一个存储库,用于存储供共享应用程序使用的配置。
信息库之外还可能存在特定数量的配置文件,包括新交付的文件(图 3.65)。
Fig. 3.65. 配置结构
在信息库中,供应商配置用于跟踪发布的先前状态。有时配置需要同时调用多个供应商,每个供应商仅以独立配置的形式支持各自的部分。此时,信息库将包含多个供应商配置(每个独立供应商的发布先前状态)。
新发布文件可以配置文件(完整发布)或更新文件(更新发布)的形式存在。
配置存储库包含共享应用程序的配置。此配置以按配置版本排列的离散对象形式存储,而非完整的配置。这意味着我可以通过从单个对象 “组装” 所需版本,从存储库中获取任意版本的配置。
当需要在所有这些配置类型之间进行比较和更新时,情况很容易变得混乱。因此,“基础配置” 这一名称最能反映这些修改的总体目标。
回到源配置和数据库配置,需注意:将其划分为两种配置后,即使进行修改也不会中断用户工作。这是因为所有修改都先引入到用户不直接使用的源配置中。
当开发者确认所有修改无误后,可使用源配置快速更新数据库配置。
如果这些修改不影响数据库结构(例如,无需修改表,仅更改特定模块的代码),则可以在不中断用户工作的情况下更新数据库配置,这一过程称为动态更新。
用户只需重启应用程序即可看到修改后的内容。通过 1C:Enterprise 脚本方法 DatabaseConfigurationChangedDynamically (),可借助工具判断是否需要重启应用程序。
但如果修改涉及数据库结构(例如,目录新增属性或现有属性更改类型),则必须终止所有用户会话。
开发者可随时比较源配置和数据库配置。如果引入的修改存在严重问题,还可以通过从数据库配置回拉,将源配置回滚到原始版本。
因此,两种配置之间的关系可如图 3.66 所示:
图 3.66. 两种配置之间的关系
当开发人员在源配置中工作时,系统会始终提示他们源配置的工作版本是否与保存版本不同,以及源配置的保存版本是否与数据库版本不同。
如果开发人员正在编辑源配置,并且编辑后的源配置版本与保存的版本不同,则配置树窗口的标题中将显示星号 (*),表示该配置已被修改(图 3.67)。
图 3.67. 配置树窗口标题
如果源配置的保存版本与数据库配置不同,则会在配置树窗口的标题中显示感叹号(<!>)(图 3.68)。
图 3.68. 配置树窗口标题
若要保存源配置,请选择 “Configuration4 保存配置”;若要更新数据库配置,请使用 “Configuration4 刷新数据库配置”。
执行 “Debugging4 开始调试” 时,系统会先保存源配置,然后将其与数据库配置进行对比。如果配置不同,系统会提示开发人员更新数据库配置,如前所述示例所示。
执行 “Debugging4 继续” 命令时,除上述操作外,系统还会提示重新启动应用程序,以终止当前调试会话。
该软件通过这种方式尝试为开发人员简化操作,并自动执行最常见的操作。
需要注意的是,在更新数据库配置时,系统会在数据库中创建(或修改)被定义为配置对象的数据结构。
通过这种方式,用户可以根据 “目录” 配置对象自动向数据库结构中添加常规目录项。
目录的预定义项也会基于相同的结构描述(即 “目录” 配置对象)自动添加到数据库结构中。
这就引出了一个重要事实(如前所述部分讨论):如果某个配置对常规目录项 “不敏感”,预定义项对该配置而言可能很重要,因为配置的功能可能与这些预定义项相关联。
Quiz
- 目录配置对象有哪些用途?
目录有哪些显著特征?
如何使用目录的属性和表格部分?
层级目录的用途和父级的含义是什么?
下级目录的用途和所有者的含义是什么?
目录的默认形式有哪些?
什么是预定义项?
从配置的角度来看,常规目录项和预定义项之间有什么区别?
用户如何区分常规目录项和预定义项?
如何创建目录配置对象并定义其结构?
如何向目录添加新项?
如何创建新的目录组?
如何将项从一个目录组移动到另一个目录组?
源配置和数据库配置的用途是什么?
如何修改数据库配置?
配置对象和数据库对象之间的关系是什么?
什么是下级配置对象?
目录属性填充检查的用途是什么?
什么是“快速选择”?何时应该使用它?
如何在应用程序界面的各个部分显示目录并定义目录的呈现方式?
如何在子系统界面中显示创建新目录项的命令?
如何编辑子系统的命令界面?