Nhiệm vụ điều tiết phổ quát. Các công việc được lập lịch và ở chế độ nền Lỗi khi thực hiện công việc ở chế độ nền để kiểm tra việc dỡ tải

Câu hỏi: Quá trình công việc nền bị lỗi...


Chào buổi chiều mọi người và chúc mọi người một tuần tốt lành!)
Kế toán doanh nghiệp, phiên bản 3.0 (3.0.46.11).
Nền tảng 8.3.9.2033.
Khi đăng tài liệu vào nhóm, xảy ra lỗi “Quy trình công việc nền đã chấm dứt bất thường”. Không có lý do nào được đưa ra...
Khởi động lại máy chủ SQL, máy chủ 1C (bạn chưa biết) cũng không giúp ích gì... Có lẽ ai đó đã gặp phải vấn đề tương tự??? Thậm chí rất khó để nói khi nào lỗi này xuất hiện vì chúng tôi đã không sử dụng thực thi nhóm (đóng tháng) trong một thời gian dài...

Trả lời:()() Chào buổi chiều lần nữa) Mình mở tạp chí công nghệ và tìm thấy những điều thú vị này (có thể bạn biết vấn đề là gì?):
Một nỗ lực đã được thực hiện để thực hiện thao tác trên một đối tượng không phải là ổ cắm...
Quá trình kết thúc. Cuộc gọi đi bị từ chối...
Không tìm thấy máy chủ nào lưu trữ dịch vụ...

Câu hỏi: Công việc nền


Nền tảng 1C: Enterprise 8.3 (8.3.9.2170), xác nhận BP 3.0.
Cấu hình cấu hình tích hợp thông qua các nguồn dữ liệu bên ngoài (loại DBMS - OracleDatabase). Một số bảng đã được thêm vào để tải dữ liệu chính và giao dịch. Bởi vì Có rất nhiều dữ liệu nên người ta quyết định tải xuống hàng loạt thông qua các tác vụ nền. Kích thước phần là 100.000, kích thước lô là 10.000, số lượng giao dịch trong tài liệu là 1000, số lượng công việc chạy nền đồng thời là 8.
Tôi khởi chạy, tải, mọi thứ đều ổn. Nhưng nếu mình đeo vào ban đêm thì có cảm giác như 1c chuyển sang chế độ ngủ, tức là. sau một thời gian, như nhật ký hiển thị, các công việc nền được bắt đầu nhưng chưa hoàn thành. Kết quả là các nhiệm vụ bắt đầu lúc 12 giờ đêm và hoàn thành lúc 8 giờ sáng (khi tôi di chuyển chuột) và sau đó chúng tiếp tục được thực hiện ở chế độ bình thường. Tôi đã chạy nó trên cả máy khách mỏng và dày. Có một cài đặt trong các tham số - thời gian chuyển sang chế độ ngủ trong phiên thụ động là 1200, nhưng điều này không chỉ áp dụng cho máy khách tối thiểu và đây có phải là một vấn đề không? Tôi không muốn tắt tính năng này, bởi vì... người dùng không thoát khỏi chương trình, để họ ngủ quên. Có ai gặp phải một vấn đề tương tự? Bạn đã quyết định như thế nào?

Trả lời:

Không có khả năng như vậy.

Việc chạy một công việc nền và đợi nó hoàn thành có ích gì?
để không tạo quá 8 tác vụ nền?

Kéo "người quản lý" các công việc nền sang phía máy chủ và để nó kiểm soát....

Tôi đã chạy 40-50 tác vụ nền trên Pentuim D840 - chuyến bay diễn ra bình thường, sau đó bị giới hạn bởi bộ xử lý/bộ nhớ.

Câu hỏi: Cách chuyển tập tin sang tác vụ nền


Nền tảng 8.3.6.2152
Bạn cần chuyển tệp từ UV sang tác vụ nền để xử lý tiếp theo.
Đã làm điều này:
&Trên máy khách
Thủ tục Command1(Command) FileDD = Dữ liệu nhị phân mới (Tên tệp); StorageAddressForBackground = PlaceInTemporaryStorage(FileDD, UniqueIdentifier); Bắt đầu UploadLoadOnServer(StorageAddressForBackground) EndProcedure &OnServer Chức năng StartUploadLoadOnServer(StorageAddressForBackground) Tham số phương thức = Mảng mới; MethodParameters.Add(StorageAddressForBackground); Job = BackgroundTasks.Run("MyGeneralModule.MyBackground", MethodParameters); Chức năng cuối cùng
Trong mô-đun chung:

