Nền tảng "1C: Enterprise" - có gì ẩn giấu?

Này Habr!
Trong bài viết này chúng ta sẽ bắt đầu câu chuyện về cách nó hoạt động bên trong nền tảng "1C:Doanh nghiệp 8" và những công nghệ nào được sử dụng trong quá trình phát triển của nó.

Nền tảng "1C: Enterprise" - có gì ẩn giấu?

Tại sao chúng tôi nghĩ điều này thú vị? Thứ nhất, vì nền tảng 1C:Enterprise 8 là một ứng dụng lớn (hơn 10 triệu dòng mã) trong C++ (máy khách, máy chủ, v.v.), JavaScript (máy khách web) và gần đây hơn là And Java. Các dự án lớn ít nhất có thể thú vị vì quy mô của chúng, bởi vì các vấn đề không thể nhìn thấy được trong một cơ sở mã nhỏ sẽ xuất hiện đầy đủ trong các dự án như vậy. Thứ hai, “1C:Enterprise” là một sản phẩm “đóng hộp” có thể nhân rộng và có rất ít bài viết về những phát triển như vậy trên Habré. Việc biết cuộc sống ở các nhóm và công ty khác như thế nào cũng luôn là điều thú vị.

Vậy hãy bắt đầu. Trong bài viết này, chúng tôi sẽ cung cấp cái nhìn tổng quan về một số công nghệ được sử dụng trong nền tảng và phác thảo tổng quan mà không đi sâu vào quá trình triển khai. Thật vậy, đối với nhiều cơ chế, một câu chuyện chi tiết sẽ cần một bài viết riêng và đối với một số cơ chế, cần phải có cả một cuốn sách!
Để bắt đầu, cần phải quyết định những điều cơ bản - nền tảng 1C:Enterprise là gì và nó bao gồm những thành phần nào. Câu trả lời cho câu hỏi này không đơn giản như vậy, bởi vì thuật ngữ “Nền tảng” (để ngắn gọn, chúng tôi sẽ gọi nó như vậy) dùng để chỉ một phương tiện để phát triển các ứng dụng kinh doanh, môi trường thời gian chạy và các công cụ quản trị. Có thể phân biệt đại khái các thành phần sau:

  • cụm máy chủ
  • máy khách “mỏng” có khả năng kết nối với máy chủ thông qua http và giao thức nhị phân của riêng nó
  • máy khách để làm việc trong kiến ​​trúc hai tầng với cơ sở dữ liệu nằm trên ổ cứng hoặc thư mục mạng
  • khách hàng web
  • công cụ quản trị máy chủ ứng dụng
  • môi trường phát triển (được gọi là Bộ cấu hình)
  • môi trường thời gian chạy cho iOS, Android và Windows Phone (nền tảng di động 1C)

Tất cả những phần này, ngoại trừ phần web client, đều được viết bằng C++. Ngoài ra, có thông báo gần đây Bộ cấu hình thế hệ mới, được viết bằng Java.

Ứng dụng gốc

C++03 được sử dụng để phát triển các ứng dụng gốc. Đối với Windows, Microsoft Visual C++ 12 (cấu hình tương thích với Windows XP) được sử dụng làm trình biên dịch và đối với Linux và Android - gcc 4.8, đối với iOS - clang 5.0. Thư viện tiêu chuẩn được sử dụng giống nhau cho tất cả các hệ điều hành và trình biên dịch - STLPort. Giải pháp này làm giảm khả năng xảy ra lỗi cụ thể khi triển khai STL. Chúng tôi hiện đang có kế hoạch chuyển sang triển khai STL được cung cấp cùng với CLang, vì STLPort đã ngừng hoạt động và không tương thích với chế độ kích hoạt C++11 của gcc.
Cơ sở mã của máy chủ là phổ biến 99%, của khách hàng - 95%. Hơn nữa, ngay cả nền tảng di động cũng sử dụng mã C++ giống như nền tảng “lớn”, mặc dù tỷ lệ thống nhất ở đó có phần thấp hơn.
Giống như hầu hết người dùng C++, chúng tôi không yêu cầu sử dụng 100% khả năng của ngôn ngữ và thư viện của nó. Vì vậy, thực tế chúng tôi không sử dụng Boost và một trong những tính năng của ngôn ngữ là truyền kiểu động. Đồng thời, chúng tôi tích cực sử dụng:

  • STL (cụ thể là chuỗi, vùng chứa và thuật toán)
  • đa kế thừa, bao gồm. kế thừa thực hiện nhiều lần
  • mẫu
  • ngoại lệ
  • con trỏ thông minh (triển khai tùy chỉnh)

