วิธีบันทึกข้อมูลไบนารี่เป็นไฟล์ 1c การทำงานกับข้อมูลไบนารี การอ่านข้อมูลจากอุปกรณ์ประกอบฉาก

พิมพ์ (Ctrl+P)

16.3. การทำงานกับข้อมูลไบนารี

16.3.1. ข้อมูลทั่วไป

เมื่อใช้โซลูชันแอปพลิเคชัน อาจมีสถานการณ์ที่จำเป็นต้องวิเคราะห์ข้อมูลไบนารีต่างๆ ตัวอย่างเช่น คุณต้องกำหนดประเภทไฟล์โดยใช้ลายเซ็นหรือดำเนินการปรับแต่งรูปภาพ ในการทำงานกับข้อมูลไบนารี 1C:Enterprise มีอินเทอร์เฟซซอฟต์แวร์พิเศษ ต่อไป เราจะดูความเป็นไปได้ในการทำงานกับข้อมูลไบนารี
การทำงานกับข้อมูลไบนารีทั้งหมดจะขึ้นอยู่กับแนวคิดของสตรีม ไหลเป็นการวางนัยทั่วไปเชิงตรรกะของแหล่งข้อมูลตามอำเภอใจ (ในกรณีทั่วไป) (วัตถุสตรีม) ระบบไม่ได้จัดเตรียมความสามารถในการสร้างออบเจ็กต์สตรีมอิสระที่ไม่เกี่ยวข้องกับแหล่งที่มาใดๆ แต่มีวัตถุที่ได้รับที่สามารถสร้างได้ - สตรีมที่เกี่ยวข้องกับไฟล์บนดิสก์ (วัตถุ FileStream) หรือสตรีมที่สร้างในหน่วยความจำ (วัตถุ MemoryStream) สตรีมช่วยให้คุณทั้งอ่านข้อมูลและเขียนข้อมูลได้ เพื่อกำหนดความเป็นไปได้ในการดำเนินการบางอย่าง สตรีม (และออบเจ็กต์ที่ได้รับ) มีวิธีการพิเศษที่ให้คุณกำหนดได้ว่าวิธีใด
การดำเนินการพร้อมใช้งานกับเธรดนี้ (methods บันทึกที่มีอยู่(), ที่มีอยู่อ่าน(), ที่มีอยู่เปลี่ยนตำแหน่ง()).
หากคุณต้องการทำงานกับสตรีมในระดับที่สูงกว่า โดยเฉพาะอย่างยิ่งการอ่าน/เขียนข้อมูล เช่น ตัวเลข (ที่มีความลึกบิตต่างกัน) หรือสตริง ดังนั้นออบเจ็กต์ DataRead/DataWrite มีไว้สำหรับสิ่งนี้ เมื่อใช้ออบเจ็กต์เหล่านี้ คุณจะสามารถใช้แนวทางที่มีโครงสร้างมากขึ้นกับข้อมูลไบนารีที่อยู่ในสตรีมได้ ตัวอย่างเช่นเมื่อทราบรูปแบบของไฟล์คุณสามารถอ่านไฟล์ดังกล่าวได้อย่างสะดวกสบายโดยรับข้อมูลที่จำเป็นจากส่วนหัว (ซึ่งตามกฎแล้วจะแสดงด้วยหมายเลขประเภทและสตริง) โดยข้ามบล็อกข้อมูลที่ไม่จำเป็นและ กำลังโหลดสิ่งที่จำเป็นสำหรับการประมวลผล
รูปแบบทั่วไปสำหรับการทำงานกับข้อมูลไบนารีสามารถแสดงได้ดังนี้:

  1. อยู่ระหว่างการรับสตรีม
  2. ออบเจ็กต์ Data Reader หรือ Data Writer ถูกสร้างขึ้น
  3. การดำเนินการที่จำเป็นจะดำเนินการโดยใช้วัตถุที่สร้างขึ้นในขั้นตอนที่ 2
  4. วัตถุที่สร้างขึ้นในขั้นตอนที่ 2 ถูกปิด
  5. หากไม่ต้องการดำเนินการใดๆ อีกต่อไป กระแสข้อมูลที่ได้รับในขั้นตอนที่ 1 จะถูกปิด
  6. หากคุณต้องการทำงานกับสตรีมต่อไป คุณสามารถกำหนดตำแหน่งใหม่ในสตรีมได้ (หากรองรับการดำเนินการนี้) และทำงานต่อโดยเริ่มจากขั้นตอนที่ 2

เป็นที่น่าสังเกตว่าเป็นไปได้ที่จะรวมย่อหน้าที่ 1 และ 2 กล่าวอีกนัยหนึ่งระบบให้ความสามารถในการสร้างวัตถุ อ่านข้อมูล/เขียนข้อมูลโดยตรงจากวัตถุ BinaryData ตัวอย่างเช่น
ในการดำเนินการต่างๆ กับข้อมูลไบนารี ระบบจะจัดเตรียมความสามารถในการรับบางส่วนของสตรีมเป็นส่วนที่แยกจากกันด้วยการเข้าถึง (อ็อบเจ็กต์) แบบสุ่ม (ไบต์ต่อไบต์) บัฟเฟอร์BinaryData). ขนาดบัฟเฟอร์ถูกตั้งค่าไว้เมื่อสร้างขึ้น และไม่สามารถเปลี่ยนแปลงได้ในภายหลัง เมื่อทำงานกับบัฟเฟอร์ข้อมูลไบนารี คุณสามารถทำงานกับจำนวนความลึกบิตที่แตกต่างกันได้
เป็นหนึ่งเดียว ในกรณีนี้ คุณสามารถระบุลำดับไบต์เป็นคำว่า "little endian" หรือ "big endian" (big endian) นอกจากนี้ยังสามารถแยกบัฟเฟอร์หนึ่งออกเป็นหลายบัฟเฟอร์และรวมบัฟเฟอร์ข้อมูลไบนารีหลายบัฟเฟอร์ให้เป็นบัฟเฟอร์ผลลัพธ์เดียวได้
สิ่งสำคัญที่ควรทราบคือการทำงานกับบัฟเฟอร์ข้อมูลไบนารีสามารถทำให้การใช้งานง่ายขึ้นอย่างมาก หากใช้งานข้อมูลไบนารีบนฝั่งแอปพลิเคชันไคลเอ็นต์ในโหมดอะซิงโครนัส ในกรณีนี้ การอ่านข้อมูลลงในบัฟเฟอร์จะดำเนินการเป็นการดำเนินการแบบอะซิงโครนัส และการทำงานกับข้อมูลบัฟเฟอร์จะเป็นแบบซิงโครนัส
การทำงานกับข้อมูลไบนารี่นั้นมีอยู่ในฝั่งไคลเอ็นต์ (รวมถึงเว็บไคลเอ็นต์) ของแอปพลิเคชันและฝั่งเซิร์ฟเวอร์ รวมถึงในรูปแบบการทำงานแบบซิงโครนัสและอะซิงโครนัส ตัวอย่างเพิ่มเติมจะใช้โครงร่างการทำงานแบบซิงโครนัส

