نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی
  • خانه
  • ویندوز 8
  • نحوه خواندن داده های باینری 1. گسترش عملکرد کار با داده های باینری

نحوه خواندن داده های باینری 1. گسترش عملکرد کار با داده های باینری

داده های باینری در 1C برای ذخیره فایل های با فرمت دلخواه طراحی شده است. با کمک آنها می توانید:

  • سازماندهی تعامل با استفاده از یک پروتکل باینری با دستگاه های مختلف.
  • ذخیره فایل ها با هر فرمتی به عنوان ویژگی یک شی فوق داده.
  • تبدیل داده های متنی به باینری (اغلب برای ارسال گزارش استفاده می شود).
  • کار با داده های باینری در حافظه

چه می تواند سیستم

هنگام کار با داده های باینری، پلت فرم 8.3 می تواند کارهای زیر را انجام دهد:

  1. انجام خواندن و نوشتن داده های باینری؛
  2. انتقال داده ها از مشتری به سرور و بازگشت با استفاده از ذخیره سازی موقت.
  3. یک شی از نوع "Picture" را با استفاده از فایل های باینری مقداردهی کنید.
  4. آنها را با استفاده از اشیاء MailAttachment، HTTPConnection و غیره از شبکه جهانی وب بخوانید.
  5. از ابزارهای رمزنگاری برای رمزگذاری و امضای پیوست های مهم استفاده کنید.
  6. تابع هش را با استفاده از شی DataHashing محاسبه کنید.

ذخیره داده ها در تجهیزات

به عنوان مثال، اجازه دهید یک دایرکتوری در یک پیکربندی آزمایشی ایجاد کنیم.

در واقع، استفاده از همان دایرکتوری برای ذخیره اطلاعات مربوط به نامگذاری و داده های تصویر باینری کمی اشتباه است. با حجم کافی داده و فایل های سنگین با اندازه بزرگ، خرابی و "ترمز" ناخواسته در سیستم ممکن است رخ دهد. از نقطه نظر سیستم، سازماندهی یک فهرست جداگانه "Pictures" بسیار صحیح تر است، پیوندی که می توانیم به عنوان یک نوع ویژگی به آن تنظیم کنیم.


توجه به این نکته مهم است که از آنجایی که ویژگی های نوع "ValueStorage" حاوی داده های باینری در حالت برنامه مدیریت شده در دسترس نیستند، فقط با استفاده از روش FormAttributesToValue می توان به آنها دسترسی داشت.


فیلد پیام یک ورودی داده باینری ذخیره مقدار را نشان می دهد.

خواندن داده ها از لوازم

بیایید پردازشی ایجاد کنیم که فایل ذخیره شده به شکل باینری در پیکربندی ما را در یک سند صفحه گسترده (برای مثال برای چاپ آرم شرکت ضروری است).


اساسا، این تمام کدی است که ما نیاز داریم. با استفاده از عملگر Get()، داده های باینری ذخیره شده در ویژگی مرجع مربوطه را می خوانیم و آن را به شی "Picture" منتقل می کنیم، که در سلول سمت چپ بالای سند صفحه گسترده فرم نشان داده می شود (شکل 9).

شکل 9

تبدیل داده ها

به ندرت، اما اتفاق می افتد که هنگام کار با مبادلات غیر استاندارد با سیستم های خارجی، لازم است داده ها را از فرمت باینری به فرمت Base64 یا برعکس تبدیل کنید.

در بیشتر موارد، پلت فرم به طور مستقل داده ها را تبدیل می کند، اگر این اتفاق نیفتد، باید از توابع ترجمه جهانی استفاده کنید:

  1. Base64String - مقدار داده شده را به رشته ای از رمزگذاری مربوطه ترجمه می کند.
  2. Base64Value - تبدیل معکوس را انجام می دهد.

بهینه سازی کد بالا

کد نشان داده شده در شکل 4 مطمئناً کار می کند، اما با یک اخطار مهم: اگر کادر "Modality use mode" در ویژگی های پیکربندی علامت زده شود (شکل 10). در غیر این صورت، استفاده از آن باعث خطا می شود.
شکل 10

برای جلوگیری از این اتفاق، در حالی که در ماژول فرم عنصر مرجع هستید، به منوی Text->Refactoring->Deprecated synchronous calls->Transform module calls بروید.

پس از مدتی، تماس‌های همزمان به طور خودکار به تماس‌های ناهمزمان تبدیل می‌شوند و کد شبیه به آن می‌شود (شکل 11)

شکل 11

شما می توانید تقریباً هر اطلاعاتی را در یک فروشگاه ارزش ذخیره کنید، به عنوان مثال،

... تصاویر (تصاویر):

CurrentImage.Object = TextFabric.Reference; CurrentImage.DataType = Enumerations.Types of AdditionalObjectsInformation.Image; Storage = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// در این مکان همه چیز را نمایش می دهد...FormElements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

... سند صفحه گسترده:

