Duyệt qua một danh sách động. Truy vấn tùy chỉnh trong danh sách động

Trong quá trình hoàn thiện cấu hình, lập trình viên 1C nào cũng gặp phải danh sách động.
Danh sách động là một đối tượng giao diện được sử dụng để hiển thị các danh sách khác nhau của các đối tượng cơ sở dữ liệu hoặc dữ liệu phi đối tượng - các mục đăng ký.
Ví dụ: danh sách động được sử dụng để hiển thị danh sách các mục:

Để chứng minh khả năng của danh sách động, hãy tạo xử lý bên ngoài và thêm biểu mẫu chính. Hãy thêm một thuộc tính mới vào biểu mẫu với loại “Danh sách động”. Chúng ta hãy đi vào thuộc tính của nó và xem những gì ở đó.
Chúng tôi quan tâm đến thuộc tính "Yêu cầu tùy chỉnh". Kích hoạt nó sẽ cho chúng ta thấy tất cả các khả năng của một danh sách động. Chúng tôi sẽ có thể viết yêu cầu bằng cách sử dụng hầu hết tất cả các khả năng của ngôn ngữ truy vấn hệ thống 1C: Enterprise. Chọn hộp và nhấp vào liên kết “Mở”:

Theo mặc định, danh sách của chúng tôi sẽ hiển thị danh sách các mặt hàng có tổng số dư cho tất cả các kho. Để triển khai danh sách như vậy, hãy thêm truy vấn sau:


Là bảng chính, chúng tôi sẽ chọn “Directory.Nomenclature”, điều này sẽ cho phép chúng tôi làm việc với một danh sách động, cũng như với danh sách danh pháp - thêm, thay đổi, đánh dấu các thành phần thư mục để xóa. Ngoài ra, việc cài đặt bảng chính giúp có thể đọc dữ liệu một cách linh hoạt - điều này có nghĩa là việc lựa chọn sẽ được thực hiện theo từng phần nếu cần.
Tiếp theo chúng ta cần tạo các phần tử biểu mẫu cho danh sách của mình:

Nếu chúng tôi cố gắng chạy quá trình xử lý của mình ở dạng này, chúng tôi sẽ gặp lỗi:


Để loại bỏ nó, bạn cần đặt giá trị cho tham số “Thời kỳ”. Để thực hiện việc này, bạn có thể sử dụng phương thức “SetParameterValue” của bộ sưu tập “Tham số” của danh sách động. Phương thức này có hai tham số:
. "Tham số" - Loại: Chuỗi; DataCompositionParameter. Tên của tham số hoặc tham số thành phần dữ liệu có giá trị bạn muốn đặt;
. “Giá trị” - Loại: Tùy ý. Giá trị cần đặt.
Có thể được gọi trong trình xử lý “OnCreateOnServer” có dạng:

Bạn có thắc mắc hoặc cần sự trợ giúp từ chuyên gia tư vấn?


Chúng tôi sẽ cung cấp cho người dùng cơ hội thay đổi thời gian nhận số dư. Để thực hiện việc này, hãy thêm thuộc tính và thành phần biểu mẫu “Ngày” được liên kết với nó:


Trong trình xử lý “OnChange” của phần tử biểu mẫu “Date”, chúng tôi gọi phương thức “SetParameterValue”, chuyển giá trị của thuộc tính được liên kết làm giá trị. Theo cách tương tự, hãy thay đổi quy trình “Khi tạo trên máy chủ” của biểu mẫu. Vì phương thức này có sẵn trên máy khách nên không cần phải gọi máy chủ:


Bây giờ, khi ngày thay đổi, số dư sẽ được cập nhật tự động:




Giả sử rằng người dùng muốn xem số dư hiện tại hoặc số tiền thu được theo kế hoạch. Hãy xem xét một trong các lựa chọn thực hiện. Hãy thêm một thuộc tính biểu mẫu kiểu boolean và một công tắc liên quan:


Khi thay đổi giá trị của switch, chúng ta sẽ thay đổi nội dung của request. Để thực hiện việc này, chúng tôi sẽ sử dụng trình xử lý sự kiện “Đang thay đổi” cho phần tử biểu mẫu “Hiển thị số lượng khi nhận”. Chúng ta cần thay đổi thuộc tính “QueryText” của danh sách động tùy thuộc vào giá trị của thuộc tính. Vì thuộc tính này không có sẵn trên máy khách nên thủ tục máy chủ phải được gọi:


Kết quả của những thay đổi được thực hiện:



Nền tảng 1C:Enterprise 8.2 có thể hoạt động với nhiều bản ghi trong bảng cơ sở dữ liệu một cách linh hoạt, nghĩa là đọc dữ liệu theo từng phần. Trước đây trong các bài viết, chúng ta đã xem xét cơ chế của danh sách động và các phương pháp tối ưu hóa công việc với chúng.

Hôm nay chúng ta sẽ giải một bài toán không chuẩn cho danh sách động. Chúng ta sẽ cần tính tổng bằng cách sử dụng thuộc tính tài liệu “Số tiền” và hiển thị nó ở chân trang danh sách. Tương tự, tính giá trị trung bình cho trường "Xếp hạng" và cũng hiển thị giá trị đó ở chân trang của danh sách động. Việc tính toán các trường tổng phải tính đến lựa chọn do người dùng đặt trong cài đặt danh sách tài liệu.

Toàn bộ khó khăn nằm ở chỗ một danh sách động không nhận tất cả các mục cùng một lúc mà nhận chúng theo từng phần. Theo đó, chúng tôi không thể có được ngay bản tóm tắt tất cả các tài liệu tương ứng với lựa chọn hiện tại. Làm thế nào để tính tổng?

Thực hiện

Và vì vậy, hãy chuyển sang giải quyết vấn đề. Hãy bắt đầu với việc thay đổi biểu mẫu, sau đó chúng tôi sẽ mô tả thuật toán để lấy các giá trị cuối cùng.

Hình thức và giao diện

Trước tiên, hãy chuẩn bị một biểu mẫu tài liệu để hiển thị các trường kết quả. Để thực hiện việc này, chúng tôi sẽ thêm hai chi tiết chuỗi có dạng “Xếp hạng” và “Số lượng”.

Tổng giá trị của các tài liệu sẽ được ghi lại trong các chi tiết này.

Để hiển thị giá trị chi tiết ở chân trang của danh sách động, bạn phải bật tùy chọn tương ứng cho thành phần được liên kết của biểu mẫu danh sách (xem ảnh chụp màn hình sau).

Bây giờ bạn cần quyết định xem kết quả ở chân trang danh sách sẽ được cập nhật theo sự kiện nào. Để dễ phát triển, hãy thêm lệnh "Cập nhật" và thành phần biểu mẫu tương ứng vào bảng lệnh. Khi lệnh này được thực thi, tổng số sẽ được cập nhật.

Trong cấu hình thử nghiệm mà bạn có thể tải xuống từ liên kết ở cuối bài viết, tôi cũng đã thêm sự kiện cập nhật tóm tắt khi ghi tài liệu. Trong trường hợp này, cơ chế thông báo biểu mẫu được sử dụng. Chúng tôi sẽ không tập trung vào vấn đề này chi tiết hơn.

Thuật toán

Phần khó khăn nhất vẫn là - bạn cần lấy tổng giá trị. Hãy tiến hành như sau: chúng ta sẽ tạo một yêu cầu tới cơ sở dữ liệu để lấy các giá trị của các trường cuối cùng theo lựa chọn được đặt trong danh sách động. Điều đáng lưu ý là việc lựa chọn có thể có điều kiện phức tạp từ các nhóm.

Lưu ý: cài đặt cho danh sách động (xem ảnh chụp màn hình ở trên) dựa trên cơ chế của hệ thống tổng hợp dữ liệu (DCS). Theo đó, bạn có thể làm việc với chúng theo cách tương tự (thêm, thay đổi, đọc theo chương trình, v.v.).

Các giai đoạn hình thành yêu cầu để nhận được kết quả như sau:

1. Chúng tôi nhận được yêu cầu ban đầu về danh sách động.

Như chúng ta có thể thấy, yêu cầu chọn tất cả các chi tiết tài liệu. Để phức tạp hơn một chút, tôi đã thêm trường “Mức xếp hạng” của riêng mình, được tạo bởi cấu trúc “CHỌN”.

2. Chúng tôi tạo văn bản của các điều kiện yêu cầu (phần "WHERE") và thay thế nó vào yêu cầu ban đầu.

Chúng ta cần thêm điều kiện vào văn bản yêu cầu nguồn đã nhận theo lựa chọn danh sách động đã định cấu hình.