Quy trình MyBackground(StorageAddress) Xuất FileDD = GetFromTemporaryStorage(StorageAddress); Nếu TypeValue(FileDD) = Type("BinaryData") thì Nhật ký đăng ký Nhật ký đăng ký("Gỡ lỗi","Không có DD"); Hết Nếu ; Kết thúc quy trình Tôi đã thử cách này: PlacedFiles = New Array; PlacedFiles.Add(NewDescriptionofTransferFile(FileName)); PlacedFiles = Mảng mới; Nếu KHÔNG PlaceFiles(PlaceFiles, PlaceFiles, False, UniqueIdentifier) ​​​​Sau đó Return ; Hết Nếu ; StorageAddressForBackground = PlacedFiles.Storage; Tôi đã thử điều này: StorageAddressForBackground = PlaceInTemporaryStorage(Không xác định, UniqueIdentifier); PlaceFile(StorageAddressForBackground, FileName, Sai);
Nó được truyền bình thường từ nền sang máy khách thông qua bộ lưu trữ tạm thời, nhưng vì lý do nào đó nó không chuyển từ máy khách sang nền.

Trả lời: Nói chung, mọi thứ hóa ra khá đơn giản. Hóa ra là bạn có thể chuyển Dữ liệu nhị phân một cách ngu ngốc làm tham số cho công việc nền. Để những người nghiệp dư không có kỹ năng trích dẫn tài liệu tham khảo và nói với họ rằng “đây là cách nó được dự định”, mã hoạt động là:
&Trên máy khách
Quy trình Lệnh1 (Lệnh) Bắt đầu UploadLoadOnServer(Dữ liệu nhị phân mới (Tên tệp)) EndProcedure
&Tham số phương thức StartUploadLoadOnServer(DD) = Mảng mới; MethodParameters.Add(DD); Job = BackgroundTasks.Run("MyGeneralModule.MyBackground", MethodParameters); Thủ tục EndFunctions Xuất MyBackground(FileDD) Nếu TypeValue(FileDD) = Type("BinaryData") thì Nhật ký đăng ký("Gỡ lỗi","Có DD"); Nếu không thì Nhật ký đăng ký("Gỡ lỗi","Không có DD"); Kết thúc Nếu ; Kết thúc thủ tục

Câu hỏi: Chạy công việc nền theo người dùng mong muốn


Xin chào!
Có 1C:Enterprise 8.3 (8.3.11.2924), UT 11.3.4.93 máy khách - máy chủ.
Trong cấu hình này, các chuyển động trong sổ đăng ký "Thanh toán với khách hàng trên tài liệu" không được thực hiện tại thời điểm đăng tài liệu mà với nhiệm vụ thông thường "Thực hiện các chuyển động bị trì hoãn trong các thỏa thuận với khách hàng\nhà cung cấp".
Đồng thời, đôi khi tác vụ thông thường cũng phát sinh lỗi vì cố gắng thực hiện các động thái trong thời gian khép kín (Trước ngày cấm biên tập). Trong cài đặt của tác vụ thông thường, chúng tôi đã đăng ký một người dùng đặc biệt có ngày cấm được mở, sau đó mọi thứ bắt đầu hoạt động.
Tuy nhiên, cần phải đảm bảo rằng những chuyển động này trong sổ đăng ký được thực hiện tại thời điểm tài liệu được đăng chứ không phải khi công việc nền được bắt đầu theo lịch trình.
Nếu bạn chạy chính mã thực hiện tác vụ thông thường khi đăng tài liệu, thì lỗi tương tự sẽ xảy ra - khoảng thời gian sẽ bị đóng. Và nếu bạn chạy một tác vụ nền chạy cùng một mã tại thời điểm tài liệu được đăng theo chương trình thì nó sẽ gây ra lỗi tương tự, bởi vì khoảng thời gian đã kết thúc và công việc nền, được khởi chạy theo chương trình, được khởi chạy dưới tên của người dùng hiện tại và ngày cấm của anh ta sẽ kết thúc. Tuy nhiên, khi một công việc nền được khởi chạy theo một lịch trình có người dùng “đúng” được cài đặt trong bộ lập lịch, thì mọi thứ sẽ diễn ra suôn sẻ. Đây là cách thực hiện việc này theo chương trình, làm thế nào để chạy một tác vụ nền theo chương trình theo người dùng mong muốn "thông qua bộ lập lịch" như các tác vụ được lên lịch tiêu chuẩn, vui lòng cho tôi biết?

