Làm việc qua kết nối COM dễ dàng hơn bạn nghĩ. Ba trụ cột khi làm việc với các đối tượng COM. Làm việc thông qua kết nối COM dễ dàng hơn bạn nghĩ Máy chủ khách mẫu 1s 8.3 kết nối Com

In (Ctrl+P)

Một trong các tùy chọn trao đổi dữ liệu giữa cơ sở dữ liệu 1C là trao đổi qua kết nối COM. Sử dụng kết nối COM, bạn có thể kết nối từ cơ sở dữ liệu 1C này sang cơ sở dữ liệu 1C khác và đọc hoặc ghi dữ liệu. Phương pháp này có thể được sử dụng cả trong các phiên bản cơ sở dữ liệu máy khách-máy chủ và cơ sở dữ liệu tệp. Bài viết này thảo luận về các loại kết nối này trên nền tảng 8.3

kết nối com

Bạn có thể tạo hai loại đối tượng COM cho ứng dụng 1C. Đây là kết nối ole V83.Ứng dụng và kết nối com Đầu nối V83.COM . Trong trường hợp V83.Ứng dụng Một bản sao gần như đầy đủ của ứng dụng 1C được ra mắt. Trong trường hợp sử dụng Đầu nối V83.COM Một phần máy chủ nhỏ được ra mắt. Tốc độ hoạt động trong trường hợp này cao hơn nhưng một số chức năng có thể không khả dụng. Đặc biệt, làm việc với các biểu mẫu và mô-đun chung không được đặt thuộc tính làm việc với các kết nối bên ngoài. Chủ yếu bạn nên sử dụng Đầu nối V83.COM và chỉ trong trường hợp thiếu chức năng V83.Ứng dụng. Sự khác biệt về tốc độ vận hành có thể đặc biệt đáng chú ý trên cơ sở dữ liệu có dung lượng lớn. Đối với nền tảng 8.2 được sử dụng V82.Application hoặc V82.COMConnector

Thiết lập kết nối OLE

Kết nối = COMObject mới(“V83.Application” );

Thiết lập kết nối COM

Kết nối = COMObject mới(“V83.COMConnector” );

Chuỗi kết nối

//Đối với tùy chọn máy khách-máy chủ
Chuỗi kết nối= “Srvr = ““Tên máy chủ” “;Ref = ““Tên cơ sở” ;
//Đối với tùy chọn chế độ tệp:
Chuỗi kết nối= “Tệp = ““PathKBase” “; Usr = Tên người dùng; Pwd = Mật khẩu”;
Nỗ lực
Kết nối = Kết nối . Kết nối(Chuỗi kết nối) ;
Ngoại lệ
Tin nhắn = MessageToUser mới;
Tin nhắn . Chữ = “Không thể kết nối với cơ sở dữ liệu” + Mô tảLỗi(); Tin nhắn . Báo cáo();
EndAttempt ;

Ngắt kết nối

Kết nối = Không xác định;
Đối với đối tượng V83.Ứng dụng Cần phải chấm dứt kết nối, nếu không phiên không hoàn chỉnh sẽ vẫn còn, sau đó sẽ phải xóa phiên này theo cách thủ công. Trong trường hợp Đầu nối V83.COM kết nối sẽ tự động bị ngắt khi quá trình kết nối được thực hiện hoàn tất Và còn một điểm nhỏ nữa. Đối với người dùng đang thực hiện kết nối, hộp kiểm “Yêu cầu xác nhận khi đóng chương trình” phải bị tắt trong cài đặt của nó.

Phương thức NewObject()

Để tạo một đối tượng mới, bạn có thể sử dụng phương thức NewObject(), ví dụ:

Đầu nối V83.COM

Yêu cầuCOM = Kết nối. Đối tượng mới( "Lời yêu cầu ") ;
BảngCOM = Kết nối. Đối tượng mới( “Bảng giá trị”) ;
ArrayCOM = Kết nối. NewObject(“Mảng” );

ViewCOM =Connection.NewObject

V83.Ứng dụng