Quy trình, tùy thuộc vào loại phần tử lựa chọn được chuyển (nhóm hoặc phần tử lựa chọn), sẽ tạo ra văn bản điều kiện tương ứng. Tất cả các điều kiện trong nhóm được bao quanh bởi dấu ngoặc đơn và những điều kiện có trong nhóm cũng được bao quanh bởi dấu ngoặc đơn. Các điều kiện giữa các biểu thức phụ thuộc vào nhóm chính (điều kiện “AND” được đặt giữa các phần tử trên cùng trong hệ thống phân cấp).

Nếu một phần tử có bộ cờ sử dụng (thuộc tính "Cách sử dụng"), thì phần tử đó sẽ được xử lý. Văn bản được tạo ra cũng phụ thuộc vào điều kiện so sánh (Bằng, không bằng, trong danh sách, v.v.). Có thể thấy sự phụ thuộc của văn bản điều kiện được tạo vào loại so sánh trong hàm sau.

Theo tôi, một chức năng thú vị khác là “GetFieldTextByView”. Nó là cần thiết để thay thế các trường được hình thành bởi các biểu thức ngôn ngữ truy vấn vào các điều kiện truy vấn. Ở trên, tôi đã thêm trường “Mức xếp hạng” vào yêu cầu ban đầu. Nếu người dùng sử dụng nó trong lựa chọn thì toàn bộ biểu thức phải được thay thế vào điều kiện truy vấn. Hàm này lấy văn bản trường từ yêu cầu dựa trên cách trình bày của nó. Đối với các trường phức tạp như vậy, nó sẽ trả về toàn bộ văn bản của biểu thức.

Để biết thêm chi tiết về thuật toán, xem cấu hình thử nghiệm kèm theo bài viết. Dưới đây là ảnh chụp màn hình cài đặt lựa chọn và các điều kiện yêu cầu được tạo cho chúng.

Văn bản điều kiện được tạo sẽ được thêm vào yêu cầu danh sách động ban đầu. Kết quả của truy vấn được đặt trong một bảng tạm thời.

3. Chúng tôi đặt truy vấn đầu tiên vào một bảng tạm thời và thực hiện nhóm theo các trường tóm tắt với các hàm tổng hợp cần thiết.

Hãy để tôi nhắc bạn rằng chúng ta cần lấy giá trị trung bình cho trường “Xếp hạng” và tổng số tiền cho trường “Số tiền”. Chúng tôi đã tạo một yêu cầu có tính đến các lựa chọn; tất cả những gì còn lại là tính tổng giá trị. Điều này được thực hiện với yêu cầu sau:

Sau khi thực hiện yêu cầu, chúng tôi xử lý kết quả thu được, trả lại cho khách hàng và ghi vào chi tiết biểu mẫu mà chúng tôi đã tạo trước đó. Cuối cùng, chúng tôi nhận được kết quả hiển thị ở chân trang của danh sách động (xem ảnh chụp màn hình đầu tiên trong bài viết).

Tính tối ưu của giải pháp

Nói chung, cách tiếp cận này có thể có tác động tiêu cực đến hiệu suất. Ví dụ: nếu chương trình tính tổng mà không có lựa chọn cố định trong danh sách động thì số lượng bản ghi được chọn có thể rất lớn (ví dụ: trong vài năm). Do đó, mỗi lần cập nhật kết quả có thể kéo dài hàng chục (!!!) giây. Vì vậy, việc tính toán kết quả chỉ có ý nghĩa nếu việc lựa chọn đã được thiết lập. Tôi đặt các điều kiện này trong cấu hình thử nghiệm.

Ngoài ra, chúng tôi chỉ có thể tính tổng và yêu cầu ở phía máy chủ. Do đó, bạn cần phải tiếp cận máy chủ một cách nghiêm túc vì quy trình cập nhật tổng số có thể được thực hiện rất thường xuyên. Hãy tưởng tượng một nhật ký biên lai trên máy tính tiền trong một tổ chức thương mại, nơi có thể nhập tối đa 5 biên lai mỗi phút và tối đa 300 biên lai mỗi giờ. Mỗi lần một tài liệu được viết, tổng số sẽ được cập nhật. Vì vậy, sẽ là hợp lý nếu giảm lưu lượng truyền bằng cách sử dụng các thủ tục ngoài ngữ cảnh.

Ảnh chụp màn hình sau đây hiển thị mã chương trình để gọi hàm máy chủ ngoài ngữ cảnh trả về tổng số.