Trả lời:

Đây không phải là thứ được cấu hình cho nó sao?
Chắc đây là lỗi cấu hình

Lis2007 đã nói:

Xin chào! Đồng thời, đôi khi tác vụ thông thường phát sinh lỗi, bởi vì... cố gắng thực hiện các động thái trong thời gian khép kín (Trước ngày cấm biên tập). Trong cài đặt của tác vụ thông thường, chúng tôi đã đăng ký một người dùng đặc biệt có ngày cấm được mở, sau đó mọi thứ bắt đầu hoạt động

Bấm để mở rộng...

Câu hỏi: Gỡ lỗi công việc nền


Tác vụ nền đang chạy có lỗi. Tôi quyết định gỡ lỗi nó.
Tôi khởi chạy nó thông qua xử lý bên ngoài bằng một dòng:
BackgroundTasks.Run("MyModule.MyTask");
Chưa đạt đến điểm dừng trong mô-đun.
Cho phép gỡ lỗi trên máy chủ, kiểm tra gỡ lỗi, kết nối tự động, các công việc nền được bật. Còn vấn đề nào nữa không?

Trả lời: Trong các mô-đun thông thường, có một lệnh gọi đến các chức năng yêu cầu máy khách thay vì thực thi máy chủ. Tôi phải đặt chúng trong ngoặc #If Client Then. Nền tảng cũng hoạt động.

Hỏi: Lỗi khi thực hiện trao đổi


Chào buổi chiều. Hãy cho tôi biết nơi đào:
Tôi thực hiện trao đổi trong cơ sở dữ liệu kế toán. Khoảng ba chục tài liệu được tải lên từ UT-shka thông qua trao đổi tiêu chuẩn. Họ suy nghĩ rất lâu (khoảng một giờ) và kết thúc bằng tin nhắn:
Quá trình công việc nền bị lỗi

Khái niệm lập trình không đồng bộ

Khái niệm lập trình không đồng bộ là kết quả của một hàm không có sẵn ngay lập tức mà sau một thời gian dưới dạng một lệnh gọi không đồng bộ nào đó (vi phạm thứ tự thực thi thông thường).

Những thứ kia. Ý tưởng chính của lập trình không đồng bộ là đưa ra các lệnh gọi phương thức riêng lẻ và tiếp tục thực hiện song song các công việc khác mà không cần đợi các lệnh gọi kết thúc.

Một số phương pháp giúp giảm thiểu khả năng xảy ra ngoại lệ không yêu cầu cách tiếp cận không đồng bộ, nhưng những phương pháp khác lại yêu cầu cách tiếp cận này ngay từ đầu quá trình phát triển.

Có thể thấy từ biểu đồ, không có hệ số hành động tương tác hữu ích của người dùng với mô hình lập trình đồng bộ, vì hệ thống chặn giao diện người dùng, trong khi với mô hình không đồng bộ, người dùng tiếp tục tích cực làm việc trong hệ thống.

Khi chạy đồng bộ, ứng dụng chỉ có một luồng. Với mô hình lập trình không đồng bộ, bạn có thể chạy song song nhiều luồng và phản ứng với các hành động mới của người dùng khi chúng chạy. Khi n-thread được thực thi, bạn sẽ hiển thị kết quả trên màn hình.

Nhiệm vụ nền trong 1C:Enterprise 8

Trong 1C:Enterprise 8, các tác vụ nền được thiết kế để thực hiện các tác vụ ứng dụng một cách không đồng bộ. Ví dụ: chúng có thể tạo các công việc nền con để song song hóa các phép tính phức tạp trên các máy chủ đang hoạt động khác nhau của cụm ở chế độ hoạt động máy khách-máy chủ.

Có thể hạn chế việc thực thi các công việc nền có cùng phương pháp dựa trên một tiêu chí ứng dụng cụ thể. Có thể tạo và quản lý các công việc nền theo chương trình từ bất kỳ kết nối nào của người dùng đến cơ sở thông tin hệ thống. Công việc nền chạy thay mặt cho người dùng đã tạo ra nó.

Cơ chế tác vụ hoạt động ở cả chế độ hoạt động máy khách-máy chủ và tệp, nhưng khả năng quản lý và thực thi tác vụ ở cả hai phiên bản có phần khác nhau.

Tùy chọn máy khách-máy chủ

