พาเวล ชิสตอฟ. โหมดการทำงานที่ปลอดภัย ตั้งค่าเซฟโหมด 1c แล้ว ห้ามใช้งาน
เมื่อคุณเรียกใช้โปรแกรมอัปโหลดเอกสารในฐานะผู้ใช้ทั่วไป ข้อผิดพลาด "ตั้งค่าเซฟโหมดแล้ว ห้ามดำเนินการ"
ความยากลำบากนี้เกิดขึ้นเพราะว่า มีสิทธิ์ไม่เพียงพอที่จะเริ่มการประมวลผลภายนอก ในการกำหนดค่าสิทธิ์การเข้าถึงให้เข้าสู่ฐานข้อมูลในโหมด 1C Enterprise ในนามของ ผู้ดูแลระบบและไปที่ส่วนนั้น การตั้งค่าผู้ใช้และสิทธิ์ / เข้าถึงโปรไฟล์กลุ่มคลิก เพื่อสร้างกลุ่ม
ป้อนชื่อกลุ่มและทำเครื่องหมายในช่องสำหรับบทบาทที่มีให้กับผู้ใช้ของกลุ่มนี้ -
- การเปิดรายงานและการประมวลผลภายนอกแบบโต้ตอบ
- การใช้รายงานและการประมวลผลเพิ่มเติม
คลิก บันทึกและปิด
กลับไปที่เมนูผู้ใช้และเลือกจากรายชื่อพนักงานที่จะทำงานกับโปรแกรมอัพโหลดเอกสาร คลิกสิทธิ์ ในรายการโปรไฟล์ ให้เลือกโปรไฟล์ที่สร้างไว้ก่อนหน้านี้ คลิก เขียนลงไป.
เพื่อให้ผู้ใช้สามารถเริ่มการประมวลผลได้ ขอแนะนำให้เพิ่ม Document Loading ลงในรายการการประมวลผลภายนอก โดยทำในเมนู การบริหารงาน / แบบฟอร์มที่พิมพ์และการประมวลผล / รายงานและการประมวลผลเพิ่มเติมสร้างการประมวลผลใหม่ ระบุเส้นทางไปยังไฟล์ "Download Documents.epf" และกำหนดชื่อ ระบุตำแหน่งของการประมวลผลในเมนู จากตำแหน่งที่ผู้ใช้สามารถเปิดใช้งานได้ในภายหลัง เช่น เลือกเมนู ไดเรกทอรี
เมื่อคลิกที่รายการเข้าถึงด่วน คุณระบุว่าผู้ใช้รายใดมีสิทธิ์เข้าถึงการประมวลผล:
หลังจากตั้งค่าแล้ว คลิก บันทึกและปิด- เพื่อเริ่มการประมวลผล ผู้ใช้จะต้องป้อนฐานข้อมูลอีกครั้งและเปิดจากเมนูการเข้าถึง (ในตัวอย่าง - ไดเร็กทอรี) แล้วคลิก ดำเนินการ.
เปิด เมนู - ฟังก์ชั่นทั้งหมด...- และค้นหาตัวเลือก "ใช้โปรไฟล์ความปลอดภัย" ในรายการ
เพียงยกเลิกการเลือกตัวเลือก "ใช้โปรไฟล์ความปลอดภัย"
หลังจากนี้โปรแกรมก็จะเปิดตัวได้สำเร็จ
ความจริงก็คือเมื่อใช้ 1C เวอร์ชันไคลเอนต์ - เซิร์ฟเวอร์การประมวลผล / รายงานภายนอกจะเปิดขึ้นในเซฟโหมดซึ่งห้ามใช้โหมดสิทธิพิเศษ และโหมดสิทธิพิเศษถูกใช้บ่อยมากในการกำหนดค่าทั่วไป: การสร้างแบบฟอร์มที่พิมพ์ การตรวจสอบบริการต่างๆ (การลงทะเบียนการแลกเปลี่ยน) เป็นต้น เป็นผลให้แม้จะใช้รายงานปกติในระบบควบคุมการเข้าถึงโดยไม่มีแบบฟอร์ม (โดยค่าเริ่มต้นจะใช้แบบฟอร์มทั่วไป "ReportForm") และบันทึกการตั้งค่ารายงานที่กำหนดเอง (ในไดเร็กทอรีที่เกี่ยวข้อง) คุณจะได้รับข้อผิดพลาดเกี่ยวกับการเข้าถึงที่ไม่เพียงพอ สิทธิ์ในค่าคงที่และพารามิเตอร์เซสชันต่างๆ ที่ใช้เพื่อวัตถุประสงค์อย่างเป็นทางการหลังบรรทัด SetPrivilegedMode(จริง) ;
โซลูชันที่ "ถูกต้อง" คือการเชื่อมต่อการประมวลผลและรายงานภายนอกผ่านกลไก "รายงานและการประมวลผลเพิ่มเติม" ของ BSP ด้วยการปิดใช้งานเซฟโหมดหรือเพิ่มการอนุญาต (ในความคิดของฉันจาก BSP เวอร์ชัน 2.2.2.1) แต่หากจำเป็นต้องใช้ไฟล์การรายงาน/การประมวลผลภายนอกด้วยเหตุผลบางประการ คุณสามารถกำหนดค่าโปรไฟล์ความปลอดภัยของคลัสเตอร์ที่ใช้เป็นโปรไฟล์ความปลอดภัยโหมดปลอดภัยสำหรับฐานข้อมูลเฉพาะได้
ฉันต้องการทราบทันทีว่าตัวเลือกนี้ไม่เหมาะ แต่เนื่องจากสถานการณ์ต่างๆ จึงสามารถใช้ในรูปแบบที่เรียบง่ายเช่นนี้ได้ ตัวอย่างเช่น ฉันมีฐานข้อมูลหลายแห่งในเมืองต่างๆ ซึ่งเป็นฐานข้อมูลท้องถิ่นทั่วไปที่มีสิทธิ์จำกัดอย่างเคร่งครัด มี USB แบบปิด ฯลฯ บางแห่งที่ฉันใช้ Accounting 2.0 และบางแห่งเป็น 3.0 ฉันสร้างรายงานเกือบทั้งหมดโดยใช้เครื่องมือ ACS โดยไม่มีแบบฟอร์ม ดังนั้น เปิดแล้วทั้งสองเวอร์ชั่น การบำรุงรักษารายงานทั้งหมดเหล่านี้สำหรับเวอร์ชันต่างๆ และฐานข้อมูลที่แตกต่างกันนั้นต้องใช้แรงงานมากและไร้ประโยชน์ เนื่องจาก มีแผนที่จะเปลี่ยนไปใช้การกำหนดค่าและฐานเดียว...
มาสร้างโปรไฟล์กันเถอะ
ในคอนโซลคลัสเตอร์ เราสร้างโปรไฟล์ความปลอดภัยที่เราตั้งค่าสถานะ "สามารถใช้เป็นโปรไฟล์ความปลอดภัย Safe Mode"และ " ในส่วน "อนุญาตการเข้าถึงแบบเต็ม:" "สู่โหมดสิทธิพิเศษ"
ในหลายกรณีของการใช้รายงานและการประมวลผลแบบง่าย วิธีการนี้จะสามารถใช้ได้ สำหรับสถานการณ์ที่ซับซ้อนมากขึ้น ไม่มีประโยชน์ที่จะอธิบายกระบวนการนี้เพราะว่า มีการระบุไว้ในเอกสารประกอบ (ความสามารถในการกำหนดค่าโปรไฟล์ความปลอดภัยสำหรับไฟล์ภายนอกเฉพาะโดยการระบุจำนวนแฮช ฯลฯ )
ป.ล. ฉันคิดว่าโปรไฟล์ความปลอดภัยจะทำงานเฉพาะเมื่อใช้แพลตฟอร์มและใบอนุญาตเซิร์ฟเวอร์ในระดับ CORP เท่านั้น แต่ฟังก์ชันนี้ยังใช้งานได้บนแพลตฟอร์ม 1C:Enterprise 8.3 ด้วย (สามารถเรียกตามเงื่อนไขว่า PROF โดยการเปรียบเทียบกับการกำหนดค่ามาตรฐาน Basic/PROF/CORP)
พิมพ์ (Ctrl+P)
วัตถุการกำหนดค่า
หากจำเป็นต้องใช้โค้ดโปรแกรม "ไม่น่าเชื่อถือ" บนเซิร์ฟเวอร์: การประมวลผลภายนอกหรือโค้ดโปรแกรมที่ผู้ใช้ป้อนเพื่อใช้ในวิธี Run() และ Calculate() คุณสามารถใช้โหมดการทำงานที่ปลอดภัยได้
ในเซฟโหมด:
- โหมดสิทธิพิเศษ ยกเลิก.
- เปลี่ยนเป็นโหมดสิทธิพิเศษ ละเลย.
- ต้องห้ามการดำเนินการที่นำไปสู่การใช้วิธีการภายนอกที่เกี่ยวข้องกับแพลตฟอร์ม 1C:Enterprise (รวมถึงอะนาล็อกที่ไม่ปิดกั้นของวิธีการที่ระบุ):
- กลไก COM:
- โคโมวัตถุ();
- รับCOMObject();
- WrapperHTMLDocument.GetCOMObject()
- กำลังโหลดส่วนประกอบภายนอก:
- โหลดส่วนประกอบภายนอก();
- เชื่อมต่อส่วนประกอบภายนอก()
- การเข้าถึงระบบไฟล์:
- ค่าในไฟล์();
- คัดลอกไฟล์();
- ผสานไฟล์();
- ย้ายไฟล์();
- แยกไฟล์();
- สร้างไดเรกทอรี();
- ลบไฟล์();
- ไฟล์ใหม่;
- ใหม่ xBase;
- รายการHTML.OpenFile();
- ReadHTML.OpenFile();
- ReadXML.OpenFile();
- WriteXML.OpenFile();
- ReadingFastInfoset.OpenFile();
- RecordFastInfoset.OpenFile();
- CanonicalXMLRecord.OpenFile();
- TransformXSL.LoadFromFile();
- WriteZipFile.Open();
- ReadingZipFile.Open();
- ใหม่ ReadText() หากพารามิเตอร์แรกเป็นสตริง
- ReadText.Open() ถ้าพารามิเตอร์แรกเป็นสตริง
- NewTextRecord() หากพารามิเตอร์แรกเป็นสตริง
- WriteText.Open() ถ้าพารามิเตอร์แรกเป็นสตริง
- NewTextExtract();
- การเปลี่ยนคุณสมบัติ ExtractText.FileName;
- ExtractText.เขียน();
- รูปภาพใหม่ () ถ้าพารามิเตอร์แรกเป็นสตริง
- รูปภาพ.เขียน();
- ใหม่ BinaryData();
- BinaryData.Write();
- NewDataRecord() ถ้าพารามิเตอร์แรกเป็นสตริง
- ใหม่ ReadData() มีพารามิเตอร์แรก - สตริง;
- วิธีการทั้งหมดของวัตถุ FileStreamManager
- ใหม่ FileStream();
- จัดรูปแบบเอกสาร.เขียน();
- GeographicScheme.Read();
- GeographicScheme.Write();
- GeographicScheme.พิมพ์();
- TabularDocument.อ่าน();
- TabularDocument.เขียน();
- TabularDocument.พิมพ์(); GraphicScheme.Read();
- GraphicScheme.Write();
- GraphicScheme.พิมพ์();
- TextDocument.อ่าน();
- TextDocument.Write()
- การเข้าถึงอินเทอร์เน็ต:
- การเชื่อมต่ออินเทอร์เน็ตใหม่
- ใหม่ อินเตอร์เน็ตเมล,
- ใหม่ อินเทอร์เน็ตพรอกซี,
- การเชื่อมต่อ HTTP ใหม่
- การเชื่อมต่อ FTP ใหม่
ความสนใจ! เมื่อดำเนินการที่ต้องห้าม จะมีข้อยกเว้นเกิดขึ้นที่รันไทม์
บันทึก. รายงานภายนอกและการประมวลผลที่เปิดโดยใช้เมนูไฟล์ - เปิดจะดำเนินการในเซฟโหมดหากผู้ใช้ไม่มีสิทธิ์การเข้าถึงระดับผู้ดูแลระบบ
จำนวนครั้งที่เปิดเซฟโหมดจะต้องตรงกับจำนวนครั้งที่ปิด อย่างไรก็ตาม หากเปิดเซฟโหมดไว้ภายในขั้นตอนหรือฟังก์ชัน (หนึ่งครั้งขึ้นไป) แต่ไม่ได้ปิด ระบบจะปิดโดยอัตโนมัติหลายครั้งเมื่อมีการเปิดขั้นตอนหรือฟังก์ชันที่ไม่สมบูรณ์ทิ้งไว้
หากในขั้นตอนหรือฟังก์ชันเรียกใช้เมธอด SetSafeMode(เท็จ)ทำมากกว่าการเรียกเมธอด ตั้งค่า SafeMode (จริง)จากนั้นจะมีข้อยกเว้นเกิดขึ้น
อาจจำเป็นต้องมีการติดตั้งซอฟต์แวร์เซฟโหมดในกรณีที่ผู้พัฒนาการกำหนดค่าตั้งใจที่จะใช้รหัสโปรแกรมของบุคคลที่สาม (ที่เกี่ยวข้องกับการกำหนดค่า) ซึ่งความน่าเชื่อถือที่ผู้พัฒนาไม่สามารถรับประกันได้ ตัวอย่างของโค้ดดังกล่าวคือการเรียกใช้เมธอด Execute() และ Compute() ในกรณีที่ได้รับโค้ดที่สามารถเรียกใช้งานได้จากโลกภายนอก ในกรณีนี้ แนวทางปฏิบัติที่ดีคือการตั้งค่า Safe Mode ก่อนที่จะดำเนินการตามวิธีการเหล่านี้:
// รหัสโปรแกรมถูกสร้างขึ้นซึ่งควรจะดำเนินการ // เป็นไปได้ว่ารหัสถูกโหลดจากแหล่งภายนอก // หรือป้อนด้วยตนเอง ExecutableCode = GetExecutedCodeFromExternalWorld(); // เปิดใช้งานเซฟโหมด SetSafeMode (จริง); // รันโค้ดที่อาจเป็นอันตราย Execute(ExecutableCode); // ปิดเซฟโหมด SetSafeMode(False);
ในบางกรณี การตั้งค่า Safe Mode อาจขัดแย้งกับการตั้งค่า Privileged Mode ตัวอย่างของข้อขัดแย้งดังกล่าวคือการโพสต์เอกสารที่ตั้งค่าคุณสมบัติโหมดสิทธิพิเศษเมื่อมีการโพสต์จากรหัสในภาษาในตัวที่ดำเนินการในเซฟโหมด ในกรณีนี้ โหมดสิทธิพิเศษจะถูกปิดใช้งาน และความพยายามที่จะเปิดใช้งานจะถูกละเว้น เป็นผลให้รหัสในภาษาฝังตัวซึ่ง "นับ" ในโหมดสิทธิพิเศษที่เปิดใช้งาน "เผชิญ" การหายไปซึ่งนำไปสู่ข้อผิดพลาดโดยไม่มีเหตุผลที่ชัดเจนสำหรับลักษณะที่ปรากฏ เพื่อป้องกันสถานการณ์นี้ ระบบ 1C:Enterprise จะปิดใช้งานเซฟโหมดโดยอัตโนมัติสำหรับตัวจัดการเหตุการณ์ที่มีอยู่ในโมดูลอ็อบเจ็กต์หรือโมดูลตัวจัดการ โดยมีเงื่อนไขว่าโค้ดที่ปฏิบัติการได้ในภาษาในตัวไม่อยู่ในส่วนขยายการกำหนดค่า ตัวจัดการดังกล่าวถูกทำเครื่องหมายด้วยวิธีพิเศษในตัวช่วยไวยากรณ์
นอกจากนี้ยังให้ความสามารถในการปิดการใช้งาน Safe Mode จากภาษาในตัว (หากรหัสโปรแกรมที่พยายามปิดการใช้งานไม่ได้อยู่ในส่วนขยายการกำหนดค่า) หากต้องการปิดใช้งานเซฟโหมดมีวิธีหนึ่ง ตั้งค่าปิดการใช้งานSafeMode()- คุณสามารถตรวจสอบว่าโหมดปลอดภัยถูกปิดใช้งานอยู่ (โดยอัตโนมัติหรือโดยการเรียกวิธีการ) โดยใช้วิธีนี้ GetDisableSafeMode()
ภายในหนึ่งวิธีในภาษาที่มีอยู่แล้ว ไม่สามารถมีการซ้อนกันของการตั้งค่าเซฟโหมดได้มากกว่าหนึ่งระดับ (โดยการเรียกเมธอด SetSafeMode()) และการตั้งค่าการปิดใช้งานเซฟโหมด (โดยอัตโนมัติระหว่างการดำเนินการของตัวจัดการเหตุการณ์ของ วัตถุข้อมูลเมตาหรือโดยการเรียกเมธอด SetDisableSafeMode()) เมื่อพยายามเพิ่มการซ้อน จะมีข้อยกเว้นเกิดขึ้น:
// การใช้ ProcedureProcedureName() SetDisableSafeMode(True) อย่างถูกต้อง); SetSafeMode(จริง); SetSafeMode(เท็จ); SetDisableSafeMode (เท็จ); EndProcedure // การใช้ ProcedureProcedureName() ไม่ถูกต้อง SetDisableSafeMode(True); SetSafeMode(จริง); SetDisableSafeMode (เท็จ); // ข้อยกเว้น EndProcedure ProcedureProcedureName () SetSafeMode (จริง); SetDisableSafeMode (เท็จ); // ข้อยกเว้น EndProcedure
การเปิดการประมวลผลภายนอกโดยทางโปรแกรมดำเนินการโดยใช้วัตถุบริบทส่วนกลาง ExternalProcessing ซึ่งมีประเภท ตัวจัดการการประมวลผลภายนอก- สำหรับแต่ละโหมดการทำงานของแพลตฟอร์ม 1C (โหมดแอปพลิเคชันปกติและโหมดแอปพลิเคชันที่ได้รับการจัดการ) จะใช้วิธีการต่าง ๆ ของวัตถุเพื่อทำงานกับการประมวลผลภายนอก
เรียกใช้การประมวลผลภายนอกในโหมดแอปพลิเคชันปกติ
ในแอปพลิเคชันทั่วไป คุณต้องใช้เมธอด Create() ของออบเจ็กต์ ExternalProcessing ซึ่งส่งผ่านชื่อเต็มของไฟล์ประมวลผลภายนอก วิธีการส่งกลับวัตถุประเภท การประมวลผลภายนอกวัตถุนี้คือการประมวลผลภายนอกที่กำลังเปิดอยู่ หากคุณต้องการเปิดแบบฟอร์มการประมวลผลภายนอก ให้เรียกเมธอด GetForm() บนออบเจ็กต์ที่ได้รับ ซึ่งจะส่งคืนฟอร์มหลัก จากนั้นเรียกเมธอด Open() เพื่อเปิดกำลังประมวลผล = ExternalProcessing.Create (FullFileName);
กำลังประมวลผลGetForm().เปิด();
ในการประมวลผลภายนอก แบบฟอร์มหลักต้องเป็นแบบฟอร์มปกติเสมอ และแบบฟอร์มควบคุมต้องเป็นแบบฟอร์มเพิ่มเติมเสมอ มิฉะนั้นเมธอด GetForm() จะไม่ทำงานในโหมดแอปพลิเคชันปกติ
เรียกใช้การประมวลผลภายนอกในโหมดแอปพลิเคชันที่ได้รับการจัดการ
ในโหมดแบบฟอร์มที่มีการจัดการ อัลกอริทึมจะถูกแบ่งตามบริบทการดำเนินการ บนไคลเอนต์ เราได้รับข้อมูลไบนารีโดยใช้ชื่อเต็มของไฟล์ประมวลผลภายนอก เราถ่ายโอนข้อมูลไบนารีที่ได้รับไปยังเซิร์ฟเวอร์และนำไปไว้ในที่เก็บข้อมูลชั่วคราว ถัดไป คุณต้องเรียกใช้เมธอด Connect() ของวัตถุ ExternalProcessing ซึ่งจะส่งที่อยู่สำหรับการจัดเก็บชั่วคราวไปให้ วิธีการส่งกลับชื่อของการประมวลผลภายนอกที่เชื่อมต่อ เราส่งคืนชื่อของการประมวลผลภายนอกไปยังไคลเอนต์ สร้างเส้นทางสตริงไปยังแบบฟอร์มการประมวลผล และใช้เมธอด OpenForm() เพื่อเปิดแบบฟอร์มการประมวลผลภายนอก&บนเซิร์ฟเวอร์
ฟังก์ชัน GetExternalProcessingName (BinaryData)
AddressInTemporaryStorage = PlaceInTemporaryStorage(BinaryData);
ส่งคืน ExternalProcessing.Connect (AddressInTemporaryStorage);
EndFunction
&บนไคลเอนต์
ชื่อไฟล์เต็ม = ""; // ชื่อเต็มของไฟล์ประมวลผลภายนอก
FileData = BinaryData ใหม่ (FullFileName);
ExternalProcessingName = GetExternalProcessingName(FileData);
OpenForm("ExternalProcessing." + ชื่อการประมวลผลภายนอก + ".Form");
เซฟโหมดสำหรับการประมวลผลภายนอก
เมธอด Create() และ Connect() ของวัตถุ ExternalProcessing มีพารามิเตอร์ขาเข้า SafeMode ซึ่งเป็นสัญญาณของการเชื่อมต่อการประมวลผลภายนอกในเซฟโหมด หากไม่ได้ระบุพารามิเตอร์ การเชื่อมต่อจะทำในโหมดปลอดภัยเซฟโหมดได้รับการออกแบบมาเพื่อปกป้องระบบจากการรันโค้ดโปรแกรม "ไม่น่าเชื่อถือ" บนเซิร์ฟเวอร์ อันตรายที่อาจเกิดขึ้นมาจากการประมวลผลภายนอกหรือรหัสโปรแกรมที่ผู้ใช้ป้อนเพื่อใช้ในวิธี Run() และ Calculate()
เซฟโหมดกำหนดข้อจำกัดดังต่อไปนี้:
- โหมดสิทธิพิเศษจะถูกยกเลิกหากติดตั้งไว้
- ความพยายามที่จะเข้าสู่โหมดสิทธิพิเศษจะถูกละเว้น
- ห้ามดำเนินการกับวัตถุ COM;
- ห้ามโหลดและเชื่อมต่อส่วนประกอบภายนอก
- ห้ามเข้าถึงระบบไฟล์ (ยกเว้นไฟล์ชั่วคราว)
- ห้ามเชื่อมต่ออินเทอร์เน็ต
หากต้องการห้ามการเปิดการประมวลผลแบบโต้ตอบ ในทุกบทบาทที่กำหนดให้กับผู้ใช้ จำเป็นต้องลบสิทธิ์ "การเปิดการประมวลผลภายนอกแบบโต้ตอบ" (ดูรูปที่ 1)
รูปที่ 1 สิทธิ์ในการเปิดการประมวลผล/รายงานภายนอกแบบโต้ตอบ |
การเปิดรายงานภายนอกโดยทางโปรแกรมจะคล้ายกับการประมวลผลภายนอก แต่คุณควรใช้วัตถุบริบทส่วนกลาง ExternalReports ซึ่งมีประเภท ตัวจัดการรายงานภายนอก.