TabDoc=SpreadsheetDocument جدید; TabDoc.Output(FormElements.FieldofSpreadsheetDocument1); Storage=NewValueStorage(TabDoc); نوشتن()؛

پایان رویه

رویه RestoreFromStorageClick(Item)

TabDoc=Storage.Get(); اگر TabDoc<>ThenFormElements.SpreadsheetDocumentField1.Output(TabDoc) تعریف نشده؛ EndIf

پایان رویه

فایل های دلخواه (داده های باینری):

XS = NewValueStorage(New BinaryData(فایل));

Eight از فشرده سازی داده های قرار داده شده در ذخیره سازی پشتیبانی می کند:

XS = NewValueStorage(New BinaryData(file),NewCompression(9));

... پردازش و گزارش خارجی:

Procedure LoadProcessingToStorage (AttributeTypeStorage)

CompressionDegree = New DataCompression(9); //9 حداکثر PropsStorageType = NewStorageValues(NewBinaryData("c:\reports\report.epf"، Compression Degree));

پایان رویه

Procedure StartProcessingFromStorage (AttributeTypeStorage)

TempFileName = TempFileDirectory()+"report.epf"; BinaryData = PropsTypeStorage.Get(); BinaryData.Write(TempFileName); ExternalProcessing = ExternalProcessing.Create(TempFileName); ExternalProcessing.GetForm().Open();

پایان رویه

کار با ذخیره سازی

اگر BinaryData بود، می‌توان آن‌ها را با استفاده از متد Get از ذخیره‌سازی مقدار بازیابی کرد و با استفاده از متد Write() در فایل نوشت.

IfTypeVnch (ذخیره سازی)<>سپس ("BinaryData") را تایپ کنید

BinaryData = Storage.Get();

BinaryData = ذخیره سازی;

EndIf BinaryData.Write(FileName);

اگر به عنوان مثال، یک سند Word (فایل سند یا فایل دیگری از نوع ثبت شده) بود، می توان آن را به صورت زیر باز کرد:

StartApplication (نام فایل)؛

برای پاک کردن یک فیلد از نوع Value Storage، باید آن را به Undefined اختصاص دهید:

PropsStorage = تعریف نشده.

کار با فایل ها و تصاویر به زبان داخلی 1C: Enterprise 8

هدف

اپلیکیشن مدیریت شده مکانیزم جدیدی برای کار با فایل ها دارد. تبادل فایل بین infobase و برنامه مشتری را فراهم می کند. یکی از ویژگی های این مکانیزم این است که بر روی استفاده در تین کلاینت و وب کلاینت متمرکز است و با در نظر گرفتن محدودیت های اعمال شده بر روی فایل ها توسط مرورگرهای وب طراحی شده است.

مکانیسم مجموعه ای از روش هاست که می تواند برای قرار دادن داده های ذخیره شده به صورت محلی توسط کاربر در فضای ذخیره سازی موقت اطلاعات پایگاه داده، انتقال این اطلاعات از ذخیره سازی موقت به پایگاه داده و بازیابی آن به رایانه کاربر استفاده شود. متداول ترین وظایف کاربردی که توسط این مکانیسم حل می شود، ذخیره سازی اطلاعات همراه است، به عنوان مثال، تصاویر کالاها، اسناد مربوط به قراردادها و غیره.

محدوده روش ها

ذخیرهسازی موقت

ذخیره سازی موقت یک ناحیه تخصصی از پایگاه اطلاعاتی است که می توان داده های باینری را در آن قرار داد. هدف اصلی ذخیره سازی موقت اطلاعات در طول تعامل مشتری و سرور قبل از انتقال به پایگاه داده است.

نیاز به ذخیره سازی موقت از آنجا ناشی می شود که مدل مرورگر وب مستلزم انتقال فایل انتخاب شده توسط کاربر به طور مستقیم به سرور بدون امکان ذخیره آن در مشتری است. هنگامی که یک فایل منتقل می شود، در ذخیره سازی موقت قرار می گیرد و تنها پس از آن می توان هنگام نوشتن یک شی در پایگاه داده استفاده کرد.

معمولی‌ترین کار کاربردی که با ذخیره‌سازی موقت حل می‌شود، فراهم کردن دسترسی به فایل‌ها یا عکس‌ها قبل از نوشته شدن شی در پایگاه اطلاعاتی، به عنوان مثال، به شکل یک عنصر است.

یک فایل یا داده باینری که در فضای ذخیره سازی قرار می گیرد با یک آدرس منحصر به فرد شناسایی می شود که بعداً می تواند در عملیات نوشتن، خواندن یا حذف استفاده شود. این آدرس با روش هایی برای نوشتن یک فایل در ذخیره سازی موقت داده می شود. یک روش جداگانه در زبان 1C: Enterprise به شما امکان می دهد تعیین کنید که آیا آدرس ارسال شده آدرسی است که به داده های موجود در ذخیره سازی موقت اشاره می کند یا خیر.

پایگاه اطلاع رسانی

این مکانیسم امکان دسترسی به داده های باینری ذخیره شده در ویژگی های نوع ValueStorage را می دهد.

