Ghi vào nguồn dữ liệu ngoài 1s 8.3. Nguồn dữ liệu bên ngoài. Tạo nguồn mới

Trong phiên bản 8 của chương trình 1C, các nhà phát triển đã thêm vào chức năng khả năng kết nối cơ sở dữ liệu của bên thứ ba và lấy thông tin từ họ trực tiếp từ bộ cấu hình mà không cần sử dụng kết nối COM và đối tượng OLE. Tính năng này được triển khai bằng cách sử dụng một đối tượng mới - “Nguồn dữ liệu bên ngoài”

Nguồn dữ liệu ngoài trong 1C có thể được sử dụng tương tự như các bảng khác trong hệ thống:

  1. Khi tạo báo cáo và tính toán bằng hệ thống tổng hợp dữ liệu (DCS);
  2. Để có được các liên kết đến thông tin được lưu trữ trong các nguồn của bên thứ ba;
  3. Để thay đổi dữ liệu được lưu trữ trong bảng;
  4. Khi tạo yêu cầu.

Điều quan trọng cần biết là cơ chế này không được thiết kế để hoạt động với các cơ sở dữ liệu 1C khác, vì bản thân mô hình vận hành 1C.Enterprise không bao hàm sự can thiệp vào dữ liệu ở cấp độ bảng vật lý.

Tạo nguồn mới

Việc thêm nguồn bên ngoài mới vào chương trình sẽ diễn ra ở chế độ “Bộ cấu hình”. Có một nhánh tương ứng trong cây cấu hình (Hình 1)

Bạn sẽ phải làm việc chăm chỉ khi tạo một nguồn mới, mặc dù thực tế là biểu mẫu của đối tượng mới chỉ có bốn tab:

  1. Nền tảng;
  2. Dữ liệu;
  3. Chức năng;
  4. Quyền.

Tab đầu tiên chỉ có một tham số thú vị - chế độ điều khiển khóa. Nếu bạn không có bất kỳ câu hỏi nào về việc chặn dữ liệu trong các giao dịch hoặc sự phức tạp của việc song song hóa các luồng thông tin, bạn có thể để tùy chọn này ở chế độ chặn tự động. Tuy nhiên, cách tiếp cận như vậy có thể dẫn đến những hạn chế quá mức (ví dụ: khi thay vì một bản ghi riêng biệt, chương trình sẽ khóa toàn bộ bảng vật lý, tước đi khả năng làm việc với nó của những người dùng khác).

Khóa được quản lý, không giống như khóa tự động, sử dụng cơ chế giao dịch vốn có trong chính chương trình chứ không phải trong DBMS, cho phép chuyển việc chụp bảng xuống mức thấp hơn nhiều.

Bằng cách đặt tham số này thành “Tự động và được quản lý”, chúng tôi cung cấp cho hệ thống khả năng xác định chế độ nào sẽ sử dụng bằng cách truy cập trực tiếp vào thuộc tính tương tự cho từng bảng cụ thể.

Tab “Dữ liệu” của biểu mẫu thuộc tính nguồn bên ngoài

Hình thức của tab “Dữ liệu” được hiển thị trong Hình 2. 2

Cơm. 2

Ở đây chúng ta có thể thêm các bảng và hình khối nguồn bên ngoài. Có hai cách để thêm bảng:

  1. Theo cách thủ công, biểu mẫu thêm bảng sẽ mở ra trước mặt chúng ta (Hình 3);

Cơm. 3

  1. Hoặc chọn từ danh sách các bảng nguồn vật lý (Hình 4), trong trường hợp đó, một hàm tạo đặc biệt sẽ mở ra trước mặt chúng ta.

Cơm. 4

Chúng ta hãy xem xét kỹ hơn biểu mẫu để thêm bảng. Thuộc tính “Tên” được sử dụng để nhận dạng duy nhất một đối tượng trong cấu hình.

Việc so sánh đối tượng siêu dữ liệu và bảng vật lý cuối cùng xảy ra thông qua thuộc tính “Tên trong nguồn dữ liệu” nằm trên tab “Nâng cao” (Hình 5)

Cơm. 5

Tiếp theo chúng ta phải xác định loại bảng, hay đúng hơn là tính khách quan của nó. Nếu dữ liệu được lưu trữ trong cấu trúc có thể được xác định duy nhất thông qua bất kỳ trường nào thì bảng có thể là một đối tượng. Nếu tính riêng lẻ của một bản ghi được xác định bởi một tập hợp các trường khóa thì bảng phải có loại không phải đối tượng.

So sánh các bảng như vậy với các đối tượng siêu dữ liệu khác, có thể đưa ra sự tương tự sau:

  • Bảng đối tượng là sách tham khảo;
  • Những cái không có đối tượng là các thanh ghi thông tin.

Tập hợp các trường khóa được xác định trong tham số biểu mẫu tiếp theo (“Trường khóa”). Trường này là bắt buộc; nếu bạn để trống, việc lưu cấu hình sẽ không thành công.