Bằng cách sử dụng nhiều kế thừa các giao diện (các lớp hoàn toàn trừu tượng), một mô hình thành phần sẽ trở nên khả thi, điều này sẽ được thảo luận dưới đây.

Thành phần

Để đảm bảo tính mô-đun, tất cả chức năng được chia thành các thành phần là các thư viện động (*.dll cho Windows, *.so cho Linux). Tổng cộng có hơn một trăm năm mươi thành phần; đây là mô tả về một số thành phần:

phụ trợ
Chứa công cụ siêu dữ liệu nền tảng

tài khoản
Đối tượng mà người phát triển ứng dụng sử dụng để xây dựng hồ sơ kế toán (sơ đồ tài khoản và sổ kế toán)

bsl
Công cụ thực thi ngôn ngữ nhúng

nuke
Triển khai tùy chỉnh bộ cấp phát bộ nhớ

dbeng8
Công cụ cơ sở dữ liệu tập tin. Một công cụ cơ sở dữ liệu máy chủ tệp đơn giản dựa trên ISAM, cũng bao gồm bộ xử lý SQL đơn giản

cơ sở
Chứa các lớp cơ sở và các hàm để triển khai giao diện người dùng Windows - các lớp cửa sổ, truy cập GDI, v.v.

Việc chia thành nhiều thành phần rất hữu ích xét theo nhiều quan điểm:

  • Sự tách biệt thúc đẩy thiết kế tốt hơn, đặc biệt là cách ly mã tốt hơn
  • Từ một bộ thành phần, bạn có thể linh hoạt lắp ráp các tùy chọn phân phối khác nhau:
    • Ví dụ: bản cài đặt máy khách mỏng sẽ chứa wbase, nhưng sẽ không có phần phụ trợ
    • nhưng trên máy chủ wbase thì ngược lại sẽ không có
    • cả hai lựa chọn tất nhiên sẽ chứa nuke và bsl

Tất cả các thành phần cần thiết cho tùy chọn khởi chạy này đều được tải khi chương trình khởi động. Đặc biệt, điều này là cần thiết để đăng ký các lớp SCOM, điều này sẽ được thảo luận dưới đây.

SCOM

Để phân rã ở mức độ thấp hơn, hệ thống SCOM được sử dụng, một thư viện có hệ tư tưởng tương tự như ATL. Đối với những người chưa từng làm việc với ATL, chúng tôi liệt kê ngắn gọn các khả năng và tính năng chính.
Đối với lớp SCOM được thiết kế đặc biệt:

  • Cung cấp các phương thức xuất xưởng cho phép bạn tạo một lớp từ một thành phần khác chỉ biết tên của nó (mà không tiết lộ cách triển khai)
  • Cung cấp cơ sở hạ tầng con trỏ thông minh đếm tham chiếu. Tuổi thọ của lớp SCOM không cần phải được giám sát thủ công
  • Cho phép bạn tìm hiểu xem một đối tượng có thực hiện một giao diện cụ thể hay không và tự động chuyển đổi một con trỏ thành đối tượng thành một con trỏ tới giao diện
  • Tạo một đối tượng dịch vụ luôn có thể truy cập được thông qua phương thức get_service, v.v.