Yêu cầuOLE = Kết nối. Đối tượng mới(“ Lời yêu cầu ") ;
TableOLE = Kết nối. Đối tượng mới(“Bảng giá trị”) ;
ArrayOLE = Connection.NewObject("Mảng" ) ;
ViewCOM =Connection.NewObject(“UniqueIdentifier”, StringUID);

Yêu cầuCOM . văn bản ="CHỌN
| Chức vụ của các tổ chức.
| Chức vụ của Tổ chức.Tên
|TỪ | Danh mục.Vị trí của Tổ chức
CÁCH CHỨC VỤ CỦA TỔ CHỨC”;

Kết quả = Yêu cầuCOM. Chạy();
Vật mẫu = Kết quả. Chọn () ;
Tạm biệt tuyển chọn. Kế tiếp()Xe đạp
Chu kỳ cuối;
Bạn cũng có thể sử dụng trình quản lý đối tượng cấu hình:
DirectoryCOM = Kết nối. Thư mục. Tên thư mục;
Tài liệuCOM = Kết nối. Tài liệu. Tên tài liệu;
RegisterCOM = Kết nối. Sổ đăng ký thông tin. Tên đăng ký;

Nhận và so sánh bảng liệt kê qua kết nối COM

Để so sánh giá trị của các phần tử liệt kê được xác định trong cấu hình, cần phải chuyển đổi các phần tử này thành một trong các kiểu nguyên thủy, việc so sánh rất dễ dàng. Các kiểu như vậy có thể là kiểu số hoặc kiểu chuỗi. Bạn có thể chuyển đổi giá trị của phần tử liệt kê thành kiểu số như sau:

Mục liệt kê = Connection.Directories.Directory1.FindByCode(1).Props1;

Các giá trị có thể có = Enum Element.Metadata().Enum Values;

EnumerationElementNumber = MaybeValues.Index(PossibleValues.Find(Connection.XMLString(EnumerationElement)));

Nếu EnumerationItemNumber = 0 thì báo cáo( “Giá trị số 1”);

KhácIfEnumutionsItemNumber = 1 Sau đó Báo cáo("EnumerationValue2");

endIf;

Truy xuất một đối tượng qua COM bằng mã định danh

Thông qua các trình quản lý đối tượng cấu hình, chúng ta có được một đối tượng com, ví dụ:
Tài liệuCOM = Kết nối. Tài liệu. Tên tài liệu;

Sau đó, chúng tôi nhận được một chuỗi định danh duy nhất:

StringUID =Kết nối.chuỗi ( DocumentCOM.UniqueIdentifier())

Mã định danh = U mới UniqueIdentifier(StringUID);
VỚI linkByIdentifier = Documents[DocumentName].GetLink(Identifier);

Nếu bạn cần tìm một đối tượng com theo tài liệu theo mã định danh, thì bạn cần viết như thế này:

WidCOM = Kết nối.NewObject(“UniqueIdentifier”, StringUID);
LinkByIdentifier = Connection.Documents[DocumentName].GetLink(WidCOM);


Từ khóa: COM, kết nối, bên ngoài, OLE, Tự động hóa, Connect, ComConnector, Srvr

Khi sử dụng kết nối COM 1C:Enterprise 8.0 để truy cập dữ liệu, có những ưu điểm sau so với việc sử dụng máy chủ Tự động hóa:

  1. Thiết lập kết nối nhanh hơn vì không cần tạo quy trình hệ điều hành riêng biệt và mọi hành động đều được thực hiện trong quy trình gọi;

  2. Truy cập nhanh hơn vào các thuộc tính và phương thức của đối tượng 1C:Enterprise, vì việc tổ chức quyền truy cập không yêu cầu giao tiếp giữa các quá trình;
  3. Tiêu thụ ít tài nguyên hệ điều hành hơn.

Nhìn chung, làm việc với 1C:Enterprise 8.0 qua kết nối COM tương tự như làm việc với 1C:Enterprise ở chế độ Tự động hóa máy chủ. Sự khác biệt chính như sau:

  1. Trong trường hợp máy chủ Tự động hóa, ứng dụng 1C:Enterprise 8.0 chính thức sẽ được khởi chạy và trong trường hợp có kết nối COM, một máy chủ COM tương đối nhỏ đang trong quá trình sẽ được khởi chạy.

  2. Khi làm việc qua kết nối COM, chức năng theo cách này hay cách khác liên quan đến việc tổ chức giao diện người dùng 1C:Enterprise 8.0 sẽ không khả dụng;
  3. Khi vận hành kết nối COM, mô-đun ứng dụng cấu hình 1C:Enterprise 8.0 không được sử dụng. Vai trò của nó khi làm việc với kết nối COM được thực hiện bởi mô-đun kết nối bên ngoài.

1.1 Quy trình thiết lập kết nối COM

Để tổ chức quyền truy cập vào dữ liệu 1C:Enterprise 8.0 thông qua kết nối COM, chuỗi hành động sau được thực hiện:

  1. một đối tượng COM được tạo với mã định danh V8.COMConnector, với sự trợ giúp của kết nối được thiết lập;

  2. phương thức Connect của đối tượng V8.COMConnector đã tạo trước đó được gọi. Phương thức Connect trả về một liên kết đến đối tượng kết nối COM với cơ sở thông tin 1C:Enterprise 8.0;
  3. Thông qua đối tượng kết nối COM đã nhận, các phương thức, thuộc tính và đối tượng hợp lệ của cơ sở thông tin mà kết nối được thiết lập sẽ được truy cập.

Quan trọng! Do thiếu giao diện người dùng trong kết nối COM nên không phải tất cả các đối tượng, thuộc tính và phương thức đều có thể được sử dụng trong kết nối COM.

1C: Các đối tượng doanh nghiệp có thể truy cập từ bên ngoài thông qua kết nối COM:

  1. Các biến và thủ tục/chức năng đã xuất của mô-đun nối bên ngoài

  2. Các biến và thủ tục/chức năng được xuất của các mô-đun phổ biến
  3. Bao gồm và loại trừ toàn bộ mô-đun bằng cách đặt thuộc tính của các mô-đun chung

  4. Bao gồm và loại trừ các đoạn của mô-đun phổ biến bằng bộ tiền xử lý
  5. Bối cảnh toàn cầu 1C:Enterprise 8.0, ngoại trừ các đối tượng được liên kết chặt chẽ với ứng dụng khách (TextDocument, TabularDocument, ...)

1.2 Mô-đun kết nối bên ngoài

Như đã lưu ý, trách nhiệm của mô-đun ứng dụng khi làm việc thông qua kết nối COM được thực hiện bởi mô-đun kết nối bên ngoài. Mô-đun này có thể có các quy trình xử lý sự kiện When SystemStarts() và WhenSystemCompletes(), có thể chứa các hành động được thực hiện khi khởi tạo và chấm dứt kết nối tương ứng.

Các thủ tục, hàm và các biến toàn cục được xác định trong mô-đun nối bên ngoài với từ khóa Xuất trở thành một phần của bối cảnh toàn cục, như trong trường hợp mô-đun ứng dụng.

1.3 Các mô-đun chung

Các thuộc tính "Máy khách", "Máy chủ" và "Kết nối bên ngoài" đã được giới thiệu cho các mô-đun phổ biến. Chúng nhằm mục đích xác định trong cấu hình việc sử dụng các mô-đun trong phiên bản máy khách - máy chủ và ở chế độ kết nối COM.

1.4 Đối tượng "V8.COMConnector"

Nhiệm vụ duy nhất được giải quyết bởi đối tượng V8.COMConnector COM là thiết lập kết nối COM với cơ sở thông tin 1C:Enterprise 8.0. Có thể thiết lập số lượng kết nối không giới hạn bằng cách sử dụng một phiên bản của đối tượng V8.COMConnector. Đối tượng V8.COMConnector có một phương thức Connect duy nhất, được thiết kế để thiết lập kết nối COM với cơ sở thông tin 1C:Enterprise 8.0.

<СтрокаСоединенияИБ>

Đường kết nối với hệ thống an toàn thông tin là một chuỗi các đoạn có dạng Tham số=Giá trị. Các đoạn cách nhau bởi dấu “;”. Nếu giá trị chứa khoảng trắng thì giá trị đó phải được đặt trong dấu ngoặc kép (").

Các thông số chung:

Usr - tên người dùng;
Pwd - mật khẩu.

Tham số sau được xác định cho phiên bản tệp:

Tệp - thư mục cơ sở thông tin.

Các tham số sau được xác định cho tùy chọn client-server:

Srvr - 1C:Tên máy chủ doanh nghiệp;
Ref - tên của cơ sở thông tin trên máy chủ.

Phương thức Connect thiết lập kết nối COM tới cơ sở thông tin 1C:Enterprise 8.0 và trả về một liên kết đến đối tượng kết nối COM.

// Một đối tượng kết nối được tạo
V8 = COMObject mới ("V8.COMConnector");
// một đối tượng kết nối COM được tạo
Kết nối = V8.Connect("File=""c:\InfoBases\Trade""; Usr=""Director"";")

Đối tượng kết nối 1.5 COM

Kết nối COM tới cơ sở thông tin 1C:Enterprise cung cấp quyền truy cập đầy đủ vào bối cảnh toàn cầu của nó (xem “Bối cảnh thực thi mô-đun chương trình”). Do đó, kết nối COM có thể có các phương thức của nó: hằng số hệ thống, các giá trị được chỉ định trong bộ cấu hình của các đối tượng được truy cập bằng trình quản lý (ví dụ: hằng số, bảng liệt kê, thư mục, tài liệu, nhật ký tài liệu, báo cáo, xử lý, kế hoạch cho các loại đặc điểm, các tài khoản kế hoạch, sơ đồ các loại tính toán, các thanh ghi), cũng như các biến được khai báo trong module kết nối bên ngoài với từ khóa Xuất.

Ngoài ra, kết nối COM còn có một phương thức NewObject bổ sung có thể được sử dụng để tạo các giá trị thuộc một số loại nhất định.

tk = Kết nối. NewObject("ValueTable");

Phương thức chuỗi Cho phép bạn thu được biểu diễn chuỗi của các giá trị 1C:Enterprise.

Xem = Connection.String(Data.UniqueIdentifier());

1.6. Các tính năng làm việc với kết nối COM

Trong Tự động hóa và kết nối COM, TRUE và FALSE có các giá trị sau: -1 (trừ một) và 0.

Có thể tổ chức một nhóm kết nối COM. Đồng thời, một số đối tượng kết nối COM được tạo TRƯỚC trên máy chủ nhận 1C:Enterprise và thậm chí còn mất ít thời gian hơn để thiết lập kết nối vì không cần tạo đối tượng mới.

Một đối tượng Trình tạo truy vấn mới đã được triển khai, được thiết kế để tạo văn bản truy vấn dựa trên các cài đặt đã chỉ định. Đối tượng này hỗ trợ chức năng tạo báo cáo không liên quan đến việc xuất báo cáo sang tài liệu bảng tính hoặc các tác vụ khác liên quan đến giao diện người dùng. Đối tượng này có thể được sử dụng trên máy chủ 1C:Enterprise và trong kết nối COM.

Bạn có thể sử dụng các đối tượng COM khi chạy ngôn ngữ tích hợp trên máy chủ 1C:Enterprise.

Lỗi COM được chuyển đổi thành ngoại lệ ngôn ngữ nhúng.

Nếu cấu hình cố gắng tạo một đối tượng không hợp lệ, chẳng hạn như tài liệu bảng tính, trong mô-đun nối bên ngoài, trong mô-đun chung hoặc trong mô-đun đối tượng, kết nối COM có thể không được thiết lập hoặc có thể bị chấm dứt như một ngoại lệ.

Một trong các tùy chọn trao đổi dữ liệu giữa cơ sở dữ liệu 1C là trao đổi qua kết nối COM.

Sử dụng kết nối COM, bạn có thể kết nối từ cơ sở dữ liệu 1C này sang cơ sở dữ liệu 1C khác và đọc hoặc ghi dữ liệu. Phương pháp này có thể được sử dụng cả trong các phiên bản cơ sở dữ liệu máy khách-máy chủ và cơ sở dữ liệu tệp. Trong bài viết này chúng ta sẽ xem xét các ví dụ về loại kết nối này. Các ví dụ sử dụng nền tảng 8.2.

Bạn có thể tạo hai loại đối tượng COM cho ứng dụng 1C. Cái này V82.Ứng dụngĐầu nối V82.COM. Trong trường hợp V82.Ứng dụng Một bản sao gần như đầy đủ của ứng dụng 1C được ra mắt. trong trường hợp sử dụng Đầu nối V82.COM Một phần máy chủ nhỏ được ra mắt.
Tốc độ hoạt động trong trường hợp này cao hơn nhưng một số chức năng có thể không khả dụng. Đặc biệt, làm việc với các biểu mẫu và mô-đun chung không được đặt thuộc tính làm việc với các kết nối bên ngoài. Chủ yếu bạn nên sử dụng Đầu nối V82.COM và chỉ trong trường hợp thiếu chức năng V82.Ứng dụng. Sự khác biệt về tốc độ vận hành có thể đặc biệt đáng chú ý trên cơ sở dữ liệu có dung lượng lớn.

Vậy hãy bắt đầu

  1. Hãy tạo một đối tượng COM
    • V82.Ứng dụng Kết nối = COMObject mới("V82.Application" );
    • Đầu nối V82.COM Kết nối = COMObject mới("V82.COMConnector" );
  2. Hãy tạo một chuỗi kết nối
    • đối với phiên bản máy chủ của cơ sở dữ liệu ConnectionString = "Srvr =" "ServerName" ";Ref = " "BaseName" ;
    • đối với phiên bản tệp của cơ sở dữ liệu ConnectionString = "File =" "PathKBase" "; Usr = Tên người dùng; Pwd = Mật khẩu";
  3. Kết nối với cơ sở dữ liệu Cố gắng kết nối = Kết nối. Kết nối(ConnectionString); Thông báo ngoại lệ = MessageToUser mới; Tin nhắn. Văn bản = + ErrorDescription() ; Tin nhắn. Báo cáo() ; EndAttempt ;
  4. Ngắt kết nối khỏi cơ sở dữ liệu Kết nối = Không xác định;

    Đối với đối tượng V82.Ứng dụng Cần phải chấm dứt kết nối, nếu không phiên không hoàn chỉnh sẽ vẫn còn, sau đó sẽ phải xóa phiên này theo cách thủ công. Trong trường hợp Đầu nối V82.COM kết nối sẽ tự động bị ngắt khi quá trình kết nối được thực hiện hoàn tất Và còn một điểm nhỏ nữa.

    Đối với người dùng đang thực hiện kết nối, hộp kiểm “Yêu cầu xác nhận khi đóng chương trình” phải bị tắt trong cài đặt của nó.

Bây giờ hãy đặt tất cả các mã lại với nhau

Kết nối = COMObject mới("V82.Application" ); // Kết nối = COMObject mới ("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" ";Ref = " "MyBase" "; Usr = Petya; Pwd = 123" ; //ConnectionString = "File = ""С:\MyBase""; Usr = Petya; Pwd = 123"; Cố gắng kết nối = Kết nối. Kết nối(ConnectionString); Thông báo ngoại lệ = MessageToUser mới; Tin nhắn. văn bản = "Không thể kết nối với cơ sở dữ liệu"+ Mô tảError() ; Tin nhắn. Báo cáo() ; EndAttempt ; Kết nối = Không xác định;

Đối với loại kết nối V82.Ứng dụng phương thức này được sử dụng cho đối tượng COM được tạo ban đầu và cho Đầu nối V82.COM phương pháp được áp dụng cho kết nối. Sau đó, yêu cầu được xử lý bằng các công cụ 1C tiêu chuẩn. trong mã nó trông như thế này:

Yêu cầu = Kết nối. NewObject("Yêu cầu" ); // Vì Đầu nối V82.COM Yêu cầu = Kết nối. NewObject("Yêu cầu" ); // Vì V82.Ứng dụng Lời yêu cầu. Văn bản = "CHỌN | Chức vụ của các tổ chức. | Chức vụ của Tổ chức.Tên|TỪ | Thư mục. Chức vụ của các tổ chức AS Chức vụ của các tổ chức"; Kết quả = Yêu cầu. Chạy(); Mẫu = Kết quả. Chọn() ; Tạm biệt tuyển chọn. Vòng lặp Next() EndLoop ;

Đối với phiên bản 1C:Enterprise 8.3, mọi thứ vẫn không thay đổi ngoại trừ khi tạo đối tượng COM bạn phải sử dụng "V83.COMConnector" hoặc "V83.Ứng dụng".

) Đúng rồi

Đồng thời, tôi đã hơn một lần chứng kiến ​​​​các ấn phẩm thậm chí chưa đạt được 10 điểm chỉ đơn giản là “cất cánh”.
Tại sao điều này xảy ra? Rõ ràng là vì ai đó rõ ràng thích chúng.


Đây là những gì tôi đang nói, sẽ rất tuyệt nếu bạn hiểu bạn cần nó đến mức nào mà không cần đọc bài viết xếp hạng hoặc đánh giá nó không quá thô sơ +/-. Đối với những gì tôi thích, tôi sẽ sửa nó theo cách này: nó đã đạt được rất nhiều do các ngôi sao thẳng hàng và rất nhiều người tập trung trên trang web và nhiều người thích nó, bản thân bạn cũng hiểu đây là vấn đề may rủi vì Ngay sau khi một bài viết rời khỏi trang chính, nó chỉ có thể được tìm thấy theo yêu cầu và vì vậy mọi người đều bỏ phiếu bình chọn. Và, theo như tôi hiểu, những bình luận liên tục = việc quảng bá bài viết cho phép bạn duy trì nó trên trang chính.
Đây chính xác là lý do tại sao họ đặt các cửa hàng trên đường phố công cộng - xét cho cùng, điều quan trọng thường không phải là chất lượng và mức độ phù hợp của hàng hóa mà là khả năng lưu thông của địa điểm đó; những người đi bộ thường mua thứ gì đó mà họ sẽ vứt đi vào ngày hôm sau, chỉ là vì lợi ích của quá trình này. Đây là một căn bệnh mà mọi người đã biết từ lâu - chứng nghiện mua sắm. Hoặc đơn giản là tăng lưu lượng sẽ tăng khả năng tìm được người mua phù hợp.

Và những ưu và nhược điểm... - đây chỉ là một kiểu “cảm ơn” vì thời gian và công sức đã bỏ ra


Những thứ kia. Điểm trừ cũng được tính là “cảm ơn” phải không? Tôi muốn biết ý kiến ​​​​của bạn về việc liệu nó có nên được sử dụng trong những trường hợp như vậy hay không và người khác nghĩ như thế nào? Bạn nên đặt nó khi bài viết có hại/xấu hay khi nó đơn giản là vô dụng/trống rỗng đối với bạn?
Theo tôi, bài viết trông giống như một sự tăng rating đơn giản, bởi vì:
1. Vấn đề với các loại tôi trích dẫn đã bị tác giả hoàn toàn bỏ qua, mặc dù ông cũng không lười viết một đống bình luận.
2. Có một điểm thiếu chính xác rõ ràng trong bài viết: người ta nói rằng đây là cách duy nhất

V82 = COMObject mới ("V82.ComConnector"); Mã = AccountCOM.Code;


nhưng tôi có thể dễ dàng làm điều đó bằng cách xử lý như thế này:

Báo cáo(Cơ sở. Thư mục. Đối tác. Tìm theo Tên("LLC"). Mã);


và mọi thứ đều ổn! Và tôi chọn kết nối V82.ComConnector
Thật kỳ lạ khi tác giả không hề quan tâm đến việc bài viết của mình chứa đựng những vấn đề đã được chỉ ra, nhưng lại không phản ứng gì cả.
3. Nhưng vẫn có vấn đề khi hiện lên lỗi “Class không tồn tại”
4. Nhưng có vấn đề khi cài đặt 8.2 và sau đó cài đặt 8.1 - hãy thử trao đổi qua OLE/COM bằng trao đổi UT-BP tiêu chuẩn!
5. Bạn có thể chỉ ra quy trình xử lý chính trên trang web cho phép bạn kết nối toàn cầu qua OLE/COM để người mới bắt đầu không lãng phí thời gian, bạn viết cho họ! Nhân tiện, vì lý do nào đó mà hình ảnh của cô ấy lại xuất hiện trên màn hình của bạn, tại sao vậy? Và kết quả là 2 từ có công, và 6 từ hậu trường nữa.

Nói chung là tôi không ném bùn mà chỉ ra những khoảng trống cụ thể nhưng không có phản ứng gì. Nếu đây là trải nghiệm bạn đang chia sẻ thì nó có phần sai sót và chưa đầy đủ.
Quan điểm của tôi là nếu tác giả muốn thu thập tất cả những trục trặc, thì ít nhất anh ta có thể lắng nghe trải nghiệm của người khác chứ không chỉ trích những nhận xét. Một tình huống ngay lập tức nảy sinh khi người đọc biết nhiều hơn tác giả, họ nói với anh ta (đôi khi không chính xác), và anh ta cũng chống trả. Kết quả là tất cả thông tin không có trong bài viết mà ở phần bình luận! Buồn cười! Điều này thường xảy ra, nhưng bạn không cần phải tập trung vào thực tế là bạn muốn điều tốt nhất - tôi thể hiện những gì tốt nhất và những người khác thể hiện điều đó! Đưa điều này vào bài viết và nó sẽ có giá trị; không phải ai cũng thích đọc cuộc giao tranh này.

Khi chúng ta muốn xem dữ liệu từ nhiều bảng cùng lúc, tức là. để tập hợp nhiều bảng thành một, nảy sinh khái niệm kết nối các bảng và mối quan hệ giữa chúng. Có bốn loại kết nối:

  • bên trái;
  • Phải,
  • nội bộ;
  • hoàn thành.

Chúng ta sẽ xem xét từng loại bằng một ví dụ trừu tượng. Có 2 bảng, trong bảng đầu tiên chúng tôi lưu trữ thông tin mô tả về mặt hàng, bảng thứ hai về số dư của nó:

Để lấy một cái từ các bảng này, chúng ta cần chỉ rõ những trường nào chúng ta sẽ kết nối, theo điều kiện và loại nào. Bây giờ nó sẽ trở nên rõ ràng hơn.

Kết nối trái

Bằng cách sử dụng phép nối bên trái, chúng tôi cho hệ thống biết rằng do đó chúng tôi muốn xem tất cả các bản ghi từ bảng bên trái và các bản ghi từ bảng bên phải thỏa mãn điều kiện kết nối. Giả sử chúng ta kết nối các bảng theo trường sản phẩm với điều kiện bằng nhau thì chúng ta sẽ được một bảng như sau:

Yêu cầu.Text =
"CHỌN
| Danh pháp.Sản phẩm,
| Danh pháp.Màu sắc AS Danh pháp màu sắc,
| Còn lại. Màu sắc NHƯ Màu sắc còn lại,
| Số dư.Số lượng
|TỪ

";

Không có kết quả trùng khớp nào cho chiếc ghế trong bảng phần còn lại, vì vậy các trường chứa đầy giá trị NULL, giá trị này phải được xử lý bằng hàm ISNULL, xem Hàm ngôn ngữ truy vấn 1C 8.

Phép nối bên trái hoạt động gần giống như một vòng lặp trong một vòng lặp - nó lấy bản ghi đầu tiên từ bảng bên trái và chạy qua tất cả các bản ghi từ bảng bên phải để đảm bảo rằng điều kiện kết nối được thỏa mãn. Sau đó, bản ghi thứ hai được lấy từ bảng bên trái, v.v. Nếu đột nhiên một số bản ghi từ bảng bên phải thỏa mãn điều kiện kết nối thì một số hàng sẽ được thêm vào bảng kết quả (theo số lượng kết nối thành công). Như chúng ta thấy, bảng kết quả không có nhiều thông tin, dữ liệu không phản ánh bản chất thực sự, vì vậy tốt hơn là kết nối các bảng này theo hai trường: Sản phẩm và Màu sắc, chỉ lần này chúng ta sẽ xử lý NULL:

Yêu cầu.Text =
"CHỌN
| Danh pháp.Sản phẩm,
| Danh pháp.Màu sắc,
| ISNULL(Remaining.Quantity, 0) AS Số lượng
|TỪ
| Danh pháp AS Danh pháp
| LEFT JOIN Phần còn lại NHƯ phần còn lại
| Danh pháp phần mềm.Sản phẩm = Còn lại.Sản phẩm

Kết nối đúng

Kết nối bên phải về cơ bản không khác gì kết nối bên trái. Nếu hoán đổi các bảng, phép nối phải sẽ biến thành phép nối trái, hơn nữa, khi sử dụng hàm khởi tạo, hệ thống sẽ tự chuyển đổi tất cả các phép nối phải thành phép nối trái.

Tham gia nội bộ

Bằng cách sử dụng phép nối bên trong, chúng tôi thông báo cho hệ thống rằng do đó chúng tôi chỉ muốn xem những bản ghi thỏa mãn điều kiện kết nối từ cả bảng bên phải và bảng bên trái. Như vậy, số lượng bản ghi thu được sẽ nhỏ hơn hoặc bằng số lượng bản ghi của bảng ngắn nhất tham gia nối. Hãy áp dụng phép nối bên trong cho các trường Sản phẩm và Màu sắc của các bảng của chúng ta:

Yêu cầu.Text =
"CHỌN
| Danh pháp.Sản phẩm,
| Danh pháp.Màu sắc,
| Còn lại.Số lượng AS Số lượng
|TỪ
| Danh pháp AS Danh pháp
| INNER JOIN Phần còn lại NHƯ phần còn lại
| Danh pháp phần mềm.Sản phẩm = Còn lại.Sản phẩm
| Và Nomenclature.Color = Remaining.Color";

Kết nối đầy đủ

Kết nối đầy đủ sẽ dẫn đến tất cả các bản ghi từ cả hai bảng, những bản ghi thỏa mãn điều kiện kết nối sẽ được kết nối, những bản ghi không thỏa mãn điều kiện kết nối sẽ vẫn có kết quả truy vấn, nhưng với một số trường NULL. Hoàn thành giống như kết nối trái và phải trong một.

Có thể có nhiều vấn đề về chủ đề này, chúng ta hãy thử giải quyết một trong số chúng. Tổ chức của chúng tôi là đại lý của 2 nhà máy sản xuất đồ nội thất: “Zarya” và “Rassvet”. Các loại chi phí của từng nhà máy được lưu trữ trong các bảng khác nhau. Cần tạo một bảng giá duy nhất và bao gồm các sản phẩm ở mức giá tối thiểu:

Hãy áp dụng phép nối đầy đủ với lựa chọn của tất cả các trường, chúng tôi sẽ kết nối theo sản phẩm:

Yêu cầu.Text =
"CHỌN
| Danh phápZarya.Sản phẩm AS Sản phẩmZarya,
| Danh phápZarya.Giá AS PriceZarya,
| Danh pháp Rassvet.Sản phẩm AS Sản phẩm Rassvet,
| Danh mụcRassvet.Giá theo giáRassvet
|TỪ

Đây không hẳn là những gì chúng ta cần, hãy kết hợp trường sản phẩm thành một và xử lý NULL:

Yêu cầu.Text =
"CHỌN
//cấu trúc ISNULL đã được thảo luận trong phần hàm ngôn ngữ truy vấn
// nếu giá chưa được xác định thì khởi tạo nó
// tại sao 1000000 xem giải thích bên dưới
| ISNULL(Danh phápZarya.Price, 1000000) AS PriceZarya,
| ISNULL(NomenclatureRassvet.Price, 1000000) AS PriceRassvet
|TỪ
| Danh phápZarya AS Danh phápZarya
| KẾT NỐI ĐẦY ĐỦ Danh phápDawn NHƯ Danh phápDawn
| Danh mục phần mềmZarya.Product = NomenclatureDawn.Product";

Tất cả những gì còn lại là chọn mức giá tối thiểu. Văn bản yêu cầu cuối cùng sẽ trông như thế này:

Yêu cầu.Text =
"CHỌN
| ISNULL(NomenclatureZarya.Product, NomenclatureDawn.Product) AS Sản phẩm,
| SỰ LỰA CHỌN
| KHI CÓ ISNULL(NomenclatureZarya.Price, 1000000) > ISNULL(NomenclatureRassvet.Price, 1000000)
| SAU ĐÓ ISNULL(NomenclatureRassvet.Price, 1000000)
| ELSE ISNULL(Danh phápZarya.Price, 1000000)
| KẾT THÚC NHƯ GIÁ
|TỪ
| Danh phápZarya AS Danh phápZarya
| KẾT NỐI ĐẦY ĐỦ Danh phápDawn NHƯ Danh phápDawn
| Danh mục phần mềmZarya.Product = NomenclatureDawn.Product";

Nếu giá không được xác định (NULL), thì giá đó phải được khởi tạo với một số giá trị, nếu không thao tác so sánh nhiều hơn/ít hơn sẽ không thành công và có lỗi. Chúng ta khởi tạo giá với một số tiền lớn phi thực tế để nó “mất” trong thao tác so sánh, vì theo điều kiện của bài toán chúng ta chọn mức giá thấp nhất.

← Chức năng của ngôn ngữ truy vấn 1C 8 | Tham gia vào 1C 8 truy vấn →