พาเวล ชิสตอฟ. โหมดการทำงานที่ปลอดภัย ตั้งค่าเซฟโหมด 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 ซึ่งมีประเภท ตัวจัดการรายงานภายนอก.