Trong phiên bản máy khách-máy chủ, việc lập lịch tác vụ được thực hiện bởi bộ lập lịch tác vụ, nằm trong trình quản lý cụm.

Bộ lập lịch kiểm tra định kỳ để xem liệu có bất kỳ yêu cầu nào được nhận để chạy các công việc nền hay không. Nếu có các công việc cần được thực thi, bộ lập lịch sẽ xác định các quy trình công nhân được tải ít nhất trong cụm và giao nhiệm vụ tuần tự cho từng công việc đó để thực thi. Do đó, cùng một quy trình công nhân có thể thực hiện nhiều công việc song song. Sau khi quy trình công nhân nhận được công việc, quy trình công nhân sẽ thiết lập kết nối với cơ sở thông tin và thực thi công việc trong kết nối đó. Sau khi công việc hoàn thành, quy trình công nhân sẽ thông báo cho người lập lịch xem công việc đã hoàn thành thành công hay không thành công.

Tùy chọn tệp

Bắt đầu từ phiên bản 8.3.3.641 của nền tảng, các nhà phát triển đã đơn giản hóa đáng kể công việc với các tác vụ nền trong phiên bản tệp.

Trước đây, để tự động thực thi các tác vụ, cần phải khởi chạy một phiên 1C:Enterprise riêng biệt, bổ sung, được sử dụng làm bộ lập lịch tác vụ. Và trong phần này cần phải thực hiện định kỳ phương thức ngôn ngữ tích hợp Thực thiTaskProcessing(). Cách tiếp cận này khá cồng kềnh, bất tiện và hạn chế đáng kể việc sử dụng các tác vụ nền và thông thường trong phiên bản tệp công việc.

Bây giờ mọi thứ đã trở nên dễ dàng hơn nhiều. Nếu một máy khách mỏng hoặc dày khởi động, cũng như nếu máy chủ web có kết nối máy khách, thì trong mỗi ứng dụng này, một luồng khác sẽ tự động được khởi chạy cùng với kết nối tới cơ sở dữ liệu. Các luồng này tham gia vào việc thực hiện các tác vụ nền và thường lệ.

Mỗi ứng dụng được liệt kê sẽ thực hiện các tác vụ nền riêng. Nếu một ứng dụng đã khởi tạo một số công việc nền, chúng sẽ được thực thi tuần tự, theo thứ tự chúng được nhận.

Nhược điểm rõ ràng của công việc nền 1C: vì chúng được thực thi ở phía máy chủ nên không có khả năng tương tác với người dùng (ví dụ: không thể hiển thị thông báo hoặc một số thông tin khác; tất cả dữ liệu này phải được lưu trữ trong cơ sở thông tin và được xử lý thêm trong cách nào đó).

Cần lưu ý rằng các công việc nền hoàn toàn là các đối tượng phần mềm và không thể được lưu trữ trong cơ sở dữ liệu. Nghĩa là, chúng ta chỉ có thể tạo một thể hiện của một lớp, khởi tạo các thuộc tính của nó và khởi chạy nó để thực thi.

Ví dụ về thực thi mã không đồng bộ trong 1C:Enterprise 8

“Việc viết các chương trình trong đó kết quả của lệnh gọi hàm không xác định khi nào khó hơn nhiều so với các chương trình thông thường. Các cuộc gọi lồng nhau, xử lý lỗi, kiểm soát những gì đang xảy ra - mọi thứ trở nên phức tạp hơn,” chỉ những người không biết cách sử dụng đúng khả năng của nền tảng mới nói điều này, còn chúng tôi thì không!

Hãy cùng chứng minh sự đơn giản và tinh tế của việc thực thi mã không đồng bộ trong 1C:Enterprise 8!

Bước 1. Hãy tạo một hệ thống bảo mật thông tin mới để phát triển cấu hình

Bước 2. Trong cấu hình, chúng tôi sẽ thêm mô-đun chung “Trình xử lý không đồng bộ”

Tại sao chúng tôi thêm mô-đun chia sẻ? Ở đây mọi thứ đều đơn giản: để thực hiện các hoạt động không đồng bộ trong 1C:Enterprise 8, các công việc nền có trình quản lý riêng - “BackgroundTask Manager” được sử dụng. Đối tượng này có phương thức "Run", với sự trợ giúp của tác vụ nền này sẽ được khởi chạy.

Hãy chuyển sang trợ lý cú pháp.

Vì vậy chúng ta sẽ cần một mô-đun chung.