16.3.2. การอ่านข้อมูลไบนารี

เป็นตัวอย่างในการอ่านข้อมูลไบนารี เราจะพิจารณางานกำหนดรูปแบบไฟล์ที่ถูกต้องที่เลือกในระบบเพื่อนำไปใช้ต่อไป ไฟล์ .wav ที่มีข้อมูลเสียงจะถูกนำมาใช้เป็นไฟล์ที่กำลังตรวจสอบ ในการจัดเก็บไฟล์ .wav จะใช้ Resource Interchange File Format (RIFF) ซึ่งมีคำอธิบายอยู่ที่ลิงก์:

https://msdn.microsoft.com/enus/library/windows/desktop/ee415713.aspx (ที่ ภาษาอังกฤษ). สำหรับตัวอย่างการอ่าน จะใช้ข้อมูลรูปแบบต่อไปนี้:
1. 4 ไบต์แรกของไฟล์มีตัวระบุรูปแบบ: RIFF
2. 4 ไบต์ถัดไปจะมีขนาดของข้อมูลเสียงตามจริงตามลำดับไบต์เล็กๆ
3. 4 ไบต์ถัดไปประกอบด้วยประเภทข้อความของข้อมูลที่ใช้: WAVE
ในการดำเนินการเหล่านี้ คุณจะต้องใช้รหัสต่อไปนี้ในภาษาที่มีอยู่แล้ว:

อ่าน = ใหม่ ReadData(ชื่อไฟล์, ByteEndian.LittleEndian);
FileFormat = Read.ReadCharacters(4);
DataSize = Read.ReadInteger32();
FileType = Read.ReadCharacters(4);
ถ้าเป็นไฟล์ฟอร์แมต<>“ริฟ” แล้ว
รายงาน ("นี่ไม่ใช่ไฟล์ RIFF");
กลับ ;
สิ้นสุดถ้า ;
ถ้า FileType = “WAVE” แล้ว
รายงาน (“นี่คือไฟล์ WAV ที่มีข้อมูล, ขนาด ” + DataSize + ” ไบต์”);
มิฉะนั้น
รายงาน (“นี่ไม่ใช่ไฟล์ WAV”);
กลับ;
สิ้นสุดถ้า;

ลองดูตัวอย่างโดยละเอียดเพิ่มเติม
ขั้นแรก ไฟล์ที่มีชื่ออยู่ในตัวแปร FileName จะถูกเปิด ไฟล์จะถูกเปิดเพื่อการอ่าน ( FileOpenMode.เปิด) จะอ่านจากไฟล์เท่านั้น ( FileAccess อ่าน) และบัฟเฟอร์ขนาด 16 ไบต์จะถูกใช้สำหรับการอ่าน
จากนั้นสตรีมจะถูกสร้างขึ้นสำหรับการอ่านข้อมูล ซึ่งจะมีลำดับไบต์ที่มีนัยสำคัญน้อยที่สุดสำหรับข้อมูลประเภทตัวเลข จากนั้นอักขระ 4 ตัว ซึ่งเป็นจำนวนเต็ม 32 บิต และอักขระอีก 4 ตัวจะถูกอ่านจากสตรีมผลลัพธ์ ข้อมูลผลลัพธ์จะถูกวิเคราะห์ และขึ้นอยู่กับผลลัพธ์ของการวิเคราะห์ จะมีการตัดสินใจว่าไฟล์ที่เลือกเป็นไฟล์ .wav หรือไม่

16.3.3. การเขียนข้อมูลไบนารี

การเขียนข้อมูลไบนารี่ลงไฟล์ ในกรณีที่ง่ายที่สุด ทำได้ดังนี้:

รายการ = ใหม่ WriteData(ชื่อไฟล์);
สำหรับดัชนี = 0 ถึง 255 รอบ
เขียน WriteByte (ดัชนี);
สิ้นสุดรอบ;
บันทึกปิด() ;

ตัวอย่างนี้เขียนลงในไฟล์ตามลำดับไบต์ตั้งแต่ 0 ถึง 255 (0xFF ในรูปแบบเลขฐานสิบหก) นี่คือตัวเลือกการบันทึกที่ง่ายที่สุด
คุณยังสามารถใช้วิธีที่คล้ายกับวิธีการอ่านที่กล่าวถึงในตัวอย่างก่อนหน้านี้ โดยรับสตรีมไฟล์และข้อมูลถูกเขียนลงในสตรีมไฟล์นี้

16.3.4. การทำงานกับบัฟเฟอร์ข้อมูลไบนารี

ตามที่กล่าวไว้ข้างต้น บัฟเฟอร์ข้อมูลไบนารี่มอบวิธีที่สะดวกในการจัดการส่วนย่อยของข้อมูลไบนารี่
ไม่เพียงแต่รองรับการอ่านข้อมูลเท่านั้น แต่ยังรองรับการเขียนอีกด้วย
ตามตัวอย่าง เราจะพิจารณาแยกวิเคราะห์ส่วนหัวของไฟล์ RIFF จากตัวอย่างการอ่านข้อมูล (ดูที่นี่) ในการสร้างตัวอย่าง จะใช้ข้อมูลที่เหมือนกันทุกประการเกี่ยวกับรูปแบบไฟล์ ดังนั้นจึงจำเป็นต้องอ่านบัฟเฟอร์ขนาดเท่ากับส่วนหัวของไฟล์จากไฟล์ต้นฉบับ ส่วนหัวประกอบด้วยฟิลด์ขนาด 4 ไบต์สามฟิลด์ ดังนั้นจึงต้องอ่าน 12 ไบต์