Như có thể thấy trong Hình 5, một số trường và nút của biểu mẫu không thể chỉnh sửa được:

  • Biểu thức trong nguồn dữ liệu;
  • Kiểu dữ liệu bảng;
  • Lĩnh vực trình bày;
  • Xem trình xử lý.

Chúng chỉ có thể được sử dụng sau khi chúng ta điền vào các trường trong bảng, xác định loại của chúng và gán mã định danh cho chúng (Hình 6)

Cơm. 6

Ở đây bạn nên chú ý đến tham số “Cho phép Null”, nếu hộp kiểm này được chọn thì không nên sử dụng trường đó làm khóa.

Trình tạo bảng

Có lẽ điểm quan trọng và thú vị nhất khi làm việc với các nguồn bên ngoài là tạo ra một chuỗi kết nối. Hàm khởi tạo của nó sẽ mở ra nếu bạn nhấp vào nút có ba dấu chấm bên cạnh tham số “Chuỗi kết nối”.

Trước hết, chúng tôi sẽ được yêu cầu quyết định trình điều khiển sẽ được sử dụng để kết nối (Hình 7)

Cơm. 7

Định nghĩa không chính xác về tham số này sẽ không cho phép bạn kết nối với cơ sở thông tin của bên thứ ba. Bạn cũng nên hiểu rằng không phải tất cả các trình điều khiển được chỉ định trong danh sách thả xuống đều có thể được sử dụng để tự động tạo chuỗi kết nối. Nếu nền tảng phát sinh lỗi (Hình 8), thì chuỗi kết nối sẽ phải được nhập thủ công.

Hình 8

Cơm. 9

Bản thân đường dây này là một công trình được quản lý chặt chẽ.

Chuỗi kết nối ví dụ

Hãy xem xét cơ sở dữ liệu của bên thứ ba được tạo trong Microsoft Access và nằm trong thư mục gốc của ổ D. Để kết nối cơ sở dữ liệu này, chúng ta phải sử dụng trình điều khiển thích hợp, nhưng việc chọn nó trong hàm tạo hàng sẽ dẫn đến lỗi Hình 8.

Chúng ta sẽ tự thiết lập các thông số kết nối.

Driver=(Microsoft Access Driver (*.mdb)) – đây là phần đầu tiên của dòng. Trong dấu ngoặc nhọn, chúng tôi đã xác định trình điều khiển.

Đối với file Excel sẽ có dạng (Microsoft Excel Driver (*.xls)), đối với file Excel được tạo trong văn phòng cũ hơn 2003, dòng driver sẽ có dạng (*.xls, *.xlsx, *. xlsm, *.xlsb)).

Tách tham số này khỏi tham số tiếp theo bằng dấu phẩy, chúng ta phải nhập địa chỉ lưu trữ của mình (trong trường hợp của chúng ta là DBQ=D:\Database1.mdb).

Thêm hai tham số này, chúng ta nhận được Driver=(Microsoft Access Driver (*.mdb));DBQ=D:\Database1.mdb. Bằng cách viết tham số này, chúng ta có quyền truy cập vào cấu trúc bên trong của cơ sở dữ liệu này.

Đối với đối tượng “Nguồn bên ngoài”, chỉ tạo nó trong cấu hình là chưa đủ mà nó còn cần được kết nối ở chế độ “Doanh nghiệp”. Điều này có thể được thực hiện từ menu “Tất cả chức năng”->Nguồn bên ngoài. Khi lần đầu tiên vào bảng của mình, chúng ta cần nhập cùng một chuỗi kết nối ở chế độ “Doanh nghiệp”.

Bản phát hành 8.2.14.533 cuối cùng cũng là phiên bản ổn định hơn của bản phát hành thứ 14 của nền tảng. Cuối cùng, cơ hội đã xuất hiện để thử một cơ hội tuyệt vời - “nguồn dữ liệu bên ngoài”.

Tại sao cơ hội này lại được quan tâm như vậy? Bất kỳ người nào đã lập trình trong 1C và khá quen thuộc với SQL và ít nhất là quen thuộc với kiến ​​trúc và nguyên tắc phát triển của các nền tảng công nghệ khác cho các ứng dụng kinh doanh sẽ cho bạn biết một cách chắc chắn điều họ thích nhất ở 1C. Tất nhiên, trình tạo truy vấn là cơ chế thuận tiện và chu đáo nhất để viết các truy vấn nhằm truy xuất dữ liệu từ các cấu trúc quan hệ mà cá nhân tôi từng gặp. Và bây giờ 1C đã cho chúng tôi một cơ hội tuyệt vời để sử dụng nó không chỉ với 1C mà còn với bất kỳ bảng nào khác. Chỉ là “thùng mật ong” này có rất nhiều “ruồi trong mỡ”. Điều đầu tiên trước tiên:

1) Thiết lập và sử dụng - nếu không “nhảy múa với tambourine” thì sẽ không hoạt động