همانطور که در مورد ذخیره سازی موقت، دسترسی به اطلاعات از طریق یک آدرس خاص امکان پذیر است. شما می توانید آن را از طریق یک روش خاص، ارسال پیوند به یک شی یا یک کلید رکورد ثبت اطلاعات و نام ویژگی دریافت کنید. در مورد بخش جدولی، علاوه بر این لازم است که نمایه ردیف بخش جدولی را پاس کنید.

هنگام کار با جزئیات پایگاه اطلاعاتی، روش‌های کار با فایل‌ها محدود است. برای آنها، بر خلاف ذخیره سازی موقت، فقط خواندن اطلاعات در دسترس است، اما نه نوشتن یا حذف آن.

شرح روش های کار با فایل ها

ذخیره داده ها در ذخیره سازی موقت

معمولی ترین سناریو برای استفاده از این مکانیسم شامل قرار دادن اولیه داده های کاربر در ذخیره سازی موقت است. دو روش برای این کار وجود دارد: PlaceFile() و PlaceFileToTempStorage().

روش اول، PlaceFile()، یک فایل را از سیستم فایل محلی در ذخیره سازی موقت قرار می دهد. این روش می تواند آدرس هدف را در فروشگاه بپذیرد. اگر تعریف نشده باشد یا یک رشته خالی باشد، یک فایل جدید ایجاد می شود و متد آدرس آن را از طریق پارامتر مربوطه برمی گرداند.

اگر پارامتری که حالت تعاملی عملکرد را تعریف می کند True باشد، روش یک کادر محاوره ای استاندارد انتخاب فایل را نمایش می دهد که در آن می توانید فایلی را برای ذخیره در ذخیره سازی انتخاب کنید. در این صورت متد آدرس فایل انتخاب شده را نیز برمی گرداند.

در نتیجه، اگر کاربر به طور تعاملی از انجام عملیات در گفتگوی انتخاب فایل امتناع کند، روش False را برمی گرداند. این روش فقط برای مشتری موجود است.

روش دوم، PutFileInTempStorage()، مشابه روش قبلی است، با این تفاوت که در سرور موجود است و داده هایی که باید در ذخیره سازی موقت نوشته شوند نه به عنوان یک مسیر در سیستم فایل، بلکه به عنوان یک متغیر از نوع نشان داده می شوند. باینری دیتا. به همین ترتیب، اگر آدرس هدف مشخص نشده باشد، یک فایل جدید در مخزن ایجاد می شود. آدرس آن به عنوان نتیجه تابع برگردانده می شود.

بازیابی فایل از حافظه موقت

هنگام نوشتن یک شی در پایگاه اطلاعاتی، ممکن است لازم باشد داده‌ها را از ذخیره‌سازی موقت استخراج کنید و مثلاً در یک ویژگی قرار دهید. یک روش سرور مربوطه برای این وجود دارد - GetFileFromTemporaryStorage(). این روش داده ها را از ذخیره سازی موقت بازیابی می کند و در نتیجه آن را برمی گرداند. برای این کار باید آدرس را در حافظه موقت مشخص کنید. در صورت موفقیت آمیز بودن، این آدرس با روش های بالا PutFile() و PutFileToTempStorage() برگردانده می شود.

حذف یک فایل از حافظه موقت

پس از ذخیره داده ها در ویژگی، فایل موجود در ذخیره سازی موقت را می توان حذف کرد. برای انجام این کار، متد ()DeleteFileFromTemporaryStorage وجود دارد که یک فایل را از حافظه موقت حذف می کند. این روش آدرس یک فایل در ذخیره سازی موقت را به عنوان پارامتر می گیرد. در سرور موجود است.

بررسی اینکه آیا یک آدرس متعلق به یک حافظه موقت است

آدرس فایل می‌تواند به ذخیره‌سازی موقت و جزئیات موجود در پایگاه اطلاعات اشاره کند. برای بررسی نوع آن، متد ThisTemporalStorageAddress() وجود دارد.

بررسی می کند که آدرس ارسال شده آدرسی است که به فروشگاه اشاره دارد. اگر آدرس به حافظه موقت اشاره داشته باشد، True را برمی‌گرداند. این روش در سرور موجود است.

دریافت آدرس قطعات

پس از قرار دادن داده‌ها در پایه‌های پایگاه اطلاعاتی، ممکن است لازم باشد با استفاده از روش‌های فایل به آن دسترسی داشته باشید.

اما قبل از گرفتن داده، مثلاً از یک ویژگی، باید آدرس این ویژگی را دریافت کنید. یک متد GetFileAddressInInfobase() برای این کار وجود دارد.

هدف آن برگرداندن آدرس فایل در infobase مطابق با پارامترهای اصلی است. برای انجام این کار، باید کلید شی (این می تواند یک پیوند به شی یا یک کلید رکورد ثبت اطلاعات باشد) و نام ویژگی را ارسال کنید. اگر باید آدرس یک فایل ذخیره شده در یک ویژگی بخش جدولی را دریافت کنید، قبل از نام ویژگی در پارامتری که نام ویژگی را مشخص می کند، باید نام بخش جدولی و یک نقطه "." این روش هم روی کلاینت و هم روی سرور در دسترس است.