บัฟเฟอร์ = ใหม่ บัฟเฟอร์BinaryData(12);
ไฟล์= FileStreams.Open(ไดเรกทอรีไฟล์ชั่วคราว() + “Windows Logon.wav”, FileOpenMode.เปิด, FileAccess อ่าน);
ไฟล์.อ่าน(บัฟเฟอร์, 0, 12);
ขนาด= บัฟเฟอร์ ReadInteger32(4);
StreamString = newStreamInMemory (บัฟเฟอร์);
StreamRows.Go(0, ตำแหน่งInStream.Start);

รูปแบบไฟล์ = ReadLines.ReadCharacters(4, “วินโดวส์-1251”);
ReadLines.ปิด();
StreamRows.Go(8, ตำแหน่งInStream.Start);
RowReader = DataReader ใหม่ (RowStream);
ประเภทไฟล์= ReadLines.ReadCharacters( 4, “หน้าต่าง-1251”);
ReadLines.ปิด();

กระบวนการรับข้อมูลลงในบัฟเฟอร์ข้อมูลไบนารีนั้นไม่มีอะไรพิเศษ การดำเนินการเพิ่มเติมจำเป็นต้องมีความคิดเห็นบางประการ การอ่านตัวเลขของความลึกบิตที่รองรับสามารถทำได้จากตำแหน่งใดๆ ในบัฟเฟอร์ ใน ในตัวอย่างนี้ บัฟเฟอร์ ReadInteger32(4); หมายถึงการอ่านจำนวนเต็ม 32 บิตโดยเริ่มจากไบต์ 4 ของบัฟเฟอร์ ดังนั้น หากคุณต้องการอ่านตัวเลขหลายตัวที่อยู่ในตำแหน่งต่างๆ ในบัฟเฟอร์ ก็สามารถทำได้โดยไม่ต้องวางตำแหน่งโดยตรงในบัฟเฟอร์นั้น
อย่างไรก็ตาม การอ่านสตริงไม่ได้รับการสนับสนุนโดยบัฟเฟอร์ข้อมูลไบนารี ดังนั้น คุณควรใช้วัตถุที่อนุญาตให้คุณทำสิ่งนี้: อ่านข้อมูล ไม่สามารถสร้างวัตถุ DataReader จากบัฟเฟอร์ข้อมูลไบนารี แต่ขึ้นอยู่กับบัฟเฟอร์ข้อมูลไบนารี คุณสามารถสร้างสตรีมที่เป็นตัวกลางสากลระหว่างตำแหน่งที่จัดเก็บข้อมูลทางกายภาพ (ไฟล์ บัฟเฟอร์ข้อมูลไบนารี) และออบเจ็กต์ระดับสูงที่ช่วยให้คุณทำงานกับข้อมูลนี้ได้
เมื่อวัตถุ DataReader ถูกสร้างขึ้นตามกระแสข้อมูล จะเริ่มอ่านข้อมูลจากตำแหน่งใน ช่วงเวลานี้ติดตั้งในสตรีม ดังนั้นในตัวอย่าง ตำแหน่งในสตรีมจะถูกตั้งค่าก่อน จากนั้นจึงสร้างวัตถุ DataReader และอ่านจำนวนอักขระที่ต้องการ คำอธิบายโดยละเอียดสำหรับความแตกต่างระหว่างจำนวนไบต์และอักขระเมื่ออ่านสตริง โปรดดูส่วนถัดไป 16.3.5

16.3.5. คุณสมบัติการใช้งาน

เมื่อใช้ข้อมูลไบนารี คุณควรคำนึงถึงคุณสมบัติการทำงานกับข้อมูลประเภทสตริงด้วย ลักษณะเฉพาะคือความยาวของสตริงที่ฟังก์ชันบริบทส่วนกลาง StrLength() ส่งกลับนั้นวัดเป็นอักขระ ในสัญลักษณ์ คุณควรระบุขนาดของข้อมูลที่จะอ่าน/เขียนในวิธีการเขียน/อ่านสตริงในวัตถุสำหรับการทำงานกับข้อมูลไบนารี ( อ่านอักขระ(),
อ่านสตริง(), เขียนอักขระ(), เขียนสตริง()). อย่างไรก็ตาม ไม่มีตัวเลือกที่ชัดเจนสำหรับการแปลงความยาวของสตริงเป็นอักขระให้เป็นพารามิเตอร์ที่คล้ายกันในหน่วยไบต์ อัตราส่วนนี้จะแตกต่างกันขึ้นอยู่กับเนื้อหาของสตริงและการเข้ารหัส ดังนั้น เมื่อทำงานกับโครงสร้างข้อมูลใดๆ ที่มีสตริงที่มีความยาวผันแปรได้ คุณควรเข้าใจอย่างชัดเจนว่าความยาวของสตริงนั้นแสดงเป็นหน่วยใด
หากในข้อมูลที่มีอยู่ ความยาวสตริงถูกระบุเป็นไบต์ และสตริงถูกระบุในการเข้ารหัสความยาวผันแปรได้หลายไบต์ (เช่น UTF-8) ดังนั้นให้ใช้ออบเจ็กต์ข้อมูลไบนารีเพื่ออ่านโครงสร้างดังกล่าวจากไฟล์ลงใน โดยทั่วไปข้อมูลประเภท String นั้นเป็นไปไม่ได้
แต่ในกรณีนี้ คุณสามารถเปลี่ยนตำแหน่งการอ่าน/เขียนในสตรีมไฟล์ได้อย่างง่ายดาย หากระบุความยาวของสตริงเป็นอักขระ ก็จะเป็นไปได้ที่จะอ่านสตริงดังกล่าวลงในข้อมูลประเภท String แต่จะเป็นไปไม่ได้ที่จะเปลี่ยนตำแหน่งการอ่าน/เขียนในสตรีมดังกล่าว
เมื่อต้องการรับความยาวของสตริงเป็นไบต์ คุณสามารถใช้ฟังก์ชันต่อไปนี้เพื่อแปลงสตริงเป็นวัตถุ BinaryData:

การทำงาน รับข้อมูลไบนารีจากสตริง(ค่า StrParameter, การเข้ารหัสค่า = “UTF-8”)
MemoryThread = ใหม่ MemoryThread;
นักเขียน = ใหม่ เขียนข้อมูล(StreamMemory);
Writer.เขียนสตริง(StrParameter, การเข้ารหัส);
นักเขียน.ปิด();
ส่งคืน StreamMemory.CloseAndGetBinaryData();
EndFunction

สามารถรับขนาดจริงเป็นไบต์ได้โดยการเรียกใช้ฟังก์ชัน Size() บนวัตถุ BinaryData ซึ่งได้มาจากผลลัพธ์ของฟังก์ชัน
ไม่แนะนำให้ใช้วัตถุพร้อมกัน อ่านข้อมูล/เขียนข้อมูลและสตรีมวัตถุ หากระหว่างการดำเนินการอ่านต่อเนื่องสองครั้งจาก ReadData หรือการดำเนินการเขียนต่อเนื่องสองครั้งไปยัง WriteData จะมีการเปลี่ยนแปลงตำแหน่งในสตรีมที่วัตถุ Ch ทำงาน ShadowData/WriteData– มีการสร้างข้อยกเว้น ดังนั้น ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการเปลี่ยนแปลงตำแหน่งที่ถูกต้องในสตรีมเมื่อเขียนข้อมูลไปยังสตรีม:

สตรีม = newStreamInMemory();

WriteData.WriteString("สวัสดีชาวโลก!");
WriteData ปิด();
สตรีม.โก (0, ตำแหน่งInStream.Start);
DataWrite = newDataWrite (สตรีม);
WriteData.WriteString("ลาก่อน!");
WriteData ปิด();
ตัวอย่างต่อไปนี้สวัสดีข้อยกเว้นที่ถูกโยนทิ้ง:

สตรีม = NewStreamInMemory();

WriteData.WriteString("สวัสดีชาวโลก!");
Stream.Go(0, ตำแหน่งInStream.Start);
// บรรทัดถัดไปจะมีข้อยกเว้น
WriteData.WriteString("ลาก่อน!");
ในเวลาเดียวกัน สถานการณ์อาจเป็นไปได้เมื่อพฤติกรรมของระบบจะไม่ถูกต้อง แต่จะไม่มีการสร้างข้อผิดพลาด:

กระแส = GetStream();
ReadData = ReadData ใหม่ (สตรีม);
TestString = ReadData.Read();
InitialPosition = กระแส.CurrentPosition();
DataWrite = newDataWrite (สตรีม);
WriteData.WriteString("สตริงที่ไม่คาดคิด");
WriteData.ปิด();
Stream.Go (ตำแหน่งเริ่มต้น, PositionInStream.Start);
// โดยทั่วไป เป็นไปไม่ได้ที่จะระบุค่าที่จะใส่ไว้ในตัวแปร TestString2
TestLine2 = ReadData.ReadLine();

พฤติกรรมที่อธิบายไว้ในส่วนนี้มีสาเหตุมาจาก o ออบเจ็กต์ Data Reader/Data Writer ใช้บัฟเฟอร์ของตัวเองเมื่อทำงานกับสตรีม เป็นผลให้ตำแหน่งที่แท้จริงของเธรดแตกต่างจากตำแหน่งลอจิคัลซึ่งเกิดขึ้นจากการดำเนินการที่เสร็จสมบูรณ์
นอกจากนี้ยังไม่รองรับการใช้วัตถุ Data Reader และ Data Writer พร้อมกันซึ่งใช้เธรดเดียวในการทำงาน

แพลตฟอร์มเทคโนโลยี 1C:Enterprise 8 ช่วยให้คุณสามารถบันทึกไฟล์ที่ต้องการในฐานข้อมูล เรียกค้นไฟล์เหล่านั้นจากที่นั่นและใช้งาน วิธีทางที่แตกต่าง. ลองดูการดำเนินการเหล่านี้โดยใช้ตัวอย่าง

ก่อนที่จะอัปโหลดไฟล์ไปยังฐานข้อมูล 1C คุณจะต้องได้รับที่อยู่แบบเต็มของไฟล์บนดิสก์ การทำงานกับกล่องโต้ตอบการเลือกไฟล์อธิบายไว้ในไฟล์ .

หากต้องการจัดเก็บไฟล์ ให้ใช้แอตทริบิวต์ (หรือลงทะเบียนทรัพยากร) กับประเภท ค่าการจัดเก็บข้อมูล.

การอัปโหลดไฟล์ที่กำหนดเองไปยังฐานข้อมูล 1C

ไฟล์ใดๆ ก็สามารถแสดงเป็นข้อมูลไบนารีและโหลดเข้าไปได้ การจัดเก็บคุณค่า.

เมื่อแปลงข้อมูลไบนารี่เป็นวัตถุ ค่าการจัดเก็บข้อมูลการออกแบบที่ใช้ StorageValues ​​ใหม่ (ข้อมูล, การบีบอัด)ด้วยสองพารามิเตอร์:

  1. ข้อมูล— ข้อมูลไบนารีที่ต้องจัดเก็บไว้ในที่จัดเก็บข้อมูล
  2. การบีบอัด— อัตราการบีบอัดของอัลกอริธึมภาวะเงินฝืด จำนวนเต็มอยู่ในช่วง -1...9 -1 คือระดับการบีบอัดเริ่มต้น 0 - ไม่มีการบีบอัด 9 - การบีบอัดสูงสุด ค่าเริ่มต้น: -1 พารามิเตอร์เป็นทางเลือก หากไม่ได้ระบุ จะไม่มีการใช้การบีบอัด

//แปลงไฟล์เป็นข้อมูลไบนารี่
ไฟล์ = BinaryData ใหม่ (เส้นทาง);