A) Thêm nguồn dữ liệu ngoài - có vẻ không phức tạp
b) đánh dấu vào hộp kiểm “Chọn từ danh sách” - bắt buộc - điều này là cần thiết để kiểm tra chức năng ngay từ đầu và sẽ giúp bạn tránh khỏi những rắc rối không cần thiết
V)
(IMG:http://pics.livejournal.com/comol/pic/0000cr1r.png)
- hãy chắc chắn nhấp vào "..." - kết nối là ODBC. Không phải OLEDB như chúng ta vẫn quen, mà thấp hơn một cấp

Nhưng hãy ở đây RẤT CẨN THẬN.

Đây là trình điều khiển ODBC - nếu bạn sử dụng phiên bản máy khách-máy chủ thì nó phải có trên máy chủ. Nếu bạn đang phát triển trên một hệ thống và đang làm việc trên một hệ thống khác (như thường lệ), hãy đảm bảo rằng không có điều gì bất ngờ đang chờ đợi bạn. Một khuyến nghị kỳ lạ, nhưng hãy chọn trình điều khiển cũ nhất hoặc phổ biến nhất nếu bạn không đặc biệt quan tâm đến tốc độ và không có ý định vượt quá khả năng của tiêu chuẩn SQL92. Điều này sẽ cung cấp cho bạn khả năng tương thích tốt hơn. Ví dụ: đối với SQL Server 2008, trình điều khiển tốt nhất sẽ là SQL Server Native Client 11, nhưng tôi khuyên bạn chỉ nên chọn SQL Server, nếu không thì máy khách gốc này sẽ phải được cài đặt trên máy chủ hoặc trên tất cả các máy khách (nếu sử dụng phiên bản tệp) và lợi ích đặc biệt là anh ấy sẽ không giao cho bạn bất kỳ nhiệm vụ nào.

E) Hộp thoại lựa chọn Máy chủ Tiêu chuẩn

G) Chọn bảng và chi tiết... một cơ hội tuyệt vời - bạn có thể đổi tên ngay lập tức theo ý muốn (và cả chi tiết nữa), và trong thuộc tính, bạn sẽ thấy tên của các trường của nguồn dữ liệu

Z) Và bây giờ bạn khởi chạy nó, mở trình thiết kế truy vấn - chọn tất cả các bản ghi từ bảng và OPA một cách ngu ngốc - một lỗi. Phải làm gì? Nếu bạn có giao diện được quản lý, hãy xem menu dịch vụ và nếu là giao diện thông thường...
Cá nhân tôi đã sử dụng mã này:

Tham số = InternalDataSources.DAX.GetGeneralConnectionParameters();
Tham số.AuthenticationStandard = True;
Parameters.UserName = "sa";
Parameters.Password = "pas";
Parameters.ConnectionString = "DRIVER=(SQL Server);SERVER=servet;UID=sa;PWD=;DATABASE=database";
Parameters.DBMS = "MSSQLServer";

InternalDataSources.DAX.SetCommonConnectionParameters(Tham số);
InternalDataSources.DAX.SetUserConnectionParameters(Tên người dùng(), Tham số);
InternalDataSources.DAX.SetSessionConnectionParameters(Tham số);

Bên ngoàiDataSource.DAX.SetConnection();

Một số phần có thể không cần thiết, nhưng nó hoạt động. Bạn cần chạy mã MỘT LẦN. Sau đó, việc kết nối sẽ trở nên bình thường... tất nhiên là thần bí - tại sao điều này lại cần thiết thì không rõ...

2) Nguồn dữ liệu chỉ đọc
Đúng, phép màu không xảy ra... nhưng đôi khi bạn muốn như vậy....

3) KHÔNG THỂ SỬ DỤNG CÙNG VỚI NGUỒN DỮ LIỆU NỘI BỘ
Cá nhân tôi, sự thật này đã giết chết tôi ngay tại chỗ.

Làm sao có thể như vậy... điều chúng tôi đã chờ đợi và đã tưởng tượng và liếm môi về cách bây giờ chúng tôi sẽ kết hợp dữ liệu của mình với 1C trong một yêu cầu, thu gọn nó - nhóm nó lại, chèn nó vào báo cáo, nhưng đó không phải là trường hợp...

Nhưng tất nhiên điều này không ngăn cản những người có kinh nghiệm... bạn đã nghĩ gì? Đúng vậy - các bảng tạm thời:

4) KHÔNG THỂ SỬ DỤNG CÙNG VỚI BẢNG TẠM THỜI

Nhưng đây không còn là những khó khăn về mặt công nghệ nữa mà rất giống những gì họ muốn chúng ta làm “để cuộc sống không còn giống như thiên đường” (IMG:).

5) Chỉ có thể được sử dụng trong các kết nối ACS