Bước 3. Trong mô-đun chung “Trình xử lý không đồng bộ”, chúng tôi sẽ thêm quy trình xuất OurLongOperation()

Thủ tục OurLongOperation(Duration) Xuất // Mô phỏng một hành động dài hạn (Thời lượng giây). OperationStartDate = CurrentDate(); Trong khi CurrentDate() - Ngày bắt đầu hoạt động< Длительность Цикл КонецЦикла; КонецПроцедуры

Bước 4. Thêm xử lý “Khái niệm lập trình không đồng bộ” vào cấu hình (bạn có thể tạo xử lý bên ngoài)

Thêm một thuộc tính vào biểu mẫu:

Thời lượng (Số)

và hai đội

Thực hiện hoạt động lâu dài;

Thực hiện một hoạt động dài không đồng bộ.

Bước 5. Theo trợ lý cú pháp, điền vào mô-đun biểu mẫu

&Trên quy trình máy khách Thực hiện Long-RunningOperation(Lệnh) Thực thiLong-RunningOperationOnServer(); EndProcedure &Thủ tục trên máy chủ Thực thiLongOperationOnServer() AsynchronousHandlers.OurLongOperation(Duration); Kết thúc quy trình &Trên quy trình máy khách Thực hiện thao tác dài hạn Không đồng bộ (Lệnh) Thực hiện thao tác dài hạn Không đồng bộ trên máy chủ (); Kết thúc quy trình &Trên quy trình máy chủ Thực hiện thao tác chạy dài không đồng bộ trên máy chủ() Tham số = Mảng mới; Parameters.Add(Thời lượng); BackgroundTasks.Execute("AsynchronousHandlers.OurLongOperation", Tham số, UniqueIdentifier mới, "Ví dụ về khái niệm lập trình không đồng bộ"); Kết thúc thủ tục

Bước 6. Hãy khởi động và kiểm tra!

Kết quả:

Nếu chúng ta nhấp vào nút “Thực hiện thao tác dài”, thì giao diện người dùng sẽ bị chặn trong “Thời lượng” giây;

Nếu chúng ta nhấp vào nút “Thực hiện thao tác chạy dài không đồng bộ”, giao diện người dùng không bị chặn và mã chương trình được thực thi song song.

Chúng tôi có thể xác minh rằng mã chương trình được thực thi không đồng bộ bằng cách xem nhật ký.

Chúng tôi có thể gỡ lỗi mã chương trình chạy ở “nền” nếu chúng tôi đặt thuộc tính thích hợp trong tham số gỡ lỗi.

Ví dụ về thực thi mã không đồng bộ trong 1C:Enterprise 8 bằng BSP

Hãy xem xét một ví dụ về việc triển khai khái niệm lập trình không đồng bộ trong 1C:Enterprise 8 trong BSP bằng cách sử dụng ví dụ về xử lý “Các công việc hiện tại”.

Logic như sau: khi chương trình được khởi chạy, khu vực làm việc của trang bắt đầu được khởi tạo, nơi có thể hiển thị biểu mẫu xử lý “Các vấn đề hiện tại”. Biểu mẫu này được điền bởi các công việc hiện tại của người dùng và cần có thời gian để điền vào. Nếu các nhà phát triển không có khả năng thực thi mã không đồng bộ thì giao diện người dùng sẽ bị chặn trong khi điền vào biểu mẫu xử lý!

Hãy phân tích mã chương trình của biểu mẫu.

Sự kiện biểu mẫu “Khi CreatedOnServer” gọi thủ tục “RunBackgroundTask” - đây là những gì chúng ta cần.

Không bị phân tâm bởi các sắc thái, hãy phân tích quy trình này

Và ở đây chúng ta thấy rằng trình quản lý công việc nền và phương thức “Chạy” của nó được sử dụng. Lưu ý rằng nhà phát triển lưu trữ một ID duy nhất cho tác vụ nền.

Để làm điều này, các nhà phát triển sử dụng phương pháp ConnectWaitHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>).



Trong thủ tục nối Có thể kết nối_CheckTaskComplete() nhà phát triển gọi hàm Công việc đã hoàn thành(TaskID)


Hàm này kiểm tra việc thực thi công việc nền bằng mã định danh.

Cần lưu ý rằng BSP đã phát triển các mô-đun chung để hỗ trợ hoạt động máy chủ lâu dài.

Do đó, khái niệm lập trình không đồng bộ trong 1C:Enterprise 8 làm tăng nhẹ độ phức tạp trong việc giải quyết vấn đề của nhà phát triển nhưng cải thiện đáng kể chức năng của chương trình theo quan điểm của người dùng.