//สร้างวัตถุ Value Storage ใหม่

DataStorage = NewValueStorage (ไฟล์, NewDataCompression(9) ) ;

บันทึกไฟล์ที่กำหนดเองจากฐานข้อมูล 1C ลงดิสก์

หากต้องการบันทึกไฟล์จากฐานข้อมูล 1C ลงดิสก์ คุณต้องกำหนดเส้นทางและชื่อไฟล์ ในการทำเช่นนี้จะมีกล่องโต้ตอบการบันทึกไฟล์ซึ่งใช้งานได้ตามที่อธิบายไว้

//รับข้อมูลไบนารีจากที่เก็บข้อมูล
//การจัดเก็บข้อมูล - แอตทริบิวต์ของวัตถุที่มีประเภทการจัดเก็บข้อมูล

//เขียนข้อมูลที่ได้รับลงดิสก์
//ใน เส้นทางตัวแปรคือที่อยู่แบบเต็มของไฟล์บนดิสก์
ข้อมูล. เขียน(เส้นทาง) ;

การดูไฟล์ที่อยู่ในฐานข้อมูล 1C

หากต้องการดูไฟล์ที่บันทึกไว้ในฐานข้อมูล คุณต้องมีแอปพลิเคชันที่ติดตั้งบนคอมพิวเตอร์ของคุณเพื่อเปิดไฟล์

//รับชื่อของไฟล์ชั่วคราวที่มีนามสกุลที่ต้องการ
//ในตัวแปร Extension คุณต้องใส่นามสกุลไฟล์ เช่น "pdf"
เส้นทาง = GetTemporaryFileName (ส่วนขยาย);

//รับข้อมูลจากที่เก็บข้อมูล
//การจัดเก็บข้อมูล - แอตทริบิวต์ของวัตถุที่มีประเภทการจัดเก็บข้อมูล
ข้อมูล = พื้นที่เก็บข้อมูล รับ() ;

//เขียนข้อมูลลงไฟล์ชั่วคราว
ข้อมูล. เขียน(เส้นทาง) ;

//กำลังพยายามเปิดไฟล์ในแอปพลิเคชันที่ต้องการ
//หากไม่พบแอปพลิเคชัน หน้าต่างโต้ตอบของระบบ "เปิดด้วย..." จะปรากฏขึ้น
เปิดตัวแอปพลิเคชัน (เส้นทาง);

ข้อมูลเกือบทุกชนิดสามารถจัดเก็บไว้ในที่จัดเก็บคุณค่าได้ เช่น

... รูปภาพ (ภาพถ่าย):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Enumerations.Types ของข้อมูลเพิ่มเติมของ Objects.Image; ที่เก็บข้อมูล = NewValueStorage (NewPicture, NewDataCompression ()); CurrentImage.Storage = Storage.Get();

// ในที่นี้จะแสดงทุกอย่าง... Form Elements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...เอกสารสเปรดชีต:

TabDoc=เอกสารตารางใหม่; TabDoc.Output(FormElements.TabularDocumentField1); ที่เก็บข้อมูล = NewValueStorage (TabDoc); เขียน();

สิ้นสุดขั้นตอน

ขั้นตอน RestoreFromStoragePress (องค์ประกอบ)

TabDoc=Storage.Get(); ถ้า TabDoc<>ไม่ได้กำหนดแล้วFormElements.TabularDocumentField1.Output(TabDoc); สิ้นสุดถ้า;

สิ้นสุดขั้นตอน

...ไฟล์โดยพลการ (ข้อมูลไบนารี):

XZ = NewValueStorage(NewBinaryData(ไฟล์));

Eight รองรับการบีบอัดข้อมูลที่อยู่ในที่จัดเก็บข้อมูล:

XZ = NewValueStorage(NewBinaryData(ไฟล์),NewDataCompression(9));

... การประมวลผลและการรายงานภายนอก:

ขั้นตอน LoadProcessingIntoStorage (PropsStorageType)

อัตราการบีบอัด = การบีบอัดข้อมูลใหม่ (9); //9 PropsStorageType สูงสุด = New StorageValues(BinaryData ใหม่("c:\reports\report.epf", อัตราการบีบอัด));

สิ้นสุดขั้นตอน

ขั้นตอน StartProcessingFromStorage(PropsStorageType)

TemporaryFileName = TemporaryFileDirectory()+"report.epf"; BinaryData = PropsStorageType.Get(); BinaryData.Write (ชื่อไฟล์ชั่วคราว); ExternalProcessing = ExternalProcessing.Create (ชื่อไฟล์ชั่วคราว); ExternalProcessing.GetForm().เปิด();

สิ้นสุดขั้นตอน

ทำงานกับที่เก็บข้อมูล

หากเป็นข้อมูลไบนารี่ ก็สามารถกู้คืนได้จากที่เก็บค่าโดยใช้วิธี Get และเขียนลงในไฟล์โดยใช้วิธี Write()

ถ้า TypeValue (ที่เก็บข้อมูล)<>พิมพ์("BinaryData") จากนั้น

BinaryData = Storage.Get();

BinaryData = ที่เก็บข้อมูล;

สิ้นสุดถ้า; BinaryData.Write (ชื่อไฟล์);

ตัวอย่างเช่น หากเป็นเอกสาร Word (ไฟล์ doc หรือไฟล์ประเภทอื่นที่ลงทะเบียน) ก็สามารถเปิดได้ดังนี้:

LaunchApplication (ชื่อไฟล์);

หากต้องการล้างฟิลด์ประเภท Value Storage คุณจะต้องกำหนด Undefinition:

PropsStorage = ไม่ได้กำหนด;

การทำงานกับไฟล์และรูปภาพในภาษาในตัว 1C:Enterprise 8

วัตถุประสงค์

แอปพลิเคชันที่ได้รับการจัดการใช้กลไกใหม่ในการทำงานกับไฟล์ ให้การแลกเปลี่ยนไฟล์ระหว่างฐานข้อมูลและแอปพลิเคชันไคลเอนต์ คุณสมบัติ กลไกนี้คือมันมีไว้สำหรับใช้ใน ไคลเอนต์แบบบางและเว็บไคลเอ็นต์ และได้รับการออกแบบมาเพื่อคำนึงถึงข้อจำกัดในการจัดการไฟล์ที่กำหนดโดยเว็บเบราว์เซอร์