Đối với những người chưa biết, đây là trong ACS trên tab “Liên kết tập dữ liệu”. Bạn có sử dụng chúng thường xuyên không? Thoải mái? Rõ ràng họ muốn buộc chúng ta phải sử dụng chúng thường xuyên hơn. Chỉ có một cột “Điều kiện giao tiếp” và “Tham số giao tiếp”. Tôi chưa tìm thấy ví dụ nào về việc sử dụng chúng trong bất kỳ cấu hình tiêu chuẩn nào và bằng cách nào đó, mọi thứ đều không minh bạch trong tài liệu cũng như trong tác phẩm của Khrustaleva. Bất cứ ai có thể giải thích cho tôi cách "điều kiện kết nối" hoạt động. Nếu bạn viết Thuộc tính nguồn = Thuộc tính người nhận ở đó thì nó không hoạt động. Tất nhiên, điều kiện có thể được viết trong trường "Biểu thức" - trong hầu hết các trường hợp, điều này là đủ... nhưng bằng cách nào đó, nó không diễn ra dễ dàng.

Tổng cộng, vấn đề này trước đây đã được giải quyết ở đâu đó như thế này:

Hàm Khởi tạoDataSource()

DateStart = Cài đặtComposer.Settings.DataParameters.Items.Value;
DataCon = Cài đặtBuilder.Settings.DataParameters.Items.Value;
Nếu DataCon> "20100101" thì
DataCon = "20100101";
endIf;

CN = Số vòng loại mới(15,2);
KS = NewStringQualifiers(255);

ArrayNumber = Mảng mới();
ArrayNumber.Add(Type("Số"));

ArrayString = Mảng mới();
ArrayString.Add(Type("String"));

ArrayData = Mảng mới();
ArrayDate.Add(Type("Date"));

// Ta sẽ điền chi phí kế toán vào bảng
TypeNumber = Loại mô tả mới(ArrayNumber, CN);
TypeString = Mô tả kiểu mới(ArrayString, KS);
TypeDate = Mô tả kiểu mới(ArrayDate);

//bảng nạp dữ liệu từ SQL
TZ = Bảng giá trị mới();
TK.Columns.Add("NomenclatureCode", TypeString);
TK.Columns.Add("Qnty", TypeNumber);
TK.Columns.Add("Giai đoạn", DateType);

TK.Indices.Add("Giai đoạn");

//Kết nối với SQL
Chuỗi kết nối = "Provider=SQLOLEDB.1;Thông tin bảo mật liên tục=True;ID người dùng=sa;Pwd=;Nguồn dữ liệu=;Quy trình sử dụng để chuẩn bị=1;Tự động dịch=True;Kích thước gói=4096;ID máy trạm=;Sử dụng Mã hóa dữ liệu=False;Gắn thẻ đối chiếu cột khi có thể=False;Danh mục ban đầu=Báo cáo";
Kết nối = COMObject mới ("ADODB.Connection");
Lệnh = COMObject mới ("ADODB.Command");
RecordSet = COMObject mới("ADODB.RecordSet");
Ngày = "";
Nỗ lực
Connection.Open(AbbrLP(ConnectionString));
Command.ActiveConnection = Kết nối;
Command.CommandText = "Chọn * từ PH trong đó dấu chấm >= "" + String(Format(DateStart, "DF=yyyyMMdd")) + "" và dấu chấm RecordSet = Command.Execute();
RecordSet.MoveFirst();
Ngoại lệ
Trả lại thông số kỹ thuật;
EndAttempt;

Trong khi RecordSet.EOF = Vòng lặp sai
Dòng = TZ.Add();
Row.NomenclatureCode = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value;
Row.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Value;
Row.Period = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value;
RecordSet.MoveNext();
Chu kỳ cuối;

Yêu cầu = Yêu cầu mới();
VrTable = Trình quản lý bảng tạm thời mới();
Query.SetParameter("vrDataTable", TK);
Query.SetParameter("Ngày bắt đầu", Ngày bắt đầu);
Yêu cầu.SetParameter("DataCon", DateCon);
Query.Text = "CHỌN
| vrDataTable.NomenclatureCode,
| vrDataTable.Qnty,
| vrDataTable.Period
|Bảng dữ liệu địa điểm
|TỪ
| &vDataTable NHƯ vrDataTable
|ĐÂU
| vrDataTable.Period >= &DateStart
| Và vrDataTable.Period Query.Execute();
TZ = Không xác định;

Yêu cầu = Yêu cầu mới;
Query.TemporaryTableManager = VrTable;
Query.Text = "Đây là một truy vấn liên quan đến một bảng biến";

Kết quả = Query.Run();
Trả về kết quả;

Chức năng cuối cùng

Bộ ngoài = Khởi tạoDataSource();
Bộ dữ liệu = Cấu trúc mới();
DataSet.Insert ("Bảng SQL", Bộ ngoài);
Điển hìnhReports.GenerateTypicalReport(ThisObject, Kết quả, Dữ liệu giải mã, OutputToReportForm, DataSet);

Trên thực tế, không có nhiều dòng mã và chúng khá chuẩn... trong trường hợp này, bạn có thể sử dụng toàn bộ chức năng của trình thiết kế truy vấn và chỉ cung cấp chức năng THÀNH PHẦN DỮ LIỆU cho ACS

Nhưng nó chắc chắn trông không đẹp bằng... và mỗi khi bạn cần viết mã để tải các giá trị lên một bảng và kiểm tra xem bạn có mắc lỗi trong tên của các chi tiết không... và những gì chúng tôi được cung cấp trong đó 1C có vẻ nửa vời. Tôi vẫn chưa quyết định cái nào thuận tiện hơn để sử dụng. Bạn quyết định và viết về những quyết định của mình cũng như điều gì đã thúc đẩy bạn đưa ra quyết định đó.