Cho phép chúng tôi thực hiện bất kỳ phép tính nào trong hệ thống mà người dùng không chú ý, tức là ở chế độ nền. Hơn nữa, cơ chế này cho phép chúng ta song song hóa quá trình tính toán. Chúng tôi thậm chí có thể song song hóa thủ tục sẽ được thực thi. Để làm được điều này, công việc nền của chúng ta phải chạy thêm một số công việc nền nữa. Trong trường hợp này, các quy trình được song song hóa và nếu chúng ta có một hệ thống đa bộ xử lý, đa lõi, thuật toán của chúng ta sẽ hoạt động hiệu quả. Sau khi khởi chạy một số quy trình, chúng tôi có thể cho hệ thống biết rằng hệ thống cần đợi hoàn thành các quy trình này để kết hợp kết quả bằng cách nào đó.

Ví dụ: trong các cấu hình thông thường, trong khi người dùng đang làm việc, nhiều loại công việc dịch vụ nền khác nhau sẽ được thực thi. Điều này có thể được chứng minh bằng các mục nhật ký ghi lại thực tế rằng những hành động đó đã được thực hiện. Hơn nữa, điều này không ảnh hưởng gì đến công việc của người dùng, anh ta chỉ đơn giản là không để ý đến chúng.

Lý tưởng nhất là công việc nền được triển khai trong phiên bản máy khách-máy chủ, trong trường hợp đó toàn bộ tải sẽ được chuyển đến máy chủ. Đối với phiên bản tệp, công việc nền có thể thực hiện được, nhưng nó có một số đặc thù.

Đây là kết quả mà hệ thống sẽ tạo ra nếu bạn không tính đến các tính năng này và chạy tác vụ nền trong phiên bản tệp của cơ sở thông tin.


Công việc nền 1C có một số hạn chế. Vì nó chạy ở phía máy chủ nên không có khả năng tương tác với người dùng. Ví dụ: bạn không thể hiển thị một tin nhắn hoặc bất kỳ thông tin nào. Tất cả dữ liệu này cần được lưu trữ trong cơ sở thông tin và được xử lý thêm theo một cách nào đó.
Bằng cách liên hệ với trợ lý cú pháp, bạn có thể nhận được thông tin chi tiết hơn về các công việc nền 1C. Cần lưu ý ở đây rằng đối tượng này hoàn toàn là phần mềm và nó không được lưu trữ trong cơ sở dữ liệu dưới bất kỳ hình thức nào. Nghĩa là, chúng ta tạo một thể hiện của lớp, khởi tạo các thuộc tính và khởi chạy nó để thực thi.

Chúng ta có những công cụ gì để quản lý các công việc nền? Cơ sở này là một đối tượng siêu dữ liệu "Trình quản lý tác vụ nền". Đối tượng này có một phương thức "Chạy", bằng cách sử dụng phương pháp này, công việc nền sẽ được khởi chạy.

Nó có các thông số sau:
"Tên phương thức"- tên của thủ tục hoặc hàm sẽ được thực thi và nó phải là thủ tục hoặc hàm của ngữ cảnh máy chủ;

"Tùy chọn"- một mảng các tham số, số phần tử của nó phải tương ứng với số lượng tham số của thủ tục/hàm của chúng ta được chỉ định trong tham số "Tên phương thức";

"Chìa khóa"- một khóa duy nhất nhất định, là một dòng mà qua đó hệ thống hiểu được liệu một tác vụ nền có cần được khởi chạy hay một tác vụ đó đã chạy hay chưa;

"Tên"- ở đây bạn có thể chỉ định một mô tả tùy ý về phương pháp của chúng tôi.

Giá trị trả về là một đối tượng "Tác vụ nền", chứa tên phương thức hiện tại, khóa hiện tại và một số thuộc tính và phương thức khác. Một phương pháp như vậy là phương pháp "Chờ hoàn tất". Mục đích của nó là chúng ta có thể yêu cầu hệ thống không làm bất cứ điều gì cho đến khi hoàn thành công việc nền.

Công việc nền 1C 8.2, 8.3 - Ví dụ sử dụng

Hãy đưa ra một ví dụ về làm việc với các công việc nền 1C. Đầu tiên, chúng tôi sẽ tạo một thuật toán đơn giản để tải hệ thống 1C trong thời gian ngắn theo cách mà chúng tôi không thể làm bất cứ điều gì vào lúc này.