กลไกนี้เป็นชุดของวิธีการที่สามารถใช้เพื่อวางข้อมูลที่ผู้ใช้จัดเก็บไว้ในเครื่องลงในพื้นที่เก็บข้อมูลชั่วคราว ฐานข้อมูลให้ถ่ายโอนข้อมูลนี้จากที่เก็บข้อมูลชั่วคราวไปยังฐานข้อมูลและนำกลับไปยังคอมพิวเตอร์ของผู้ใช้ ปัญหาการใช้งานที่พบบ่อยที่สุดที่แก้ไขได้ด้วยกลไกนี้คือการจัดเก็บข้อมูลที่แนบมา เช่น รูปภาพสินค้า เอกสารที่เกี่ยวข้องกับสัญญา เป็นต้น

ขอบเขตวิธีการ

การจัดเก็บชั่วคราว

ที่จัดเก็บข้อมูลชั่วคราวเป็นพื้นที่เฉพาะของฐานข้อมูลที่สามารถวางข้อมูลไบนารีได้ วัตถุประสงค์หลักคือการจัดเก็บข้อมูลชั่วคราวระหว่างการโต้ตอบระหว่างไคลเอนต์และเซิร์ฟเวอร์ก่อนที่จะถูกถ่ายโอนไปยังฐานข้อมูล

ความจำเป็นในการจัดเก็บข้อมูลชั่วคราวเกิดขึ้นเนื่องจากรูปแบบการทำงานของเว็บเบราว์เซอร์ต้องการให้โอนไฟล์ที่ผู้ใช้เลือกไปยังเซิร์ฟเวอร์โดยตรงโดยไม่ต้องจัดเก็บไว้ในไคลเอนต์ เมื่อไฟล์ถูกถ่ายโอน ไฟล์จะถูกวางไว้ในที่จัดเก็บชั่วคราว และสามารถนำมาใช้เมื่อเขียนออบเจ็กต์ไปยังฐานข้อมูล

งานแอปพลิเคชันทั่วไปส่วนใหญ่ที่แก้ไขได้โดยที่เก็บข้อมูลชั่วคราวคือการให้การเข้าถึงไฟล์หรือรูปภาพก่อนที่วัตถุจะถูกบันทึกในฐานข้อมูล ตัวอย่างเช่น ในรูปแบบขององค์ประกอบ

ไฟล์หรือข้อมูลไบนารีที่วางไว้ในที่จัดเก็บข้อมูลจะถูกระบุด้วยที่อยู่เฉพาะ ซึ่งสามารถนำมาใช้ในการเขียน อ่าน หรือลบได้ในภายหลัง ที่อยู่นี้กำหนดโดยวิธีการเขียนไฟล์ไปยังที่เก็บข้อมูลชั่วคราว วิธีการแยกต่างหากในภาษาในตัวช่วยให้คุณสามารถระบุได้ว่าที่อยู่ที่ส่งนั้นเป็นที่อยู่ที่ชี้ไปยังข้อมูลในที่จัดเก็บข้อมูลชั่วคราวหรือไม่

ฐานข้อมูล

กลไกนี้ช่วยให้คุณเข้าถึงข้อมูลไบนารีที่จัดเก็บไว้ในแอตทริบิวต์ของประเภทการจัดเก็บค่า

เช่นเดียวกับในกรณีของการจัดเก็บชั่วคราว การเข้าถึงข้อมูลสามารถทำได้ผ่านที่อยู่พิเศษ คุณสามารถรับมันได้ด้วยวิธีการพิเศษโดยส่งลิงก์ไปยังออบเจ็กต์หรือคีย์รายการลงทะเบียนข้อมูล และชื่อของแอททริบิวต์ ในกรณีของส่วนที่เป็นแบบตาราง จำเป็นต้องถ่ายโอนดัชนีแถวของส่วนที่เป็นแบบตารางเพิ่มเติม

วิธีการทำงานกับไฟล์มีข้อจำกัดเมื่อทำงานกับรายละเอียดฐานข้อมูล สำหรับพวกเขา ไม่เหมือนกับที่เก็บข้อมูลชั่วคราว มีเพียงข้อมูลการอ่านเท่านั้นที่สามารถใช้ได้ แต่ไม่สามารถเขียนหรือลบข้อมูลได้

คำอธิบายวิธีการทำงานกับไฟล์

การบันทึกข้อมูลลงที่จัดเก็บข้อมูลชั่วคราว

สถานการณ์ทั่วไปส่วนใหญ่สำหรับการใช้กลไกนี้เกี่ยวข้องกับการเริ่มวางข้อมูลผู้ใช้ในพื้นที่เก็บข้อมูลชั่วคราว มีสองวิธีสำหรับสิ่งนี้: PlaceFile() และ PlaceFileInTemporaryStorage()

วิธีแรก PlaceFile() จะวางไฟล์จากระบบไฟล์ในเครื่องไปไว้ในที่เก็บข้อมูลชั่วคราว วิธีการนี้สามารถรับที่อยู่เป้าหมายในการจัดเก็บได้ หากไม่ได้กำหนดไว้หรือเป็น บรรทัดว่างจากนั้นไฟล์ใหม่จะถูกสร้างขึ้นและเมธอดจะส่งคืนที่อยู่ผ่านพารามิเตอร์ที่เกี่ยวข้อง

หากพารามิเตอร์ที่กำหนดโหมดการทำงานแบบโต้ตอบเป็น True วิธีการดังกล่าวจะแสดงกล่องโต้ตอบการเลือกไฟล์มาตรฐานซึ่งคุณสามารถเลือกไฟล์ที่จะวางในที่เก็บข้อมูลได้ ในกรณีนี้เมธอดจะส่งคืนที่อยู่ของไฟล์ที่เลือกด้วย

เป็นผลให้วิธีการส่งกลับค่าเท็จหากผู้ใช้ปฏิเสธที่จะดำเนินการโต้ตอบในกล่องโต้ตอบการเลือกไฟล์ วิธีการนี้มีเฉพาะบนไคลเอนต์เท่านั้น