Ví dụ: bạn có thể mô tả một lớp để đọc JSON (ví dụ: JSONStreamReader) trong thành phần json.dll.
Các lớp và phiên bản có thể được tạo từ các thành phần khác; chúng cần được đăng ký trong máy SCOM:

SCOM_CLASS_ENTRY(JSONStreamReader)

Macro này sẽ mô tả một lớp ghi tĩnh đặc biệt, hàm tạo của lớp này sẽ được gọi khi thành phần được tải vào bộ nhớ.
Sau này, bạn có thể tạo một phiên bản của nó trong thành phần khác:

IJSONStreamReaderPtr jsonReader = create_instance<IJSONStreamReader>(SCOM_CLSIDOF(JSONStreamReader));

Để hỗ trợ các dịch vụ, SCOM cung cấp một cơ sở hạ tầng bổ sung khá phức tạp. Trọng tâm của nó là khái niệm về quy trình SCOM, đóng vai trò là nơi chứa các dịch vụ đang chạy (tức là đóng vai trò là Bộ định vị dịch vụ) và cũng chứa một ràng buộc với các tài nguyên được bản địa hóa. Quá trình SCOM được gắn với luồng hệ điều hành. Nhờ đó, bên trong ứng dụng bạn có thể nhận được các dịch vụ như thế này:

SCOM_Process* process = core::current_process();
if (process)
         return get_service<IMyService>(process);

Hơn nữa, bằng cách chuyển đổi các quy trình logic (SCOM) được gắn với một luồng, bạn có thể có được các ứng dụng gần như độc lập với quan điểm của không gian thông tin, chạy trong cùng một luồng. Đây là cách máy khách tối thiểu của chúng tôi hoạt động với cơ sở dữ liệu tệp - bên trong một quy trình hệ điều hành có hai quy trình SCOM, một quy trình được liên kết với máy khách và quy trình thứ hai với máy chủ. Cách tiếp cận này cho phép chúng tôi thống nhất việc viết mã sẽ hoạt động cả trên cơ sở dữ liệu tệp cục bộ và trong phiên bản máy khách-máy chủ “thực”. Cái giá phải trả cho sự đồng nhất đó là chi phí chung, nhưng thực tế cho thấy điều đó là xứng đáng.

Dựa trên mô hình thành phần SCOM, cả logic nghiệp vụ và phần giao diện của 1C: Enterprise đều được triển khai.

Giao diện người dùng

Nhân tiện, về giao diện. Chúng tôi không sử dụng các điều khiển Windows tiêu chuẩn; các điều khiển của chúng tôi được triển khai trực tiếp trên API Windows. Đối với phiên bản Linux, một lớp đã được tạo để hoạt động thông qua thư viện wxWidgets.
Thư viện điều khiển không phụ thuộc vào các bộ phận khác của 1C:Enterprise và được chúng tôi sử dụng trong một số tiện ích nội bộ nhỏ khác.

Qua nhiều năm phát triển của 1C:Enterprise, hình thức kiểm soát đã thay đổi, nhưng sự thay đổi nghiêm trọng về nguyên tắc chỉ xảy ra một lần, vào năm 2009, với việc phát hành phiên bản 8.2 và sự ra đời của “biểu mẫu được quản lý”. Ngoài việc thay đổi giao diện, nguyên tắc bố cục biểu mẫu đã thay đổi về cơ bản - đã có sự từ chối việc định vị các phần tử theo từng pixel để chuyển sang bố cục luồng của các phần tử. Ngoài ra, trong mô hình mới, các điều khiển không hoạt động trực tiếp với các đối tượng miền mà với các DTO đặc biệt (Đối tượng truyền dữ liệu).
Những thay đổi này giúp tạo ra một máy khách web 1C:Enterprise sao chép logic C++ của các điều khiển JavaScript. Chúng tôi cố gắng duy trì sự tương đương về chức năng giữa máy khách mỏng và máy khách web. Trong trường hợp không thể thực hiện được, chẳng hạn như do hạn chế của API JavaScript sẵn có (ví dụ: khả năng làm việc với tệp rất hạn chế), chúng tôi thường triển khai chức năng cần thiết bằng cách sử dụng tiện ích mở rộng trình duyệt được viết bằng C++. Chúng tôi hiện hỗ trợ Internet Explorer và Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows và Linux) và Safari (MacOS).