Tham số đầu tiên chuyển qua lựa chọn danh sách động, tham số thứ hai là cấu trúc kiểu “SelectionFieldNameSelectionFieldValueType”. Xin lưu ý rằng tham số đầu tiên trong hàm được lấy dưới dạng giá trị của chính nó. Tôi không thể nói chính xác lý do tại sao, nhưng nếu bạn chuyển lựa chọn dưới dạng liên kết, nền tảng sẽ đưa ra lỗi cho biết rằng lựa chọn không thể thay đổi. Lỗi chỉ được khắc phục bằng cách này.->

Lưu ý: việc sử dụng các quy trình ngoài ngữ cảnh cho phép bạn giảm kích thước lưu lượng được truyền đi nhiều lần vì dữ liệu biểu mẫu không được truyền đến máy chủ, không giống như các quy trình máy chủ phân biệt ngữ cảnh (chỉ thị ("&OnServer").

Phần kết luận

Để kết luận, tôi sẽ nói rằng cách tiếp cận tính tổng trong danh sách động này là không chính xác theo quan điểm của phương pháp phát triển. Sẽ là chính xác nếu lấy tổng số bằng sổ đăng ký. Ví dụ, trong sổ nhật ký séc, một lần nữa, chúng ta có thể lấy số tiền trong sổ ghi tiền hiện tại từ các chứng từ hoặc từ sổ ghi tích lũy tương ứng.

Ngoài ra, việc sử dụng sổ ghi tích lũy sẽ cho phép bạn tính tổng mà không cần tính đến việc lựa chọn, vì hệ thống hoạt động tối ưu với tổng đã được tính cho các tháng trước.

Tuy nhiên, phương pháp được mô tả trong bài viết được áp dụng khi giải quyết vấn đề.

Các tập tin để tải về:

Cuối cùng, giấc mơ của mọi đứa trẻ bảy tuổi đã trở thành hiện thực. Tần suất người dùng chương trình 7.7 yêu cầu lựa chọn các mục bình thường. Để bạn có thể xem số dư, giá cả và đặt bộ lọc. Chúng tôi phải nghĩ ra nhiều thủ thuật khác nhau, bao gồm cả việc viết các thành phần bên ngoài. Trong 1C 8.2, danh sách động xuất hiện. Tôi đề xuất xem xét nó là gì và họ có thể cung cấp cho chúng tôi những gì trong 1C 8.3.

Hãy lấy cấu hình thử nghiệm nhất định của 1C làm cơ sở: “Kế toán doanh nghiệp 3.0”. Chúng tôi sẽ không thực hiện lựa chọn ngay bây giờ, chúng tôi sẽ chỉ thêm một biểu mẫu lựa chọn khác vào thư mục “Danh pháp” và tạm thời đặt nó làm biểu mẫu chính:

Khi được tạo, theo mặc định, hệ thống sẽ thêm trường bảng thuộc loại “Danh sách động” vào biểu mẫu.

Chúng ta hãy đi vào thuộc tính của nó và xem những gì ở đó.

Trước hết, chúng tôi quan tâm đến hộp kiểm “Yêu cầu tùy chỉnh”. Điều này sẽ tiết lộ cho chúng ta tất cả những lợi thế của danh sách động. Chúng ta sẽ có cơ hội viết yêu cầu của riêng mình với các tham số. Chọn hộp và nhấp vào liên kết “Mở”:

Một cửa sổ sẽ mở ra với mã hoàn chỉnh ở định dạng . Hiện tại, tất cả các trường của thư mục “Danh pháp” chỉ được liệt kê ở đó.

Nhận miễn phí 267 bài học video trên 1C:

Như bạn có thể thấy, có một nút gọi “ ” và một hộp kiểm cho phép thay đổi nội dung của danh sách một cách linh hoạt. Tức là khi người dùng khác thay đổi thứ gì đó trong thư mục thì nó cũng sẽ thay đổi trong danh sách của chúng ta. Ngoài ra, còn có tab “Cài đặt”, nhưng chúng ta sẽ đề cập đến tab đó sau.

Truy vấn tùy chỉnh trong danh sách động

Đầu tiên, hãy tạo yêu cầu chúng ta cần với số dư và giá cả. Như thế:

Tab “Cài đặt”

Và bây giờ là phần hay nhất! Chuyển đến tab “Cài đặt”. Và chúng tôi thấy ngay rằng trên tab đầu tiên, chúng tôi có thể thực hiện bất kỳ lựa chọn nào cho bất kỳ trường nào trong yêu cầu:

Lập trình thiết lập tham số truy vấn trong danh sách động 1C 8.3

Đừng quên rằng chúng tôi có hai tham số trong yêu cầu: “Thời gian” và “Loại giá”. Chúng ta phải chuyển chúng vào yêu cầu, nếu không sẽ xảy ra lỗi.

Hãy viết các tham số này trong tham số biểu mẫu và thêm các dòng sau vào mô-đun biểu mẫu:

Danh sách &OnServerProcedureWhenCreatingOnServer(Thất bại, Xử lý tiêu chuẩn). Tùy chọn. SetParameterValue("Giai đoạn", Parameters. Date) ; Danh sách. Tùy chọn. SetParameterValue("PriceType", Parameters.PriceType) ; EndProcedures Trang chủ Ghi chú từ Qua tấm gương

21/04/2014 Nhận dữ liệu danh sách động

Được triển khai trong phiên bản 8.3.6.1977.

Chúng tôi đã triển khai khả năng lấy dữ liệu được hiển thị bằng danh sách động một cách dễ dàng và thuận tiện.

Bạn có thể cần dữ liệu danh sách động để in nó ở dạng không chuẩn, “cụ thể”. Hoặc để thực hiện một số hành động nhất định với họ. Ví dụ: gửi thư cho tất cả các nhà thầu mà bạn đã chọn trong danh sách dựa trên các tiêu chí nhất định.

Ngoài ra, có một số tác vụ mà người dùng ngoài danh sách các phần tử còn muốn xem dữ liệu tóm tắt liên quan đến danh sách này. Ví dụ: sau khi chọn sản phẩm của một nhóm sản phẩm nhất định và một nhà cung cấp nhất định, anh ta ngay lập tức muốn xem tổng số sản phẩm đó trong cơ sở dữ liệu.

Bản thân danh sách động không thể cung cấp cho bạn thông tin này. Mục đích của danh sách động là cung cấp khả năng xem nhanh lượng lớn dữ liệu. Do đó, nó đọc dữ liệu theo từng khối cần thiết để hiển thị trên một hoặc hai màn hình. Và “không biết gì cả”, chẳng hạn như về tổng lượng dữ liệu mà anh ta phải đếm.

Nói chung, để có được thông tin bổ sung mà người dùng muốn, bạn cần chạy truy vấn cơ sở dữ liệu. Hoàn toàn giống với cái được sử dụng trong danh sách động.

Bạn đã từng có thể làm được điều này. Nhưng nó không phải lúc nào cũng dễ dàng. Rốt cuộc, ngoài văn bản của yêu cầu ban đầu mà danh sách động hoạt động, bạn cần biết tất cả các lựa chọn, sắp xếp và các tham số khác mà người dùng tương tác đặt trong bảng hiển thị dữ liệu.

Bây giờ vấn đề này có thể được giải quyết một cách đơn giản. Bảng danh sách động hiện có hai phương thức mới:

  • GetExecutableDataCompositionSchema();
  • GetExecutableDataCompositionSettings().

Do đó, bạn sẽ có được sơ đồ bố cục dữ liệu và quan trọng nhất là tất cả các cài đặt của nó, nhờ đó người dùng sẽ nhìn thấy danh sách chính xác như vậy. Tất cả những gì bạn phải làm là soạn bố cục theo chương trình và hiển thị nó trong tập hợp các giá trị (để xử lý chương trình) hoặc trong tài liệu bảng tính (để hiển thị):

Kết quả bạn sẽ nhận được một cấu trúc (hoặc báo cáo) chứa các cột và hàng hiển thị trong bảng danh sách động.

Điểm quan trọng là bố cục và cài đặt bạn nhận được từ bảng danh sách động có tính đến khả năng hiển thị của các cột và tìm kiếm được áp dụng, cùng với những thứ khác. Vì các cài đặt được lấy riêng biệt, bạn có thể thay đổi thành phần của các trường cho mục đích riêng của mình và lấy, chẳng hạn như tất cả các cột của danh sách chứ không chỉ những cột mà người dùng hiển thị.

Khi xuất ra tài liệu bảng tính, còn có một khoảnh khắc thú vị hơn. Nhìn chung, giao diện của báo cáo sẽ tương ứng với giao diện của bảng danh sách động tại thời điểm nhận được lược đồ và cài đặt. Bao gồm cả thiết kế có điều kiện của bảng. Bạn sẽ chỉ cần một số hành động bổ sung nếu muốn chuyển thiết kế có điều kiện của biểu mẫu sang báo cáo.