วิธีที่สอง PlaceFileInTemporaryStorage() คล้ายกับวิธีก่อนหน้า ยกเว้นว่ามันมีอยู่บนเซิร์ฟเวอร์ และข้อมูลที่จะเขียนไปยังที่เก็บข้อมูลชั่วคราวไม่ได้แสดงเป็นเส้นทางในระบบไฟล์ แต่เป็น ประเภทตัวแปรข้อมูลไบนารี ในทำนองเดียวกัน หากไม่มีการระบุที่อยู่เป้าหมาย ไฟล์ใหม่จะถูกสร้างขึ้นในพื้นที่จัดเก็บข้อมูล ที่อยู่ของมันจะถูกส่งกลับตามผลลัพธ์ของฟังก์ชัน

การดึงไฟล์จากที่เก็บข้อมูลชั่วคราว

เมื่อเขียนออบเจ็กต์ลงในฐานข้อมูล คุณอาจต้องแยกข้อมูลจากที่จัดเก็บข้อมูลชั่วคราวและวางไว้ในแอตทริบิวต์ เป็นต้น มีวิธีเซิร์ฟเวอร์ที่สอดคล้องกันสำหรับสิ่งนี้ - GetFileFromTemporaryStorage() วิธีการนี้จะดึงข้อมูลจากที่เก็บข้อมูลชั่วคราวและส่งคืนตามผลลัพธ์ ในการดำเนินการนี้ คุณจะต้องระบุที่อยู่ในที่เก็บข้อมูลชั่วคราว ที่อยู่นี้จะถูกส่งกลับโดยวิธีที่อธิบายไว้ข้างต้น PlaceFile() และ PlaceFileInTemporaryStorage() หากดำเนินการได้สำเร็จ

การลบไฟล์ออกจากที่เก็บข้อมูลชั่วคราว

หลังจากบันทึกข้อมูลในรายละเอียดแล้ว สามารถลบไฟล์ในที่จัดเก็บข้อมูลชั่วคราวได้ เพื่อจุดประสงค์นี้มีเมธอด DeleteFileFromTemporaryStorage() ซึ่งจะลบไฟล์ออกจากที่เก็บข้อมูลชั่วคราว วิธีการนี้ใช้เป็นพารามิเตอร์ที่อยู่ของไฟล์ในที่เก็บข้อมูลชั่วคราว มีอยู่บนเซิร์ฟเวอร์

ตรวจสอบที่อยู่เพื่อจัดเก็บชั่วคราว

ที่อยู่ไฟล์สามารถระบุทั้งที่เก็บข้อมูลชั่วคราวและรายละเอียดในฐานข้อมูล หากต้องการตรวจสอบชนิดของมัน มีวิธี This isTemporaryStorageAddress()

จะตรวจสอบว่าที่อยู่ที่ส่งนั้นเป็นที่อยู่ที่ชี้ไปยังร้านค้า คืนค่า True ถ้าที่อยู่ชี้ไปที่ที่เก็บข้อมูลชั่วคราว วิธีการนี้มีอยู่บนเซิร์ฟเวอร์

การรับที่อยู่อุปกรณ์ประกอบฉาก

หลังจากที่ข้อมูลถูกวางในรายละเอียดในฐานข้อมูลแล้ว คุณอาจต้องเข้าถึงข้อมูลโดยใช้วิธีไฟล์

แต่ก่อนที่คุณจะได้รับข้อมูล เช่น จากพร็อพเพอร์ตี้ คุณต้องได้รับที่อยู่ของพร็อพเพอร์ตี้นี้เสียก่อน เพื่อจุดประสงค์นี้มีเมธอด GetFileAddressInformationBase()

มีวัตถุประสงค์เพื่อส่งคืนที่อยู่ไฟล์ในฐานข้อมูลตามพารามิเตอร์ดั้งเดิม ในการดำเนินการนี้ คุณจะต้องส่งคีย์อ็อบเจ็กต์ (ซึ่งอาจเป็นลิงก์ไปยังออบเจ็กต์หรือคีย์รายการลงทะเบียนข้อมูล) และชื่อของแอททริบิวต์ หากคุณต้องการรับที่อยู่ของไฟล์ที่จัดเก็บไว้ในคุณลักษณะของส่วนที่เป็นตาราง ก่อนชื่อคุณลักษณะในพารามิเตอร์ที่ระบุชื่อคุณลักษณะ คุณจะต้องเพิ่มชื่อของส่วนที่เป็นตารางและจุด “.” วิธีการนี้สามารถใช้ได้ทั้งบนไคลเอนต์และเซิร์ฟเวอร์

การดึงไฟล์จากฐานข้อมูล

GetFile() วิธีการรับไฟล์จากฐานข้อมูลและบันทึกไว้ในเครื่อง ระบบไฟล์ผู้ใช้ พารามิเตอร์แรกระบุที่อยู่ของไฟล์ในอุปกรณ์ประกอบฉากหรือที่เก็บไฟล์ชั่วคราว พารามิเตอร์ที่สองระบุตำแหน่งปลายทางของไฟล์ผลลัพธ์ ในโหมดไม่โต้ตอบ คุณต้องระบุเส้นทาง ในโหมดโต้ตอบ พารามิเตอร์เป็นทางเลือก

ตามค่าเริ่มต้น วิธีการจะดำเนินการในโหมดโต้ตอบ นั่นคือ พารามิเตอร์สุดท้ายคือ True ซึ่งหมายความว่ากล่องโต้ตอบจะปรากฏขึ้นซึ่งคุณสามารถระบุการดำเนินการกับไฟล์ที่ได้รับ: เรียกใช้หรือบันทึกลงในตำแหน่งที่ผู้ใช้ระบุ หากโหมดโต้ตอบทำงานอยู่และไม่ได้ระบุพารามิเตอร์พาธของไฟล์ดิสก์เป้าหมาย การดำเนินการเปิดไฟล์จะไม่พร้อมใช้งาน ส่งคืนค่าบูลีน เท็จหมายความว่าผู้ใช้เลือกที่จะยกเลิกการดำเนินการในกล่องโต้ตอบไฟล์บันทึกแบบโต้ตอบ