[bạn phải đăng ký để xem liên kết]

Bắt đầu từ phiên bản 8.3.5, nền tảng đã triển khai khả năng ghi dữ liệu vào bảng của nguồn dữ liệu ngoài. Bài viết thảo luận về chức năng này, giúp mở rộng các khả năng hiện có để tích hợp cấu hình với hệ thống của bên thứ ba.

Khả năng ứng dụng

Bài viết thảo luận về nền tảng 1C 8.3.5. Tài liệu này cũng phù hợp với các bản phát hành nền tảng hiện tại.

Ghi vào nguồn dữ liệu ngoài trong 1C:Enterprise 8

Trong nền tảng 8.2.14, một đối tượng mới đã được thêm vào cây siêu dữ liệu - nguồn dữ liệu bên ngoài. Mục đích của cơ chế này là lấy dữ liệu từ cơ sở dữ liệu bên ngoài liên quan đến 1C.

Với việc phát hành các bản phát hành nền tảng mới, các nguồn dữ liệu bên ngoài đã phát triển, chẳng hạn như có thể đặt chúng vào các bảng tạm thời và thực hiện kết nối với các bảng thông thường.

Trong bài viết này, chúng ta sẽ xem xét những công cụ mà nhà phát triển phải ghi vào nguồn dữ liệu bên ngoài.

Tất cả các hành động được thực hiện trên DBMS Microsoft SQL Server 2008 R2.

Nền tảng 8.3.4 đã giới thiệu khả năng sử dụng các chức năng được mô tả trong các nguồn dữ liệu bên ngoài.

Tính năng này cho phép bạn chạy các thủ tục được lưu trữ ở phía Máy chủ SQL và với sự trợ giúp của chúng để truy cập dữ liệu từ các nguồn bên ngoài, bao gồm cả việc ghi.

Hãy xem một ví dụ. Sử dụng SQL Management Studio, hãy tạo một cơ sở dữ liệu mới có tên kursy_test. Tất cả các thí nghiệm tiếp theo sẽ được thực hiện trên đó.

Trong cơ sở dữ liệu này, chúng tôi sẽ tạo một bảng danh pháp, để làm điều này, chúng tôi sẽ viết một tập lệnh có nội dung sau:

SỬ DỤNG [kursy_test]
ĐI
TẠO BẢNG [dbo]. [danh pháp](
[id] [int] KHÔNG NULL,
[ mô tả ] [ nvarchar ](150) KHÔNG NULL,
[giá] [số](15, 2) NULL,
Ràng buộc [ PK_id ] KHÓA CHÍNH ([ id ])
ĐI

Kết quả của việc thực thi sẽ được tạo một bảng có cấu trúc sau:

Bây giờ chúng ta cần tạo hai thủ tục được lưu trữ để thực hiện sửa đổi dữ liệu.

Hãy gọi thủ tục đầu tiên là Insert_nomenklatura. Nó sẽ được thiết kế để thêm một hàng mới vào bảng. Kịch bản để tạo nó sẽ trông như thế này:

SỬ DỤNG [kursy_test]
ĐI
TẠO THỦ TỤC Insert_nomenklatura
@id int
@description nvarchar(150),
@giá số (15, 2)
BẰNG
BẮT ĐẦU
XÁC NHẬN VÀO [kursy_test].dbo. [danh pháp] ([ id ], [ mô tả ],[ giá ])
GIÁ TRỊ (@id, @description, @price)
KẾT THÚC
ĐI

Quy trình thứ hai, có tên là update_nomenklatura, sẽ cập nhật mục nhập hiện có trong bảng. Để tạo nó, tập lệnh sau đã được đưa ra:

Trong Trình duyệt đối tượng, bảng đã tạo và hai thủ tục được lưu trữ trông như thế này:

Chúng ta đã hoàn thành tất cả các bước chuẩn bị ở phía Microsoft SQL Server, bây giờ chúng ta chuyển sang bộ cấu hình 1C:Enterprise 8.

Tạo nguồn dữ liệu ngoài mới có tên Nomenklatura. Khi tạo bảng mới trong nguồn dữ liệu này, chúng tôi chỉ định các tham số sau để kết nối với nguồn dữ liệu:

Chúng tôi chỉ định chuỗi kết nối sau:

Trình điều khiển = (Máy chủ SQL); Máy chủ =(cục bộ); Cơ sở dữ liệu = kursy_test; Id người dùng = sa ; Mật khẩu =;

Nếu người dùng sa có mật khẩu thì phải được chỉ định trong tham số Mật khẩu của đường kết nối.

Nếu tất cả các tham số kết nối được chỉ định chính xác thì khi bạn nhấn OK, một cửa sổ sẽ mở ra chứa các bảng có sẵn trong nguồn dữ liệu:

Chúng tôi đánh dấu vào các trường trong bảng mà chúng tôi quan tâm. Khi nhấn nút Sẵn sàng bảng dbo_nomenklatura sẽ được tạo trong nguồn dữ liệu ngoài Nomenklatura:

Bây giờ chúng ta chuyển sang tab “Chức năng” của nguồn dữ liệu của mình.

Bằng cách sử dụng một trình hướng dẫn tương tự, chúng tôi thêm hai thủ tục được lưu trữ:

Chúng tôi nhận được giao diện sau của tab “Chức năng”:

Bây giờ hãy lập trình giao diện người dùng để làm việc với nguồn dữ liệu bên ngoài.

Trong biểu mẫu danh sách trên bảng lệnh, chúng tôi sẽ đặt nút “Thêm” với trình xử lý sau:

&Trên máy khách
Thủ tục Thêm()
Cảnh báo = Mới Mô tảCảnh báo(“OpenTableComplete”, Đối tượng này );
Biểu mẫu mở (
"ExternalDataSource.Nomenklatura.Table.dbo_nomenklatura.ObjectForm"
, , , , , ,
Báo động, FormWindowOpenMode.LockEntireInterface);
Kết thúc thủ tục

&Trên máy khách
Lưu thủ tục (Lệnh)
Lưu trên máy chủ();
Kết thúc thủ tục &Trên máy chủ
Thủ tục Lưu trên máy chủ()
Nếu như Object.Link.Empty() Sau đó
Nguồn dữ liệu bên ngoài.Nomenklatura.dbo_insert_nomenklatura
Nếu không thì
Nguồn dữ liệu bên ngoài.Nomenklatura.dbo_update_nomenklatura
(Object.id, Object.description, Object.price);
Hết Nếu ;
Kết thúc thủ tục

Ở chế độ Doanh nghiệp, biểu mẫu danh sách trông như thế này:

Hình dạng của đối tượng được hiển thị dưới đây:

Để phóng to, bấm vào hình ảnh.

Do đó, bằng cách sử dụng các thủ tục được lưu trữ, chúng tôi đã triển khai việc ghi vào các nguồn dữ liệu bên ngoài.

Trong nền tảng 8.3.5, một tính năng mới đã xuất hiện - ghi trực tiếp vào nguồn dữ liệu bên ngoài, bỏ qua cơ chế thủ tục lưu trữ đã thảo luận ở trên.

Dữ liệu có thể được chỉnh sửa theo chương trình hoặc tương tác. Và trong ví dụ của chúng tôi, không cần phải dùng đến cấu hình.

Trong bảng lệnh và trong menu “Thêm”, bạn có thể thấy các nút tiêu chuẩn như “Tạo”, “Sao chép”, “Chỉnh sửa”, v.v.

Để phóng to, bấm vào hình ảnh.

Và các nút “Save” và “Save and Close” xuất hiện ở dạng đối tượng:

Như bạn có thể thấy, hiện nay làm việc với các nguồn bên ngoài cũng tương tự như làm việc với sách tham khảo, tài liệu, v.v.

Hãy xem những thay đổi nào đã được thực hiện ở cấp siêu dữ liệu để có thể ghi vào nguồn dữ liệu bên ngoài.

Một thuộc tính mới đã được thêm vào bảng dữ liệu Chỉ đọc(kiểu – boolean).

Nếu thuộc tính này được đặt thành True thì việc ghi dữ liệu vào bảng này bằng các công cụ nền tảng là không thể.

Trường bảng dữ liệu hiện có các thuộc tính sau:

  • Chỉ đọc(loại – boolean) – có thể thay đổi dữ liệu trong trường này không;
  • Cho phépNull(loại – boolean) – liệu có thể lưu trữ giá trị NULL trong trường này hay không.

Tài sản Chỉ đọc nên được đặt thành ĐÚNG VẬYđối với các trường cơ sở dữ liệu có thay đổi tự động, các trường khóa được tạo tự động, các trường được tính toán, v.v.

Bạn có thể thêm, thay đổi và xóa dữ liệu trong các nguồn bên ngoài bằng ngôn ngữ tích hợp.

Để làm được điều này, các đối tượng Bộ bản ghi dữ liệu bên ngoàiSourceTableRecordSetĐối tượng dữ liệu bên ngoàiSourceTable phương pháp mới đã được thực hiện Viết()Xóa bỏ().

Hãy xem ví dụ về việc thêm bản ghi mới theo chương trình cho nguồn dữ liệu ngoài đã thảo luận ở trên.

&Trên máy khách
Thủ tục Tạo theo chương trình(Đội )
Tạo theo chương trình trên máy chủ();
Kết thúc thủ tục &Trên máy chủ

Thủ tục Tạo theo chương trình trên máy chủ()
Đối tượng có thể ghi=
Nguồn dữ liệu bên ngoài.Nomenklatura.Tables.dbo_nomenklatura.CreateObject();
Có thể ghiObject.id= 5 ;
WriteableObject.description= “Tủ quần áo” ;
Có thể ghiObject.price= 5000 ;
Có thể ghiObject.Write();
Kết thúc thủ tục

Trong mô-đun đối tượng bảng nguồn dữ liệu ngoài, giờ đây bạn có thể chỉ định các trình xử lý sự kiện ghi, chẳng hạn như TrướcViết(), OnWrite() vân vân.:

Bài viết này xem xét hai tùy chọn để ghi dữ liệu vào nguồn dữ liệu ngoài - sử dụng các thủ tục được lưu trữ và sử dụng các cơ chế mới của nền tảng 8.3.5.

Do đó, nền tảng hiện thực hiện các cơ chế tích hợp hoàn toàn với các ứng dụng bên ngoài.

Trong phiên bản 8.3.6, chức năng được mô tả ở trên đã được mở rộng với sự trợ giúp của các phương thức đặc biệt mới GetModibilityFields() và SetModibilityFields(). Bằng cách sử dụng chúng, có thể thực hiện thao tác ghi trong các trường của bảng VIEW được đánh dấu trong bộ cấu hình là chỉ đọc. Nhờ đó, có thể triển khai một kịch bản trong đó chỉ có thể ghi vào các trường riêng lẻ của bảng VIEW trong trường hợp cần thiết, phù hợp với logic nghiệp vụ của ứng dụng.

Trong phiên bản 8.3.7, cơ chế đã được cải tiến để xác định trường cụ thể nào của bảng VIEW có thể chứa giá trị NULL. Tính đến thời điểm này, tất cả các bảng VIEW đều có thể chấp nhận giá trị này. Sự thay đổi này là do tốc độ sắp xếp trong danh sách động theo các trường này tăng lên.

Trong phiên bản 8.3.8, cuối cùng đã có thể phát hiện ra thực tế là nguồn dữ liệu bên ngoài đang ở trạng thái giao dịch. Chức năng này được cung cấp bởi phương thức mới InternalDataSourceManager.TransactionActive()

Để kết luận, chúng tôi lưu ý rằng đối với các nguồn dữ liệu bên ngoài, như được hiển thị ở trên, các bảng dữ liệu từ mô hình quan hệ cổ điển được mô tả. Nền tảng này sử dụng một mô hình khác để làm việc với dữ liệu, cung cấp cho nhà phát triển một tập hợp các loại đối tượng ứng dụng nhất định (thư mục, tài liệu, sổ đăng ký, v.v.). Đó là lý do tại sao hệ thống khi làm việc với các bảng nguồn dữ liệu ngoài không hỗ trợ hầu hết các chức năng vốn có trong các đối tượng “gốc” của nó. Do đó, nên hạn chế phát triển bất kỳ logic nghiệp vụ nào, có tính đến việc sử dụng bảng VID, nếu điều này không liên quan đến nhiệm vụ tích hợp với các hệ thống hiện có. Hoặc, nói một cách đơn giản, bạn nên cố gắng tránh lưu trữ dữ liệu được sử dụng tích cực trong ứng dụng của mình trong một số bảng khác của hệ thống bên ngoài, nếu nó không được hệ thống này sử dụng.

Trong bài viết tiếp theo, chúng ta sẽ xem xét sự tiếp tục hợp lý của việc sử dụng công nghệ nguồn dữ liệu bên ngoài trong hệ thống 1C:Enterprise.

Trong phiên bản nền tảng 8.3.5.1068 (và phiên bản mới hơn), có thể thêm, thay đổi và xóa dữ liệu trong các nguồn bên ngoài bằng phần mềm 1C. Ví dụ về tính năng này được trình bày trong bài viết này.

Để có thể ghi vào các nguồn bên ngoài, công ty 1C đã thêm các thuộc tính mới vào bảng dữ liệu và trường của các nguồn bên ngoài:

  • Đối với toàn bộ bảng - thuộc tính Chỉ đọc. Chỉ đọc = Đúng có nghĩa là việc thay đổi dữ liệu trong bảng này là không thể;
  • Đối với các trường bảng riêng lẻ - thuộc tính Chỉ đọc, Cho phépNullĐiền giá trị:
    • Chỉ đọc = Đúng có nghĩa là không thể thay đổi dữ liệu trong trường này;
    • AllowNull = Đúng có nghĩa là một giá trị có thể được ghi vào trường này VÔ GIÁ TRỊ;
    • Điền giá trị chứa giá trị mặc định của trường này (nếu có).

Bạn (khi mô tả bảng theo cách thủ công) hoặc nền tảng (khi tạo bảng bằng trình thiết kế) có thể sử dụng các thuộc tính này như sau.

  • Chỉ đọc = Đúngđặt, ví dụ: cho các dạng xem, các bảng thu được dựa trên một biểu thức (kết quả hàm) và những thứ tương tự. Dữ liệu trong các bảng như vậy không thể thay đổi được;
  • Chỉ đọc = Đúng chỉ định cho các trường được đặt tự động ( TỰ ĐỘNG TĂNG), các trường được tính toán và những thứ tương tự. Dữ liệu trong các trường như vậy không thể thay đổi được;
  • AllowNull = Đúngđược đặt cho tất cả các trường ngoại trừ các trường chính và những trường được mô tả trong nguồn bên ngoài dưới dạng CÓ GIÁ TRỊ;
  • Điền giá trị các trường nên được đặt trong trường hợp nguồn bên ngoài chỉ định giá trị tiêu chuẩn của trường này (giá trị MẶC ĐỊNH).

Bạn có thể thêm, thay đổi và xóa dữ liệu trong các nguồn bên ngoài bằng ngôn ngữ tích hợp hoặc tương tác. Ngôn ngữ tích hợp sử dụng các phương thức quản lý bảng sau đây cho việc này:

  • TạoRecordSet()- đối với các bảng không có đối tượng;
  • Phương pháp mới TạoObject()- đối với các bảng đối tượng.

Theo đó, các đối tượng Bộ bản ghi dữ liệu bên ngoàiSourceTableRecordSetĐối tượng dữ liệu bên ngoàiSourceTable phương pháp mới đã xuất hiện Viết()Xóa bỏ().

Thêm dữ liệu

Khi bạn thêm dữ liệu vào nguồn bên ngoài, bạn tạo một đối tượng (hoặc tập bản ghi), đặt giá trị trường và ghi. Tuy nhiên, có một số tính năng hữu ích cần biết.

Ví dụ: nếu bạn cố gắng đặt giá trị của trường có Chỉ đọc = Đúng, một lỗi sẽ được đưa ra. Và khi ghi trực tiếp vào cơ sở dữ liệu trong biểu thức CHÈN các trường như vậy sẽ bị bỏ qua. Các trường còn lại chứa các giá trị mà bạn đã gán cho chúng. Do đó các giá trị Vô giá trị và các giá trị mặc định phải được gán cho các trường một cách rõ ràng.

  • nhận dạng(AllowNull = Đúng);
  • tên(AllowNull = Đúng);
mFeature = InternalDataSources.TableIm.shop_feature.CreateObject(); mCharacteristic.id = Mã; mCharacteristic.name = Tên; mCharacteristic.Write();

Thực thi câu lệnh Viết() sẽ khiến trình xử lý sự kiện được gọi đầu tiên Trước khi ghi âm, sau đó việc ghi vật lý vào bảng nguồn bên ngoài được thực hiện ( CHÈN), thì trình xử lý sự kiện sẽ được gọi Khi ghi âm.

Bạn có thể thực hiện các thao tác sau với trường khóa của bảng nguồn bên ngoài. Nếu trường khóa có thể thay đổi được thì bạn “thủ công” đặt giá trị của nó trước khi viết. Nếu việc thay đổi trường khóa bị cấm, nền tảng sẽ độc lập nhận khóa trong CHÈN hoặc ngay sau đó. Bạn có thể can thiệp vào quá trình này bằng phương pháp SetLinkNew() trước khi ghi vật lý (trong trình xử lý sự kiện Trước khi ghi âm) hoặc ngay sau khi ghi vật lý (trong trình xử lý sự kiện Khi ghi âm).

Thay đổi dữ liệu

Khi dữ liệu thay đổi, giá trị của tất cả các trường trong bảng có Chỉ đọc = Sai.

MFeature = InternalDataSources.TableIm.shop_feature.FindByField("id",code); mObject = mCharacteristic.GetObject(); mObject.name = Tên; mObject.Write();

Nếu bạn chỉ cần ghi lại một số trường, bạn có thể chỉ định danh sách chúng trực tiếp từ ngôn ngữ tích hợp bằng các phương thức SetWritableFields()GetWrittenFields().

Xóa dữ liệu

Xóa dữ liệu sẽ xóa trực tiếp một hàng khỏi bảng cơ sở dữ liệu. Trong trường hợp này, việc tìm kiếm tham chiếu đến đối tượng bị xóa không được thực hiện. Nếu cần chức năng đó, bạn có thể tự lập trình nó trong trình xử lý sự kiện TrướcXóa().

MFeature = InternalDataSources.TableIm.shop_feature.FindByField("id",Code); mObject = mCharacteristic.GetObject(); mObject.Delete();

Giao dịch

Việc đọc dữ liệu từ các nguồn bên ngoài, như trước đây, được thực hiện bên ngoài giao dịch và khi ghi, nền tảng sẽ mở ra một giao dịch ngầm. Đồng thời, bạn có thể thực hiện cả đọc và ghi trong các giao dịch rõ ràng bằng các phương thức đối tượng Trình quản lý nguồn dữ liệu bên ngoài:

  • Bắt đầu giao dịch();
  • Cam kếtGiao dịch();
  • Hủy giao dịch().

Ổ khóa

  • Tự động;
  • Được quản lý;
  • Tự động và điều khiển.

cũng như thuộc tính bảng nguồn bên ngoài Mức độ cô lập giao dịch:

Ngoài ra, bạn có thể đặt mức khóa một cách độc lập trong phương thức Bắt đầu giao dịch().

Tôi đã thêm ví dụ vào bài viết tiêu chuẩn) Nếu có nhiều thời gian hơn, tôi sẽ thêm nhiều ví dụ hơn.