دریافت فایل از پایگاه اطلاعاتی

متد GetFile() فایلی را از پایگاه اطلاعات دریافت می کند و آن را در سیستم فایل محلی کاربر ذخیره می کند. اولین پارامتر آدرس فایل را در ویژگی یا در ذخیره سازی موقت فایل مشخص می کند. پارامتر دوم مقصد فایل حاصل را مشخص می کند. در حالت غیر تعاملی باید مسیر را مشخص کنید. در حالت تعاملی، پارامتر اختیاری است.

به طور پیش فرض، متد در حالت تعاملی اجرا می شود، یعنی آخرین پارامتر True است. این بدان معنی است که یک کادر محاوره ای نمایش داده می شود که در آن می توانید عملکرد فایل دریافتی را مشخص کنید: آن را اجرا کنید یا آن را در یک مکان مشخص شده توسط کاربر ذخیره کنید. اگر حالت تعاملی فعال باشد و مسیر مقصد به فایل در پارامتر دیسک مشخص نشده باشد، عملیات باز کردن فایل در دسترس نیست. یک مقدار بولی را برمی‌گرداند. نادرست به این معنی است که کاربر انتخاب کرده است که عملیات را در گفتگوی ذخیره آنلاین فایل لغو کند.

نمونه ای از استفاده از روش های فایل

// به صورت تعاملی یک فایل را از دیسک // دریافت کنید و آن را در حافظه موقت قرار دهید و در رویه مشتری SelectFileCDDiskAndWrite()

متغیر SelectedName; آدرس متغیر ذخیره سازی موقت؛ اگر PutFile (TempStorageAddress، SelectedName، True) سپس Object.FileName = SelectedName; PlaceObjectFile(AddressTemporaryStorage)؛ EndIf

پایان رویه

// کپی کردن یک فایل از ذخیره سازی موقت به یک ویژگی //، نوشتن یک شی، حذف یک فایل از ذخیره سازی موقت // &AtServer Procedure PlaceObjectFile(TemporaryStorageAddress)

Element Directory = FormAttributeToValue("Object"); BinaryData = GetFileFromTempStorage(TempStorageAddress); DirectoryItem.FileData = NewValueStorage(BinaryData); FilePathOnDisk = فایل جدید (DirectoryItem.FileName); کاتالوگ Element.FileName = FilePathOnDisk.Name; ElementDirectory.Write(); اصلاح شده = نادرست DeleteFileFromTemporaryStorage(AddressTemporaryStorage)؛ ValueVFormAttribute(DirectoryItem، "Object");

پایان رویه

// خواندن فایل از ویژگی و ذخیره آن // در دیسک محلی در حالت تعاملی &AtClient رویه ReadFileAndSaveToDisk()

آدرس = GetFileAddressInInfobase(Object.Link، "FileData"); GetFile (آدرس، Object.FileName، True)؛

پایان رویه

پشتیبانی از آدرس ها در قسمت تصویر

کنترل Image Field از نمایش یک تصویر مشخص شده توسط آدرس یک فایل در ذخیره سازی موقت یا در پایگاه داده پشتیبانی می کند.

برای انجام این کار، در ویژگی Data عنصر فرم، باید یک ویژگی نوع رشته را مشخص کنید. مقدار این ویژگی به عنوان آدرس تصویر تفسیر می شود.

مثال // اتصال فیلد تصویر به آدرس تصویر در ذخیره سازی موقت //. نوع رشته از فرم AddressImage

PlaceFile (ImageAddr, True)

Image.Data = ImageAddress

محدودیت ها هنگام کار با سرویس گیرنده وب

عملکرد مکانیسم توصیف شده هنگام استفاده از Web Client دارای محدودیت هایی است. این محدودیت ها به ویژگی های مدل امنیتی مرورگر مربوط می شود. بنابراین، برای مثال، کلاینت به تنهایی نمی‌تواند فایل را در سیستم فایل محلی ذخیره کند، یعنی فقط نسخه تعاملی روش‌های کلاینت ()PlaceFile و GetFile() موجود است. تلاش برای استفاده از حالت غیر تعاملی یک استثنا ایجاد می کند. کادرهای محاوره ای که به صورت تعاملی نمایش داده می شوند، مختص یک نوع مرورگر خاص هستند.

ویژگی های هنگام کار با Value Store روی مشتری

مسئله:

هنگامی که یک سند در بخش جدول دارای ویژگی از نوع ValueStorage باشد، اگر این ویژگی حاوی داده های بزرگ باشد، باز شدن فرم سند را کند می کند.

دلیل پیشنهادی:

شاید هنگام باز کردن فرم، پیوندی به داده های موجود در Value Store برای مشتری ارسال نشود، بلکه خود داده ها ارسال می شود.