ตัวอย่างการใช้วิธีไฟล์

// การรับไฟล์จากดิสก์ในโหมดโต้ตอบ // และวางไว้ในที่เก็บข้อมูลชั่วคราว &ในขั้นตอนไคลเอนต์ SelectDiskFileAndWrite()

ชื่อตัวแปรที่เลือก; ที่อยู่การจัดเก็บชั่วคราวของตัวแปร; ถ้า PutFile(TemporaryStorageAddress, SelectedName, True) ดังนั้น Object.FileName = SelectedName; PlaceObjectFile (ที่อยู่การจัดเก็บชั่วคราว); สิ้นสุดถ้า;

สิ้นสุดขั้นตอน

// การคัดลอกไฟล์จากที่จัดเก็บข้อมูลชั่วคราวไปยังไดเร็กทอรี // คุณลักษณะ, การบันทึกวัตถุ, การลบไฟล์จากที่เก็บข้อมูลชั่วคราว // ที่จัดเก็บ &บนเซิร์ฟเวอร์ขั้นตอน วางไฟล์วัตถุ (ที่อยู่การจัดเก็บชั่วคราว)

องค์ประกอบไดเร็กทอรี = AttributesValue ของฟอร์ม ("วัตถุ"); BinaryData = GetFileFromTemporaryStorage(ที่อยู่ชั่วคราว); องค์ประกอบไดเรกทอรี ข้อมูลไฟล์ = NewValueStorage (BinaryData); FilePathOnDisk = ไฟล์ใหม่ (DirectoryItem.FileName); ไดเร็กทอรี Item.FileName = FilePathOnDisk.Name; องค์ประกอบไดเร็กทอรี เขียน (); แก้ไข = เท็จ; DeleteFileFromTemporaryStorage (ที่อยู่การจัดเก็บชั่วคราว); ValueFormAttributes(องค์ประกอบไดเร็กทอรี, "Object");

สิ้นสุดขั้นตอน

// อ่านไฟล์จากอุปกรณ์ประกอบฉากแล้วบันทึก // ไปที่ ดิสก์ภายในเครื่องในโหมดโต้ตอบ &ในขั้นตอนไคลเอนต์ ReadFileAndSaveToDisk()

ที่อยู่ = GetFileAddressInInformationBase (Object.Link, "FileData"); GetFile (ที่อยู่, Object.FileName, True);

สิ้นสุดขั้นตอน

รองรับที่อยู่ในช่องรูปภาพ

ตัวควบคุมเขตข้อมูลรูปภาพรองรับการแสดงรูปภาพที่ระบุโดยที่อยู่ของไฟล์ในที่เก็บข้อมูลชั่วคราวหรือในฐานข้อมูล

เมื่อต้องการทำเช่นนี้ คุณต้องตั้งค่าแอตทริบิวต์ในคุณสมบัติ Data ขององค์ประกอบแบบฟอร์ม ประเภทสตริง. ค่าของคุณลักษณะนี้จะถูกตีความว่าเป็นที่อยู่ของรูปภาพ

ตัวอย่าง // ผูกฟิลด์รูปภาพกับที่อยู่รูปภาพในที่เก็บข้อมูลชั่วคราว // AddressPictures แบบฟอร์มรายละเอียดประเภทสตริง

PlaceFile (ที่อยู่รูปภาพ, จริง)

Picture.Data = AddressPictures

ข้อจำกัดเมื่อทำงานกับเว็บไคลเอ็นต์

การทำงานของกลไกที่อธิบายไว้เมื่อใช้เว็บไคลเอ็นต์มีข้อจำกัดบางประการ ข้อจำกัดเหล่านี้เกี่ยวข้องกับรูปแบบการรักษาความปลอดภัยของเบราว์เซอร์ ตัวอย่างเช่น ไคลเอ็นต์ไม่สามารถบันทึกไฟล์ลงในระบบไฟล์ในเครื่องได้อย่างอิสระ นั่นคือ มีเพียงเวอร์ชันโต้ตอบของเมธอดไคลเอ็นต์ PlaceFile() และ GetFile() เท่านั้นที่พร้อมใช้งาน มีข้อยกเว้นเกิดขึ้นเมื่อพยายามใช้โหมดที่ไม่โต้ตอบ กล่องโต้ตอบซึ่งแสดงแบบโต้ตอบนั้นเฉพาะเจาะจงกับเบราว์เซอร์ประเภทใดประเภทหนึ่ง

คุณสมบัติเมื่อทำงานกับ Value Storage บนไคลเอนต์

ปัญหา:

เมื่อเอกสารมีแอตทริบิวต์ประเภทการจัดเก็บค่าในส่วนตาราง จะทำให้การเปิดแบบฟอร์มเอกสารช้าลงหากแอตทริบิวต์นี้มีข้อมูลขนาดใหญ่

เหตุผลที่คาดไว้:

บางทีเมื่อเปิดแบบฟอร์ม อาจไม่ใช่ลิงก์ไปยังข้อมูลที่อยู่ใน Value Store ที่ส่งไปยังไคลเอนต์ แต่เป็นข้อมูลเอง

สารละลาย

  • ในคุณสมบัติของแอตทริบิวต์ตารางของแบบฟอร์มจะมีธง "ใช้เสมอ" หากตั้งค่าไว้ เนื้อหาของฟิลด์จะถูกถ่ายโอนระหว่างเซิร์ฟเวอร์และไคลเอนต์เสมอ - ตัวอย่างเช่น เมื่อเปิดแบบฟอร์ม จะต้องปิดการใช้งานการตั้งค่าสถานะนี้ แต่จะต้องนำมาพิจารณาในรหัส เนื่องจากโดยค่าเริ่มต้นจะไม่มีค่าสำหรับฟิลด์นี้บนไคลเอนต์ ตัวอย่างสามารถพบได้ใน 1C:Archive

มันจะดีกว่าที่จะใช้ การจัดเก็บชั่วคราวเพื่อถ่ายโอนไฟล์ระหว่างไคลเอนต์และเซิร์ฟเวอร์