Confused with DocumentList and TableBox

The 1C:Enterprise developers forum

#1
People who like this:0Yes/0No
Active user
Rating: 2
Joined: Jul 3, 2013
Company: TRIAX

Tôi là Hoàng Minh Trí ở công ty TriAX Việt Nam
Tôi đang phát triển 1 dự án phần mềm kế toán cho 1 doanh nghiệp dựa trên phiên bản 1C-Small Bussines 8.2.15 ứng dụng thường
Tôi gập 1 vấn đề về sự thiếu linh động của 1C đối với controls TableBox và DocumentList:
- Trong các form Danh sách của chứng từ thường thiết kế 2 tablebox:
    + 1 TableBox Chung gắn với DocumentList của Loại chứng từ đó
    + 1 TableBox Chi tiết gắn với dữ liệu Phần bảng của từng Chứng từ
- Trên thanh công cụ của form có đặt các controls cho phép người dùng lọc các
   chứng từ với các tiêu chí lọc dựa trên các cột ở TableBox-Chung.
-> Vấn đề ở đây là: Dùng DocumentList chỉ cho phép viết code (Post) hoặc (Unpost) đối với từng (1) chứng từ đang được select trên TableBox-Chung. Mà trong thực tiễn triển khai người dùng luôn cần lọc ra 1 danh sách các chứng từ theo các tiêu chí và cho phép duyệt (Post) hoặc Xét lại (Unpost) tất cả các chứng từ đã lọc ra, thay vì phải ấn mỏi tay post/unpost từng chứng từ 1.
=> Khi code phát triển TableBox gắn với DocumentList của 1C không trả về danh sách các chứng từ (hoặc ref) của List các chứng từ lọc được để xử lý.Nên tôi đành phải thử sang cách khác.

 Tôi cố gắng lấy về thuộc tính filter của controls TableBox-Chung. và sử dụng truy vấn để đưa ra một ValueTable chứa danh sách các ref của chứng từ và các field select ra là các cột được biểu dễn trên TableBox-Chung. Sau đó tôi có ý định đưa ra form cho người dùng tích chọn 1 số chứng từ hoặc ấn 1 nút tích chọn tất cả các chứng từ đã được truy vấn đưa ra để post hoặc unpost. Nhưng thật đáng buồn và ngớ ngẩn thay khi tôi sử dụng Controls TableBox và gắn dữ liệu với ValueTable kết quả truy vấn thì TableBox không thể hiện kết quả dữ liệu trong ValueTable (chỉ thể hiện khi thiết kế cố định sẵn các cột trùng với tên field truy vấn ra). Điều gì xảy ra với việc add cột động vào controls Tablebox của 1C vậy; hay 1C thực sự chỉ cho phép view ra dữ liệu với các cột được cố định sẵn trên Contols TableBox trong giai đoạn thiết kế cấu hình mà không thể đưa ra dữ liệu đối với các cột động được add vào trong lúc thực thi. Nếu điều này là sự thật thì thật là ngớ ngấn cho 1 công cụ xây dựng úng dụng nhanh và mạnh như 1C! :o

Edited: Hoang Minh Tri - Oct 29, 2014 11:44 PM (...)
 
#2
People who like this:0Yes/0No
Just came
Rating: 1
Joined: Sep 5, 2014
Company:

Hi Trix!
I do not understand your information. Please give me enough and clear information or code example.  8)

Edited: Huong Tram - Oct 21, 2014 03:15 AM
 
#3
People who like this:0Yes/0No
Just came
Rating: 0
Joined: Nov 29, 2012
Company: 1-V System JSC (1VS)

Bạn Hoàng Minh Trí,

Vấn đề thực sự không phức tạp đâu, lần mò một hồi là ra thôi mà.

Từ giờ đến mai nếu bạn chưa lần ra, tôi sẽ chỉ ra cách  8)

 
#4
People who like this:0Yes/0No
Active user
Rating: 2
Joined: Jul 3, 2013
Company: TRIAX

Hi Huong Tram!
On ListForm of Document, I add a button name "AppoveAll".
On event "FormActionsApproveAll": I call a DataProcessors including one Form name "FormMain", DocFiler-Attributes type Filter, DocumentName-Attributes type String, ColumnsList-Attributes contain list of columns presentation on ListForm; On This DataProcessors, I design a TableBox control with dataName "DocumentListEx" type ValueTable (blank cloumns).
On event FormMain - OnOpen(), I code:

Qs= New Query;
OrgConditon="";
If PostKind = Enums.LkTinhTrangChungTu.Approved Then
ThisForm.Caption="Bộ xử lý Duyệt nhiều chứng từ cùng lúc (chỉ xử lý những phiếu chưa duyệt)";
OrgConditon="a.Posted";
ElsIf PostKind = Enums.LkTinhTrangChungTu.InProcess Then
ThisForm.Caption="Bộ xử lý Xét lại nhiều chứng từ cùng lúc (chỉ xử lý những phiếu đã duyệt)";
OrgConditon="a.Posted=FALSE";
ElsIf PostKind = Enums.LkTinhTrangChungTu.Closed Then
ThisForm.Caption="Bộ xử lý Đóng khóa nhiều chứng từ cùng lúc (chỉ xử lý những phiếu đã duyệt và đang mở)";
OrgConditon="a.Posted";
ElsIf PostKind = Enums.LkTinhTrangChungTu.Open Then
ThisForm.Caption="Bộ xử lý Mở lại nhiều chứng từ cùng lúc (chỉ xử lý những phiếu đã duyệt và đang đóng)";
OrgConditon="a.Posted";
EndIf;

StrCols="";
For i=0 to ColumnsList.Count()-1 Do
ColName = ColumnsList.Get(i).Value;
ColHeader = ColumnsList.Get(i).Presentation;
StrCols = StrCols +",a."+ColName;

DocumentListEx.Columns.Add(ColName);
cColumn = Controls.DocumentListEx.Columns.Add();
cColumn.Name = ColName;
cColumn.HeaderText = ColHeader;
cColumn.SetControl(Type("TextBox"));
EndDo;  

StrSQL = "SEL ECT
| a.Ref " ;
StrSQL = StrSQL + StrCols;
StrSQL = StrSQL +" FR OM
| Document.ChứngTừ AS a
| WH ERE ";
StrSQL = StrSQL + OrgConditon;

StrPara = "";
For each sFilter in DocListFilter Do
If sFilter.Use Then
if sFilter.ComparisonType = "Bằng" or sFilter.ComparisonType = "=" then
StrPara = StrPara + " AND a."+sFilter.Name+" = &"+sFilter.Name;
Qs.SetParameter(sFilter.Name,sFilter.Value);
elsif sFilter.ComparisonType = "Khác" or sFilter.ComparisonType = "<>" then
StrPara = StrPara + " AND a."+sFilter.Name+" <> &"+sFilter.Name;
Qs.SetParameter(sFilter.Name,sFilter.Value);
elsif sFilter.ComparisonType = "Nhỏ hơn" or sFilter.ComparisonType = "<" then
StrPara = StrPara + " AND a."+sFilter.Name+" < &"+sFilter.Name;
Qs.SetParameter(sFilter.Name,sFilter.Value);
elsif sFilter.ComparisonType = "Nhỏ hơn hoặc bằng" or sFilter.ComparisonType = "<=" then
StrPara = StrPara + " AND a."+sFilter.Name+" <= &"+sFilter.Name;
Qs.SetParameter(sFilter.Name,sFilter.Value);
elsif sFilter.ComparisonType = "Lớn hơn" or sFilter.ComparisonType = ">" then
StrPara = StrPara + " AND a."+sFilter.Name+" > &"+sFilter.Name;                                                          
Qs.SetParameter(sFilter.Name,sFilter.Value);
elsif sFilter.ComparisonType = "Lớn hơn hoặc bằng" or sFilter.ComparisonType = "<=" then
StrPara = StrPara + " AND a."+sFilter.Name+" >= &"+sFilter.Name;
Qs.SetParameter(sFilter.Name,sFilter.Value);
elsif find(sFilter.ComparisonType,"(>, <)") then
StrPara = StrPara + " AND a."+sFilter.Name+" > &"+sFilter.Name+"F AND a."+sFilter.Name+" < &"+sFilter.Name+"T";
Qs.SetParameter(sFilter.Name+"F",sFilter.ValueFrom);
Qs.SetParameter(sFilter.Name+"T",sFilter.ValueTo);
elsif find(sFilter.ComparisonType,"(>=, <=)") then
StrPara = StrPara + " AND a."+sFilter.Name+" >= &"+sFilter.Name+"F AND a."+sFilter.Name+" <= &"+sFilter.Name+"T";
Qs.SetParameter(sFilter.Name+"F",sFilter.ValueFrom);
Qs.SetParameter(sFilter.Name+"T",sFilter.ValueTo);
elsif find(sFilter.ComparisonType,"(>=, <)") then
StrPara = StrPara + " AND a."+sFilter.Name+" >= &"+sFilter.Name+"F AND a."+sFilter.Name+" < &"+sFilter.Name+"T";
Qs.SetParameter(sFilter.Name+"F",sFilter.ValueFrom);
Qs.SetParameter(sFilter.Name+"T",sFilter.ValueTo);
elsif find(sFilter.ComparisonType,"(>, <=)") then
StrPara = StrPara + " AND a."+sFilter.Name+" > &"+sFilter.Name+"F AND a."+sFilter.Name+" <= &"+sFilter.Name+"T";
Qs.SetParameter(sFilter.Name+"F",sFilter.ValueFr om);
Qs.SetParameter(sFilter.Name+"T",sFilter.ValueTo);
elsif sFilter.ComparisonType = "Có chứa" then
StrPara = StrPara + " AND a."+sFilter.Name+" LIKE %&"+sFilter.Name+"%";
Qs.SetParameter(sFilter.Name,sFilter.Value);
elsif sFilter.ComparisonType = "Không chứa" then
StrPara = StrPara + " AND a."+sFilter.Name+" NOT LIKE %&"+sFilter.Name+"%";
Qs.SetParameter(sFilter.Name,sFilter.Value);
elsif sFilter.ComparisonType = "Trong danh sách" or sFilter.ComparisonType = "Trong nhóm từ danh sách" then  
StrPara = StrPara + " AND a."+sFilter.Name+" IN (&"+sFilter.Name+")";
Qs.SetParameter(sFilter.Name,sFilter.Value);
elsif sFilter.ComparisonType = "không trong danh sách" or sFilter.ComparisonType = "Không trong nhóm từ danh sách" then  
StrPara = StrPara + " AND a."+sFilter.Name+" NOT IN (&"+sFilter.Name+")";
Qs.SetParameter(sFilter.Name,sFilter.Value);
elsif sFilter.ComparisonType = "Trong nhóm" then
   StrPara = StrPara + " AND a."+sFilter.Name+" LIKE &"+sFilter.Name;