راه حل

  • یک پرچم "استفاده از همیشه" در ویژگی های صفت جدول فرم وجود دارد. اگر تنظیم شود، محتوای فیلد همیشه بین سرور و مشتری منتقل می شود - به عنوان مثال، زمانی که یک فرم باز می شود. این پرچم باید غیرفعال باشد، اما شما باید این را در کد در نظر بگیرید، زیرا به طور پیش فرض هیچ مقداری برای این فیلد در مشتری وجود نخواهد داشت. یک مثال را می توان در 1C مشاهده کرد: بایگانی.

استفاده از آن حتی بهتر است ذخیرهسازی موقتبرای انتقال فایل بین کلاینت و سرور

چاپ (Ctrl+P)

16.3. کار با داده های باینری

16.3.1. اطلاعات کلی

هنگام پیاده سازی راه حل های کاربردی، موقعیت هایی امکان پذیر است که تجزیه و تحلیل داده های باینری مختلف ضروری باشد. برای مثال، باید نوع فایل را با امضا مشخص کرد یا دستکاری هایی با تصویر انجام داد. 1C: Enterprise رابط های برنامه نویسی ویژه ای را برای کار با داده های باینری فراهم می کند. در ادامه، امکانات کار با داده های باینری در نظر گرفته می شود.
تمام کار با داده های باینری بر اساس مفهوم جریان است. جریانیک تعمیم منطقی از یک منبع داده دلخواه (به طور کلی) (شیء جریان) است. این سیستم فرصتی برای ایجاد یک شی Stream مستقل که با هیچ منبعی مرتبط نیست فراهم نمی کند. اما اشیاء مشتق شده ای وجود دارد که می توان ایجاد کرد - یک جریان مرتبط با یک فایل روی دیسک (شیء FileStream) یا یک جریان ایجاد شده در حافظه (شیء جریان حافظه). یک جریان به شما امکان می دهد هم داده ها را بخوانید و هم بنویسید. برای تعیین امکان انجام عملیات خاص، جریان (و اشیاء مشتق شده) روش های خاصی دارند که به شما امکان می دهد تعیین کنید کدام یک
عملیات با جریان داده شده در دسترس هستند (روش AvailableRecord(), AvailableRead(), AvailableChangePosition()).
اگر نیاز به کار با یک جریان در سطح بالاتر دارید، به ویژه داده‌های خواندن/نوشتن مانند تعدادی (با بیت‌های مختلف) یا یک رشته، پس اشیاء ReadData /WriteData برای این منظور در نظر گرفته شده‌اند. با کمک این اشیا، می توان رویکرد ساختارمندتری به داده های باینری واقع در جریان داشت. بنابراین، به عنوان مثال، با دانستن فرمت یک فایل، می توانید به راحتی چنین فایلی را بخوانید، داده های لازم را از سربرگ ها (که معمولاً با تعداد و انواع رشته ها نشان داده می شوند)، پرش از بلوک های داده غیر ضروری و بارگیری موارد لازم برای پردازش
طرح کلی برای کار با داده های باینری را می توان به صورت زیر نشان داد:

  1. جریان در حال انجام است
  2. یک شی DataReader یا DataWrite ایجاد می شود.
  3. با کمک شی ایجاد شده در مرحله 2، اقدامات مورد نیاز انجام می شود.
  4. شی ایجاد شده در مرحله 2 بسته است.
  5. اگر نیازی به انجام عملیات دیگری نباشد، جریان به دست آمده در مرحله 1 بسته می شود.
  6. اگر می خواهید کار با جریان را ادامه دهید، می توانید یک موقعیت جدید در جریان (در صورت پشتیبانی از این عملیات) تنظیم کنید و از مرحله 2 به کار خود ادامه دهید.

لازم به ذکر است که امکان ترکیب موارد 1 و 2 وجود دارد. به عبارت دیگر، سیستم توانایی ایجاد اشیاء را فراهم می کند. خواندن داده/نوشتن دادهبلافاصله از، برای مثال، یک شی BinaryData.
برای انجام عملیات مختلف با داده های باینری، سیستم این امکان را فراهم می کند که بخشی از جریان را به عنوان یک قطعه جداگانه با دسترسی دلخواه (بایت به بایت) (ابجکت) دریافت کند. BufferBinaryData). اندازه بافر در زمان ایجاد تنظیم شده است و بعدا نمی توان آن را تغییر داد. هنگام کار با یک بافر داده باینری، می توان با اعدادی با ظرفیت های مختلف کار کرد
در کل. در عین حال، می توان ترتیب بایت را در کلمات مشخص کرد: "junior-senior" (اندیان کوچک) یا "senior-junior" (اندیان بزرگ). همچنین می توان یک بافر را به چند بافر تقسیم کرد و چندین بافر از داده های باینری را در یک بافر حاصل ادغام کرد.
توجه به این نکته مهم است که اگر کار با داده های باینری در کنار برنامه کلاینت در حالت ناهمزمان پیاده سازی شود، کار با بافر داده باینری می تواند به طور قابل توجهی پیاده سازی را ساده کند. در این حالت، خواندن داده ها در بافر یک عملیات ناهمزمان خواهد بود و کار با داده های بافر همزمان است.
کار با داده های باینری در سمت برنامه مشتری (از جمله سرویس گیرنده وب) و در سمت سرور و همچنین در طرح های کاری همزمان و ناهمزمان در دسترس است. نمونه های بیشتر از طرح عملیات همزمان استفاده خواهند کرد.