Ngoài ra, công nghệ biểu mẫu được quản lý còn được sử dụng để tạo giao diện cho các ứng dụng di động trên nền tảng 1C. Trên thiết bị di động, việc hiển thị các điều khiển được triển khai bằng cách sử dụng các công nghệ riêng của hệ điều hành, nhưng đối với logic bố cục biểu mẫu và phản hồi giao diện, mã tương tự được sử dụng như trong nền tảng 1C:Enterprise “lớn”.

Nền tảng "1C: Enterprise" - có gì ẩn giấu?
Giao diện 1C trên hệ điều hành Linux

Nền tảng "1C: Enterprise" - có gì ẩn giấu?
Giao diện 1C trên thiết bị di động

Giao diện 1C trên các nền tảng khác Nền tảng "1C: Enterprise" - có gì ẩn giấu?
Giao diện 1C trên hệ điều hành Windows

Nền tảng "1C: Enterprise" - có gì ẩn giấu?
Giao diện 1C - web client

Mã nguồn mở

Mặc dù chúng tôi không sử dụng thư viện tiêu chuẩn dành cho nhà phát triển C++ trong Windows (MFC, điều khiển từ WinAPI), nhưng chúng tôi không tự viết tất cả các thành phần. Thư viện đã được đề cập wxWidget, và chúng tôi cũng sử dụng:

  • cURL để làm việc với HTTP và FTP.
  • OpenSSL để làm việc với mật mã và thiết lập kết nối TLS
  • libxml2 và libxslt để phân tích cú pháp XML
  • libetpan để làm việc với các giao thức thư (POP3, SMTP, IMAP)
  • kịch câm để phân tích tin nhắn email
  • sqllite để lưu trữ nhật ký người dùng
  • ICU để quốc tế hóa

Danh sách cứ kéo dài.
Ngoài ra, chúng tôi sử dụng phiên bản được sửa đổi cao Kiểm tra Google и Mô hình Google khi phát triển các bài kiểm thử đơn vị.
Các thư viện cần được điều chỉnh để tương thích với mô hình tổ chức thành phần SCOM.
Sự phổ biến của 1C khiến nền tảng này trở thành một bài kiểm tra sức mạnh tuyệt vời cho các thư viện được sử dụng trong đó. Nhiều người dùng và tình huống khác nhau nhanh chóng phát hiện ra lỗi ngay cả trong những vùng mã hiếm khi được sử dụng nhất. Chúng tôi tự sửa chúng và cố gắng trả lại cho các tác giả thư viện. Trải nghiệm tương tác hóa ra rất khác nhau.
Các nhà phát triển cURL и libetpan phản hồi nhanh chóng với các yêu cầu kéo, nhưng bản vá chẳng hạn như trong OpenSSL Chúng tôi không bao giờ có thể trả lại nó.

Kết luận

Trong bài viết, chúng tôi đã đề cập đến một số khía cạnh chính trong quá trình phát triển nền tảng 1C: Enterprise. Trong phạm vi giới hạn của bài viết, chúng tôi chỉ đề cập đến một số khía cạnh thú vị, theo quan điểm của chúng tôi.
Có thể tìm thấy mô tả chung về các cơ chế nền tảng khác nhau đây.
Những chủ đề nào bạn sẽ quan tâm trong các bài viết tiếp theo?

Nền tảng di động 1C được triển khai như thế nào?
Mô tả cấu trúc bên trong của máy khách web?
Hoặc có thể bạn quan tâm đến quá trình lựa chọn tính năng cho các bản phát hành mới, phát triển và thử nghiệm?

Viết trong các ý kiến!

Nguồn: www.habr.com

Thêm một lời nhận xét