Đối với điều này:

1. Hãy tạo một mô-đun chung "Trình xử lý tác vụ nền", sẽ được biên dịch ở phía máy chủ;


2. Chúng tôi sẽ mô tả thủ tục xuất khẩu trong đó "ProduceBackgroundCalculation(Tham số)", lấy một tham số kiểu chuỗi;

Quy trình PerformanceBackgroundCalculation(Parameter) ExportStartTime = CurrentDate() ; Trong khi CurrentDate() - Thời gian bắt đầu< = 6 Цикл КонецЦикла ; КонецПроцедуры Процедура КнНажатие() ОбработчикиФоновыхЗаданий. ПроизветиФоновоеВычисление("Một số tham số") ; Kết thúc thủ tục
Sẵn sàng. Bây giờ, khi bạn bắt đầu xử lý và nhấn nút, hệ thống sẽ đóng băng trong vài giây, trong thời gian đó bạn không thể làm gì được. Đây chính xác là những gì chúng tôi cần làm.

Bây giờ chúng tôi sẽ đảm bảo rằng những tính toán này được thực hiện ở chế độ nền, nghĩa là để tác vụ nền 1C 8.2, 8.3 được thực thi nhưng không gây trở ngại cho chúng tôi.

Đối với điều này:

1. Trong quá trình xử lý, trong sự kiện nhấn nút, hãy viết đoạn mã sau.

Quy trình KnPress() Tham số = Mảng mới; Tùy chọn. Thêm vào( "Một số tham số") ; Nhiệm vụ nền. Chạy ( "Trình xử lý tác vụ nền. Thực hiện tính toán nền", Tham số, Mã định danh duy nhất mới, "Bài kiểm tra") ; Kết thúc thủ tục

Ở đây, chúng tôi chuyển tên của quy trình mô-đun chung làm tham số đầu tiên và một mảng tham số làm tham số thứ hai. Tham số thứ ba cần được truyền một khóa duy nhất và tham số thứ tư cần phải truyền một số mô tả về quy trình của chúng tôi.

Vấn đề này không phải là mới và thỉnh thoảng được thảo luận trên nhiều diễn đàn 1C khác nhau. Giải pháp đơn giản và phổ biến nhất là khởi động lại máy chủ 1C. Thật không may, lựa chọn này không phải lúc nào cũng được chấp nhận hoặc rất không mong muốn. Trong trường hợp như vậy, có những giải pháp tế nhị hơn.

Đây một trong những phương pháp này dưới dạng hướng dẫn từng bước ngắn gọn:

1. Bằng cách sử dụng bảng điều khiển quản trị máy chủ 1C, chúng tôi đang tìm kiếm các lỗi có vấn đề.một công việc mới trong danh sách kết nối (ví dụ: theo thời gian bắt đầu hoạt động của nó, so với thời gian bắt đầu của một công việc được quy định trong bảng điều khiển công việc). Chúng tôi xác địnhquy trình công nhân nơi đặt kết nối treo.

2. Mở các thuộc tính của quy trình này và đánh dấu nó là không sử dụng (nếu chỉ sử dụng một quy trình thì trước tiên bạn phải tạo một quy trình công nhân mới để tất cả các kết nối đang hoạt động kết nối lại với nó). Chúng tôi nhớ số PID của quá trình này.


3. Chúng tôi đợi cho đến khi tất cả các kết nối hiện tại chuyển từ quy trình bị vô hiệu hóa sang một trong các kết nối được sử dụng. Cuối cùng, chỉ những kết nối có vấn đề mới được giữ lại trong quy trình của chúng tôi mà chúng tôi muốn xóa.

4. Trên máy tính có máy chủ 1C, sử dụng trình quản lý tác vụ, tìm quy trình rphost.exe tương ứng bằng cách sử dụng PID của quy trình nhân viên bị vô hiệu hóa và xóa nó.

5 . Để đề phòng, bạn có thể xóa quy trình làm việc 1C mà chúng tôi đã vô hiệu hóa bằng quản trị viên. console và nếu cần, hãy tạo một cái mới.

6. Sẵn sàng. Bạn có thể đăng nhập vào bảng điều khiển công việc và kiểm tra chức năng của công việc đã lên lịch.