16.3.2. خواندن داده های باینری

به عنوان نمونه ای از خواندن داده های باینری، مشکل تعیین فرمت فایل صحیحی که در سیستم برای استفاده بیشتر انتخاب شده است را در نظر خواهیم گرفت. یک فایل wav. با داده های صوتی به عنوان فایلی که باید بررسی شود استفاده می شود. برای ذخیره فایل های wav. از فرمت فایل تبادل منابع (RIFF) استفاده می شود که توضیحات آن در لینک داده شده است:

https://msdn.microsoft.com/enus/library/windows/desktop/ee415713.aspx (به زبان انگلیسی). برای مثال خواندن، از داده های قالب زیر استفاده خواهد شد:
1. 4 بایت اول فایل حاوی شناسه فرمت است: RIFF.
2. 4 بایت بعدی شامل اندازه داده های صوتی واقعی به ترتیب بایت اندک اند.
3. 4 بایت بعدی شامل نوع متن داده استفاده شده است: WAVE.
برای انجام این مراحل، به کد 1C: Enterprise زیر نیاز دارید:

خواندن = جدید ReadData (FileName، ByteOrder.LittleEndian);
FileFormat = Read.Read Characters(4);
DataSize = Read.ReadInteger32();
FileType = Read.ReadCharacters(4);
اگر فرمت فایل<>"RIFF" سپس
alert("این یک فایل RIFF نیست");
برگشت ؛
EndIf
اگر FileType = "WAVE" سپس
گزارش ("این یک فایل WAV با داده، اندازه" + DataSize + "بایت است")؛
در غیر این صورت
اطلاع دهید ("این یک فایل WAV نیست")؛
برگشت؛
EndIf