Qs.SetParameter(sFilter.Name,sFilter.Value);
elsif find(sFilter.ComparisonType,"%") then
StrPara = StrPara + " AND a."+sFilter.Name+" LIKE %&"+sFilter.Name;
Qs.SetParameter(sFilter.Name,sFilter.Value);
endif;

EndIf;
EndDo;
StrSQL = StrSQL + StrPara;
StrSQL = StrReplace(StrSQL, "ChứngTừ", DocumentName);

Qs.Text = StrSQL;
   KQ = Qs.Execute().Unload();
For i=1 To KQ .Count() Do
   DocumentListEx.Add();
EndDo;

For each Column In KQ.Columns Do
   ColumnValue = KQ.UnloadColumn(Column.Name);
   DocumentListEx.LoadColumn(ColumnValue, Column.Name);
EndDo;
Controls.DocumentListEx.RefreshRows();
---------------
On runtime
Result Query return a ValueTable with data as List of TableBox-DocumentList with Filter used on ListForm.
FormMain show but Controls.DocumentListEx is blank, no any row data show on tablebox!

 
#5
People who like this:0Yes/0No
Active user
Rating: 4
Joined: Mar 14, 2012
Company: GIMASYS

Không phải phức tạp thế đâu Trí ơi, 1C cho phép chọn một hoặc nhiều trong DCL, cùng một biến có thể chứa một hoặc một mảng chứa ref của các chứng từ mà từ đó mình chọn để thao tác làm việc với chứng từ, có hơn 1 cách để làm việc này.

 
#6
People who like this:0Yes/0No
Active user
Rating: 2
Joined: Jul 3, 2013
Company: TRIAX

Hi anh Thi!
Theo em hiểu cách của anh có phải là đặt thuộc tính SelectionMode của tablebox = nhiều. Sau đó trong code lấy giá trị SelectedRows của tablebox để xử lý đúng không.
Nếu là phương án này thì thực sự vẫn chưa giải quyết được vấn đề bản chất người dùng vẫn phải giữ Shift và tích chọn từng row 1, rất bất tiện.
- Vì bài toán đặt ra là cần lấy được Danh sách các chứng từ thỏa mãn tiêu chí lọc (Filter) mà user sử dụng khi chọn (Lọc& sắp xếp) trên thanh Commandbar để xử lý post/unpost (sau khi filter Cotrol TableBox trên ListForm chỉ hiện thị mà không có thuộc tính nào trả về danh sách đó).
- Thực ra em có thể tạo và gọi ra Bộ xử lý với form có thiết kế TableBox cố định các columns được view trên ListForm, sau đó truy vấn dựa theo filter mà đưa ra danh sách... sau đó xử lý. Nhưng như thế với mỗi 1 chứng từ em lại phải lại thiết kế 1 cái tablebox đấy là chưa kể mỗi lần thay đổi cột view trong listform mình lại phải thiết kế lại TableBox trên form bộ xử lý. Mà rõ ràng em thấy 1C cho phép thiết kế 1 Table trống gắn với 1 valuetable sau đó trong quá trình chạy add cột add row dữ liệu vào được; Nhưng vấn đề em không hiểu là khi add động các columns như thế mà tại sao bug thì vẫn thấy valuetable vẫn có dữ liệu,trong khi tablebox view ra vẫn đầy đủ các cột được add vào mỗi tội không có dữ liệu hiện thị. (Bài toán xử lý này áp dụng không chỉ trong trường hợp để post hay unpost nhiều chứng từ mà cho cả các vấn đề khác lên em mới code vậy)

 
#7
People who like this:0Yes/0No
Just came
Rating: 0
Joined: Oct 21, 2014
Company:

Chào Hoàng Minh Trí.

Anh có thể xem ví dụ ở bộ xử lý này. Tải về tại đây

 
#8
People who like this:0Yes/0No
Just came
Rating: 0
Joined: Sep 18, 2012
Company:

Chào Hoàng Minh Trí,

- danh sách chứng từ sau khi lọc bạn có thể ấn tổ hợp phím Ctrl + A, sau đó Post hoặc Unpost;

- Listform trong 1C sử dụng kiểu dữ liệu DynamicList, trong Thuộc tính của DynamicList có thuộc tính 'Truy vấn tùy ý' khi tích vào đây sẽ mở ra cửa sổ Truy vấn để bạn có thể lấy dữ liệu cho DynamicList.

 
#9
People who like this:0Yes/0No
Active user
Rating: 2
Joined: Jul 3, 2013
Company: TRIAX

Hi anh Thằng.
Em mò mãi vẫn không tìm cách lấy về được DocumentList tương ướng với các tiêu chí lọc khi user sử dụng các công cụ Filter trên CommandBar của ListForm. Theo em hiểu cơ chế của 1C với TableBoxControl có kiểu dữ liệu là DocumentList, sau khi user sử dụng các action filter gắn sãn trên Form, Hộp bảng chỉ tải và biễu diễn 1 phần danh sách lọc được vừa vặn với số dòng được vẽ vào hộp bảng trên form (để tối giản bộ nhớ và load dữ liệu được nhanh hơn) chứ bản chất không có thuộc tính nào chứa đẩy đủ danh sách các DocumentRef tương ứng với các tiêu chí lọc đúng không anh.

 
#10
People who like this:0Yes/0No
Just came
Rating: 0
Joined: Nov 29, 2012
Company: 1-V System JSC (1VS)

Hoàng Minh Trí,

DynamicList dùng để trình bày dữ liệu dưới dạng bảng và thực hiện tương tác (thao tác trực tiếp) trên giao diện người sử dụng.

Không thể lấy ra bảng dữ liệu bằng mã nguồn từ DynamicList, bởi vì nền tảng không cho phép lấy ra các dữ liệu hiển thị để xử lý, đề phòng tình huống là trong thời gian xử lý các dòng dữ liệu thì có ai đó lại thêm mới các dòng dữ liệu khác (DynamicList là danh sách động, nên nó luôn cập nhật dữ liệu từ cơ sở dữ liệu).

Nếu muốn lấy ra dữ liệu hiển thị đưới dạng bảng trên giao diện, cần sử dụng ValueTable hoặc ValueList.

 
#11
People who like this:0Yes/0No
Active user
Rating: 2
Joined: Jul 3, 2013
Company: TRIAX

Thanks Dang Tri!
Mình quên mất không nghĩ đến tổ hợp phím Ctrl + A, khi đã cho phép SelectionMode ở chế độ nhiều.
Đấy có lẽ là phương án hợp lý nhất: sau khi user sử dụng filter, ấn Ctrl+A để chọn all hoặc dữ Shift click chọn các chứng từ cần duyệt... nhấn nút mã nguồn ta chỉ việc lấy về SelectedRows để xử lý. :)

 
#12
People who like this:0Yes/0No
Timofey Bugaevsky
Guest

Joined:
Company:

Dear colleagues!

Please use English language on 1C:Developer Network forums. This allows you to receive an answer from the wider community of 1C professionals. The rules of our forums are made to let most community members to interact with maximum comfort.

 
Subscribe
Users browsing this topic (guests: 2, registered: 0, hidden: 0)
Be the first to know tips & tricks on business application development!

A confirmation e-mail has been sent to the e-mail address you provided .

Click the link in the e-mail to confirm and activate the subscription.