Các công việc nền trong 1C có thể được khởi chạy tự động theo lịch trình (tức là chúng là các trường hợp của các công việc thông thường) hoặc chính nhà phát triển có thể bắt đầu khởi chạy một công việc nền để thực thi một thuật toán tùy ý (một ví dụ nổi bật là việc tạo các báo cáo trong bối cảnh).
QUAN TRỌNG!!!Đối với cơ sở dữ liệu tệp, bắt đầu từ phiên bản nền tảng 8.3.3.641, không cần thiết phải khởi chạy một phiên riêng biệt trong đó các công việc nền sẽ được thực thi. Những thứ kia. Trước đây, trong cơ sở dữ liệu tệp, để chạy các công việc nền, cần phải thực thi phương thức ngữ cảnh chung “RunTaskProcessing()”. Chi tiết tại liên kết này.

Quy trình chạy thuật toán tùy ý trong công việc nền

Để chạy thuật toán của chúng tôi trong một công việc nền riêng biệt, chúng tôi sẽ sử dụng phương thức "Chạy()" người quản lý công việc nền: Cú pháp: Hành hình(<ИмяМетода>, <Параметры>, <Ключ>, <Наименование>)
  • <ИмяМетода>(yêu cầu); Kiểu: Chuỗi
    Tên của thủ tục hoặc hàm được xuất của một mô-đun chung không toàn cục có thể được thực thi trên máy chủ, ở dạng ModuleName.MethodName.
  • <Параметры>(không bắt buộc); Kiểu: Mảng
    Một mảng các tham số được truyền cho phương thức. Số lượng và loại tham số phải phù hợp với tham số của phương thức. (xem thêm chi tiết trong Trợ lý cú pháp)
  • <Ключ>(không bắt buộc); Kiểu: Chuỗi
    Nếu một khóa được chỉ định thì khóa đó phải là duy nhất trong số các khóa của công việc nền đang hoạt động có cùng tên phương thức với công việc nền.
  • <Наименование>(không bắt buộc); Loại: Chuỗi.
    Mô tả công việc.

Quy trình chạy một công việc nền

Trong trường hợp của chúng tôi, chúng tôi sẽ sử dụng quy trình xuất nằm trong mô-đun chung "Máy chủ mô-đun chung"(Tôi nghĩ không cần thiết phải giải thích rằng mô-đun phải ở phía máy chủ) Quy trình Ghi thông tin VỀ Sản phẩm trong nền (Tham số tác vụ nền) Yêu cầu dữ liệu xuất = Yêu cầu mới ("CHỌN | Sản phẩm. Liên kết NHƯ Danh pháp | TỪ | Thư mục. Danh pháp NHƯ sản phẩm"); Tìm nạp = DataRequest.Execute().Select(); Trong khi Selection.Next() MH Cycle = Thanh ghi thông tin.Dữ liệu sản phẩm.CreateRecordManager(); MZ.Period = CurrentDate(); MZ.Danh pháp = Lấy mẫu.Danh pháp; MH.Thông tin = BackgroundTaskParameter; MZ.Write(); Chu kỳ cuối; Kết thúc thủ tục Để minh họa hoạt động của công việc nền, chúng ta sẽ tạo các mục trong thanh ghi thông tin cho từng mục và tham số sẽ được chuyển từ biểu mẫu mà công việc nền được khởi chạy.

Lệnh bắt đầu công việc nền

Tham số mà chúng ta sẽ chuyển đến quy trình thực thi sẽ được lấy từ thuộc tính của biểu mẫu được quản lý (thuộc tính có kiểu “Chuỗi”):

Mã mô-đun biểu mẫu được quản lý sẽ trông như thế này: &Trên Quy trình Khách hàng StartBackgroundJob(Command) StartBackgroundJobOnServer(); Kết thúc quy trình &Trên máy chủ Quy trình Bắt đầu công việc nền trên máy chủ () // Tạo một mảng với các tham số Job Parameters = New Array; JobParameters.Add(TaskParameter); // Chúng tôi bắt đầu thực thi nền của thuật toán BackgroundTasks.Execute(// Phương thức xuất của chúng tôi trong mô-đun chung "GeneralModuleServer.WriteInformationOnProductsInBackground", // Chúng tôi chuyển một mảng với các tham sốTaskParameters, // Chỉ định khóa tác vụ New UniqueIdentifier, // Chỉ định tên của công việc nền “Công việc nền của chúng tôi”); Kết thúc thủ tục

Kết quả thực hiện

Kết quả của việc thực thi công việc nền, các mục nhập sẽ được tạo trong thanh ghi thông tin (đó là những gì chúng ta cần).