بیایید یک مثال را با جزئیات بیشتر در نظر بگیریم.
ابتدا فایلی که نام آن در متغیر FileName موجود است باز می شود، فایل برای خواندن باز می شود ( FileOpenMode.Open، فقط از روی فایل ( FileAccess.Read) و یک بافر 16 بایتی برای خواندن استفاده خواهد شد.
سپس یک جریان برای خواندن داده ها تشکیل می شود که برای داده های نوع Number ترتیب بایت "کم-بالا" را خواهد داشت. سپس 4 کاراکتر از جریان حاصل، یک عدد صحیح 32 بیتی و 4 کاراکتر دیگر خوانده می شود. داده های به دست آمده تجزیه و تحلیل می شود و بر اساس نتایج تجزیه و تحلیل، تصمیم گیری می شود که آیا فایل انتخاب شده یک فایل .wav است یا خیر.

16.3.3. داده های باینری بنویسید

نوشتن داده های باینری در یک فایل، در ساده ترین حالت، به صورت زیر انجام می شود:

ورودی = جدید WriteData (نام فایل);
برای ایندکس = چرخه 0 تا 255
Write.WriteByte(Index);
چرخه پایان
Record.Close() ;

این مثال دنباله ای از بایت ها از 0 تا 255 (0xFF در هگزادسیمال) را در یک فایل می نویسد. این ساده ترین ورودی است.
همچنین می‌توانید از روشی مشابه روش خواندنی که در مثال قبلی بحث شد، استفاده کنید، زمانی که یک جریان فایل دریافت می‌شود و داده‌ها در این جریان فایل نوشته می‌شوند.

16.3.4. کار با بافر داده باینری

همانطور که در بالا ذکر شد، بافر داده های باینری روشی مناسب برای دستکاری بیت های داده های باینری فراهم می کند.
نه تنها خواندن داده ها، بلکه نوشتن نیز پشتیبانی می شود.
به عنوان مثال، تجزیه هدر فایل RIFF از مثال خواندن داده ها (اینجا را ببینید) در نظر گرفته می شود. دقیقاً از همان اطلاعات فرمت فایل برای ساخت مثال استفاده خواهد شد. بنابراین، لازم است از فایل منبع، بافری به اندازه هدر فایل خوانده شود. هدر از سه فیلد 4 بایتی تشکیل شده است. بنابراین، خواندن 12 بایت ضروری است.

بافر = جدید BufferBinaryData(12);
فایل = FileStreams.Open(TempFiles Directory() + "Windows Logon.wav"، FileOpenMode.Open, FileAccess.Read);
File.Read(Buffer, 0, 12);
اندازه = Buffer.ReadInteger32(4);
StringStream = New StreamInMemory(Buffer);
StreamString.Jump(0, PositionInStream.Start);

فرمت فایل = ReadString.ReadCharacters(4، "ویندوز-1251")؛
ReadingLine.Close();
StreamString.Jump(8, PositionInStream.Start);
StringReader = NewDataReader(StringStream);
نوع فایل = ReadString.ReadCharacters( 4، "ویندوز-1251")؛
ReadingLine.Close();

فرآیند دریافت داده ها به بافر داده باینری چیز خاصی نیست. عملیات بیشتر نیاز به برخی نظرات دارد. خواندن اعداد از هر عمق بیت پشتیبانی شده از هر موقعیت بافر امکان پذیر است. در این مثال Buffer.ReadInteger32(4); به معنای خواندن یک عدد صحیح 32 بیتی است که از بایت 4 بافر شروع می شود. بنابراین، اگر شما نیاز به خواندن چندین اعداد واقع در مکان های مختلف در بافر دارید، این کار را می توان بدون قرار دادن مستقیم در این بافر انجام داد.
با این حال، خواندن یک رشته توسط بافر داده باینری پشتیبانی نمی شود. بنابراین، باید از یک شی استفاده کنید که به شما امکان انجام این کار را می دهد: ReadData. یک شی DataReader را نمی توان از بافر داده باینری ایجاد کرد. اما بر اساس بافر داده های باینری، می توانید جریانی ایجاد کنید که یک واسطه جهانی بین مکان فیزیکی ذخیره سازی اطلاعات (فایل، بافر داده های باینری) و یک شی سطح بالا است که به شما امکان می دهد با این داده ها کار کنید.
هنگامی که یک شی DataReader بر اساس یک جریان ایجاد می شود، شروع به خواندن داده ها از موقعیتی می کند که در حال حاضر در جریان تنظیم شده است. بنابراین در مثال ابتدا موقعیت در جریان تنظیم می شود و سپس شی DataReader ایجاد می شود و تعداد کاراکتر مورد نیاز خوانده می شود. برای توضیح دقیق تفاوت بین تعداد بایت ها و کاراکترها هنگام خواندن رشته ها، به بخش 16.3.5 زیر مراجعه کنید.

16.3.5. ویژگی های استفاده

هنگام استفاده از داده های باینری، باید ویژگی های کار با داده های نوع String را در نظر بگیرید. ویژگی این است که طول رشته برگردانده شده توسط تابع زمینه جهانی StrLength() با کاراکتر اندازه گیری می شود. در نمادها، شما باید اندازه داده های خواندن/نوشتن را در روش های نوشتن/خواندن رشته ها در اشیا برای کار با داده های باینری مشخص کنید. ReadSymbols(),
ReadString(), WriteSymbols()، WriteString()). در عین حال، هیچ گزینه بدون ابهامی برای تبدیل طول یک رشته به کاراکتر به پارامتر مشابه در بایت وجود ندارد. بسته به محتویات رشته و کدگذاری، این نسبت متفاوت خواهد بود. بنابراین، هنگام کار با هر ساختار داده ای که شامل رشته هایی با طول متغیر است، باید به وضوح درک کنید که طول رشته ها در چه واحدهایی بیان می شود.
اگر در داده های موجود، طول رشته بر حسب بایت مشخص شده باشد، و رشته در یک رمزگذاری طول متغیر چند بایتی (مثلا UTF-8) مشخص شده باشد، پس با استفاده از اشیاء داده باینری، خواندن چنین ساختاری به طور کلی غیرممکن است. از یک فایل به داده هایی از نوع String.
اما در این حالت می توانید به راحتی موقعیت خواندن / نوشتن را در جریان فایل تغییر دهید. اگر طول رشته با کاراکتر مشخص شود، خواندن چنین رشته ای در داده های نوع رشته امکان پذیر می شود، اما تغییر موقعیت خواندن / نوشتن در چنین جریانی غیرممکن می شود.
برای بدست آوردن طول یک رشته بر حسب بایت، می توانید از تابع زیر برای تبدیل رشته به یک شی BinaryData استفاده کنید:

تابع BinaryDataFrom String را دریافت کنید(Val StrParameter، Val Encoding = "UTF-8")
StreamMem = New StreamInMemory ;
نویسنده = جدید WriteData (StreamMemory);
Writer.WriteString(StrParameter، رمزگذاری)؛
نویسنده.بستن();
StreamMemory.CloseAndGetBinaryData را برگردانید();
EndFunctions

اندازه واقعی بر حسب بایت را می توان با فراخوانی تابع Size() در شی BinaryData که در نتیجه تابع به دست می آید، بدست آورد.
استفاده همزمان از اشیا توصیه نمی شود خواندن داده/نوشتن دادهو اشیاء را استریم کنید. اگر بین دو خواندن متوالی از یک DataReader یا دو نوشتن متوالی به یک DataWrite، تغییری در موقعیت جریانی که اشیا با آن کار می کنند، ایجاد می شود. سایه زدن داده ها/نوشتن داده ها- یک استثنا انداخته می شود. بنابراین، مثال زیر تغییر صحیح موقعیت در جریان را هنگام نوشتن داده ها در جریان نشان می دهد:

Stream = New StreamInMemory();

WriteData.WriteString("سلام دنیا!")؛
WriteData.Close();
Stream.Jump(0, PositionInStream.Start);
DataRecord = New DataRecord(Stream);
WriteData.WriteString("خدا حافظ!")؛
WriteData.Close();
مثال زیر سلام به پرتاب یک استثنا:

Stream = New StreamInMemory();

WriteData.WriteString("سلام دنیا!");
Stream.Jump(0, PositionInStream.Start);
// خط بعدی یک استثنا ایجاد می کند
WriteData.WriteString("بای!");
در عین حال، شرایطی ممکن است که رفتار سیستم نادرست باشد، اما هیچ خطایی ایجاد نخواهد شد:

جریان = GetStream();
DataReader = New DataReader(Stream);
TestString = ReadData.Read();
InitialPosition = Stream.CurrentPosition();
DataRecord = New DataRecord(Stream);
WriteData.WriteString ("رشته غیرمنتظره");
DataWrite.Close();
Flow.Go (InitialPosition، PositionInStream.Start)؛
// به طور کلی نمی توان تعیین کرد که چه مقداری در متغیر TestString2 قرار می گیرد
TestString2 = ReadData.ReadString();

رفتاری که در این بخش توضیح داده شده است به دلیل o اشیاء DataReader/DataWrite هنگام کار با یک جریان از بافرهای خود استفاده می کنند. در نتیجه موقعیت واقعی جریان با موقعیت منطقی که در نتیجه عملیات انجام شده شکل می گیرد متفاوت است.
همچنین، استفاده همزمان از اشیاء ReadData و WriteData که از یک رشته برای کار خود استفاده می کنند، پشتیبانی نمی شود.

پلتفرم فناوری 1C: Enterprise 8 به شما امکان می دهد فایل های دلخواه را در پایگاه اطلاعات ذخیره کنید، آنها را از آنجا دریافت کنید و از آنها به روش های مختلف استفاده کنید. بیایید با مثال به این عملیات نگاه کنیم.

قبل از آپلود فایل در infobase 1C، باید آدرس کامل فایل را روی دیسک دریافت کنید. کار با دیالوگ های انتخاب فایل در توضیح داده شده است.

برای ذخیره فایل ها، یک ویژگی (یا منبع ثبت نام) با نوع StorageValues.

آپلود یک فایل دلخواه در پایگاه اطلاعاتی 1C

هر فایلی را می توان به صورت داده باینری نشان داد و در آن بارگذاری کرد ذخیره سازی ارزش.

هنگام تبدیل داده های باینری به یک شی StorageValuesساخت و ساز استفاده می شود newStorageValue (داده، فشرده سازی)با دو گزینه:

  1. داده ها- داده های باینری در ذخیره سازی قرار می گیرند
  2. فشرده سازی- درجه فشرده سازی الگوریتم Deflation. یک عدد صحیح در محدوده -1…9. -1 سطح فشرده سازی پیش فرض است. 0 - بدون تراکم، 9 - حداکثر نسبت تراکم. مقدار پیش فرض: -1. پارامتر اختیاری است، اگر مشخص نشده باشد، از فشرده سازی استفاده نمی شود.

//فایل را به داده باینری تبدیل کنید
File = New BinaryData(Path) ;

//یک شی ValueStorage جدید ایجاد کنید

DataStorage = NewValueStorage(File, NewDataCompression(9) );

ذخیره یک فایل دلخواه از پایگاه اطلاعاتی 1C در دیسک

برای ذخیره یک فایل از پایگاه داده 1C در دیسک، باید مسیر و نام فایل را تعیین کنید. برای انجام این کار، یک گفتگو برای ذخیره فایل ها وجود دارد که کار با آن در توضیح داده شده است.

//داده های باینری را از ذخیره سازی دریافت کنید
//DataStorage - ویژگی شی با نوع ValueStorage

//داده های دریافتی را روی دیسک بنویسید
//متغیر Path حاوی آدرس کامل فایل روی دیسک است
داده ها. نوشتن (مسیر) ;

مشاهده یک فایل واقع در پایگاه اطلاعات 1C

برای مشاهده فایل ذخیره شده در پایگاه داده، باید برنامه ای را روی رایانه خود نصب کرده باشید که این فایل را باز می کند.

//نام فایل موقت با پسوند مورد نیاز را دریافت کنید
//در متغیر Extension باید پسوند فایل را قرار دهید، برای مثال "pdf"
Path= GetTemporaryFileName(Extension) ;

// داده ها را از ذخیره سازی دریافت کنید
//DataStorage - ویژگی شی با نوع ValueStorage
Data = Datastore. دريافت كردن() ؛

//داده ها را در یک فایل موقت بنویسید
داده ها. نوشتن (مسیر) ;

// سعی کنید فایل را در برنامه مورد نظر خود باز کنید
//اگر برنامه یافت نشد، کادر گفتگوی سیستم "Open with..." ظاهر می شود
StartApplication (مسیر)؛

برترین مقالات مرتبط