1с двійкові дані у запиті. Робота із двійковими даними. Видалення файлу з тимчасового сховища

25.01.2021 Безпека

Технологічна платформа 1С:Підприємство 8 дозволяє зберігати в інформаційній базі довільні файли, отримувати їх звідти та використовувати у різний спосіб. Розглянемо ці операції з прикладах.

Перед виконанням завантаження файлу в інформаційну базу 1С необхідно отримати повну адресу файлу на диску. Робота з діалогами вибору файлів описана у .

Для зберігання файлів використовується реквізит (або ресурс регістру) з типом СховищеЗначення.

Завантаження довільного файлу до інформаційної бази 1С

Будь-який файл можна подати у вигляді двійкових даних і завантажити в СховищеЗначень.

При перетворенні двійкових даних на об'єкт СховищеЗначеннявикористовується конструкція новий СховищеЗначення(Дані,Стиск)з двома параметрами:

  1. Дані- Двійкові дані, які потрібно помістити в сховище
  2. Стиснення- Ступінь стиснення алгоритму Deflation. Ціле число у діапазоні -1…9. -1 - Ступінь стиснення за замовчуванням. 0 - ніякого стиснення, 9 - максимальний ступінь стиснення. Значення за промовчанням: -1. Параметр необов'язковий, якщо не вказано, стиснення не використовується.

//Перетворимо файл у двійкові дані
Файл = Новий ДвійковіДані(Шлях) ;

//Створюємо новий об'єктСховищеЗначення

СховищеДаних = Новий СховищеЗначення(Файл, Новий СтискДаних(9 ) ) ;

Збереження довільного файлу з інформаційної бази 1С на диск

Для збереження файлу з бази 1С на диск необхідно визначити шлях та ім'я файлу. І тому існує діалог збереження файлів, робота з яким описана в .

//Отримуємо двійкові дані зі сховища
//СховищеДаних - реквізит об'єкта з типом СховищеЗначення

//Записуємо отримані дані на диск
//У змінній Шлях знаходиться повна адреса файлу на диску
Дані. Записати(Шлях) ;

Перегляд файлу, що знаходиться в інформаційній базі 1С

Для перегляду збереженого в базі файлу необхідно, щоб на комп'ютері було встановлено програму, яка відкриває файл.

//Отримуємо ім'я тимчасового файлу з необхідним розширенням
//У змінну Розширення потрібно помістити розширення файлу, наприклад "pdf"
Шлях= ОтриматиІм'яТимчасовогоФайлу(Розширення) ;

//Отримуємо дані зі сховища
//СховищеДаних - реквізит об'єкта з типом СховищеЗначення
Дані = Сховище Даних. Отримати() ;

//Записуємо дані до тимчасового файлу
Дані. Записати(Шлях) ;

//Намагаємося відкрити файл у призначеному для нього додатку
//Якщо програма не знайдена, з'явиться системний діалог "Відкрити за допомогою..."
ЗапуститиДодаток(Шлях) ;

Двійкові дані 1С призначені для зберігання фалів довільного формату. З їх допомогою можна:

  • Організувати взаємодію за двійковим протоколом з різними пристроями;
  • Зберігати у вигляді реквізиту об'єкта метаданих файли будь-яких форматів;
  • Конвертувати текстові дані в бінарні (найчастіше використовується для надсилання звітів);
  • Працювати з двійковими даними у пам'яті.

Що може система

Працюючи з двійковими даними платформа 8.3 вміє виконувати такі действия:

  1. Виконувати читання та запис двійкових даних;
  2. Переміщати дані з клієнта на сервер та назад з використанням тимчасового сховища;
  3. Ініціалізувати за допомогою бінарних файлів об'єкт типу «Малюнок»;
  4. Зчитувати їх із всесвітньої мережі з використанням об'єктів «ПоштовеВкладення», «НТТРЗ'єднання» тощо.
  5. Використовувати криптографічні засоби для шифрування та підпису важливих вкладень;
  6. За допомогою об'єкта «ХешуванняДаних» обчислювати хеш-функцію.

Збереження даних у реквізит

Наприклад створимо в тестової конфігураціїдовідник.

Насправді, використовувати той самий довідник для зберігання інформації про номенклатуру та бінарних даних картинок трохи неправильно. При досить великих обсягах даних та великовагових файлах великого розміруможуть виникнути небажані простої та «гальма» у роботі системи. Набагато коректніше з точки зору системи організуватиме окремий довідник «Картинки», посилання на який ми могли б поставити як тип реквізиту.


Важливо, що через те, що реквізити типу «СховищеЗначення», що містять двійкові дані недоступні в режимі керованого додатка, звернення до них можливе лише з використанням методу РеквізитФормиЗначення.


У полі повідомлення представлено запис двійкових даних сховища значень.

Читання даних із реквізиту

Створимо обробку, яка буде виводити файл, що зберігається в бінарному вигляді в нашій конфігурації, в табличний документ (це потрібно, допустимо для виведення на друк логотипу фірми).


В принципі це весь код, який нам потрібен. За допомогою оператора Отримати() ми читаємо двійкові дані, що зберігаються у відповідному реквізиті довідника і передаємо їх в об'єкт «Картинка», який і буде показаний у верхньому лівому осередку табличного документаформи (Рис.9).

Рис.9

Перетворення даних

Нечасто, але буває, що при роботі з нестандартними обмінами із зовнішніми системами потрібна конвертація даних із двійкового формату у формат Base64 або назад.

У більшості випадків платформа самостійно перетворює дані, якщо цього не відбувається, необхідно скористатися глобальними функціями перекладу:

  1. Base64Рядок – переводить задане значення у рядок відповідного кодування;
  2. Base64Значення - робить зворотне перетворення.

Оптимізація наведеного вище коду

Код, представлений на Рис.4, безумовно, працює, але з одним істотним застереженням: якщо властивості конфігурації встановлено прапорець «Режим використання модальності» (Рис.10). В іншому випадку його використання викликає помилку.
Рис.10

Для того, щоб цього не відбувалося, перебуваючи в модулі форми елемента довідника, зайти в меню Текст->Рефакторинг->Нерекомендовані синхронні виклики->Перетворити виклики модуля.

Через деякий час синхронні дзвінки автоматично будуть перетворені на асинхронні, а код набуде вигляду (Рис.11)

Рис.11

У сховищі значення можна зберегти майже будь-яку інформацію, наприклад,

... картинки (фотки):

ТекЗображення.Об'єкт = СпрТканини.Посилання; ТекЗображення.Відданих = Перерахування.ВидиДодатковоїІнформаціїОб'єктів.Зображення; Сховище = Новий СховищеЗначення(НоваКартинка, Новий СтисненняДаних()); ТекЗображення.Сховище = Сховище.Отримати();

// тут він все виводить... ЕлементиФорми.ПолеКартинки1.Картинка = Сховище.Отримати(); ТекЗображення.Записати();

...табличний документ:

ТабДок = Новий ТабличнийДокумент; ТабДок.Вивести(ЕлементиФорми.ПолеТабличногоДокумента1); Сховище=Нове СховищеЗначення(ТабДок); Записати();

КінецьПроцедури

Процедура ВідновитиСховищеНатискання(Елемент)

ТабДок = Сховище. Отримати (); Якщо ТабДок<>Невизначено Тоді ЕлементиФорми.ПолеТабличногоДокумента1.Вивести(ТабДок); КінецьЯкщо;

КінецьПроцедури

... довільні файли (двійкові дані):

ХЗ = Новий СховищеЗначення(Новий ДвійковіДані(файл));

Вісімка підтримує стиснення даних, що розміщуються в сховищі:

ХЗ = Новий СховищеЗначення(Новий ДвійковіДані(файл),Новий СтисненняДаних(9));

... зовнішні обробки та звіти:

Процедура ЗавантажитиОбробкуВСховище(РеквізитТипСховище)

СтупіньСтискання = Новий СтисненняДаних(9); //9 максимум РеквізитТипСховище = Новий СховищеЗначення(Новий ДвійковіДані("c:\звіти\звіт.epf", СтупіньСтискання));

КінецьПроцедури

Процедура ЗапуститиОбробкуІзСховища(РеквізитТипСховище)

Ім'яТимчасовогоФайлу = КаталогТимчасовихФайлів()+"звіт.epf"; ДвійковіДані = РеквізитТипСховище.Отримати(); ДвійковіДані.Записати(Ім'яТимчасовогоФайлу); ЗовнішняОбробка = ЗовнішніОбробки.Створити(Ім'яТимчасовогоФайлу); ЗовнішняОбробка.ОтриматиФорму().Відкрити();

КінецьПроцедури

Робота зі сховищем

Якщо це були Двійкові Дані, їх можна відновити зі сховища значення методом Отримати і записати у файл методом Записати().

Якщо ТипЗнч(Сховище)<>Тип("ДвійковіДані") Тоді

ДвійковіДані = Сховище.Отримати();

ДвійковіДані = Сховище;

КінецьЯкщо; ДвійковіДані.Записати(Ім'яФайлу);

Якщо це був, наприклад, Word-документ (doc-файл або інший файл зареєстрованого типу), то його можна відкрити так:

ЗапуститиДодаток(Ім'яФайлу);

Щоб очистити поле типу Сховище значення, потрібно привласнити йому Невизначено:

РеквізитСховище = Невизначено;

Робота з файлами та картинками у вбудованій мові 1С:Підприємства 8

Призначення

У керованому додатку реалізовано новий механізм роботи з файлами. Він забезпечує обмін файлами між інформаційною базою та клієнтським додатком. Особливістю даного механізму є те, що він орієнтований на використання в тонкому клієнтута Веб-клієнт і розроблений з урахуванням обмежень на роботу з файлами, що накладаються веб-браузерами.

Механізм є набором методів, за допомогою яких можна помістити дані, що зберігаються локально у користувача, в тимчасове сховище інформаційної бази, перенести цю інформацію з тимчасового сховища до бази даних та отримати її назад на комп'ютер користувача. Найбільш поширені прикладні завдання, які вирішуються цим механізмом, - це зберігання супровідної інформації, наприклад, зображень товарів, пов'язаних із договорами документів тощо.

Область дії методів

Тимчасове сховище

Тимчасове сховище - це спеціалізована сфера інформаційної бази, в яку можуть бути поміщені двійкові дані. Основне призначення - це тимчасове зберігання інформації при клієнт-серверній взаємодії до її перенесення до бази даних.

Необхідність у тимчасовому сховищі виникає тому, що в моделі роботи веб-браузера потрібно передати обраний користувачем файл безпосередньо на сервер без можливості його зберігання на клієнті. При передачі файлу він поміщається в тимчасове сховище і потім може бути використаний під час запису об'єкта до бази даних.

Найбільш типове розв'язуване тимчасовим сховищем прикладне завдання – забезпечення доступу до файлів або картинок до того, як об'єкт буде записаний в інформаційну базу, наприклад, у формі елемента.

Файл або двійкові дані, поміщені в сховище, ідентифікуються унікальною адресою, яку можна використовувати в операціях запису, читання або видалення. Ця адреса видає методи запису файлу в тимчасове сховище. Окремий метод у вбудованій мові дозволяє визначити, чи є адреса, що передається адресою, що вказує на дані в тимчасовому сховищі.

Інформаційна база

Механізм дозволяє отримати доступ до двійкових даних, що зберігаються в реквізитах типу СховищеЗначень.

Як і у випадку тимчасового сховища, доступ до інформації можливий через спеціальну адресу. Отримати його можна через спеціальний метод, передавши посилання на об'єкт або ключ запису регістра відомостей та ім'я реквізиту. У разі табличної частини додатково потрібно передати індекс рядка табличної частини.

Методи роботи з файлами мають обмеження під час роботи з реквізитами інформаційної бази. Для них, на відміну від тимчасового сховища, є лише читання інформації, але не її запис або видалення.

Опис методів роботи з файлами

Збереження даних у тимчасове сховище

Найбільш типовий сценарій використання даного механізму передбачає початкове розміщення даних користувача у тимчасовому сховищі. Для цього призначено два методи: ПоміститиФайл() і ПоміститиФайлВременноеСховище().

Перший метод, помістити файл(), поміщає файл з локальної файлової системи в тимчасове сховище. Метод може приймати цільову адресу сховища. Якщо ж він не визначений або є порожнім рядком, то буде створено новий файлта метод поверне його адресу через відповідний параметр.

Якщо параметр, що визначає інтерактивний режим роботи, дорівнює Істина, метод відобразить стандартне діалогове вікно вибору файлу, в якому можна вибрати файл для приміщення в сховищі. У цьому випадку метод також поверне адресу вибраного файлу.

Як результат, метод повертає Брехню, якщо користувач в інтерактивному режимі відмовився від здійснення операції в діалозі вибору файлу. Метод доступний лише клієнта.

Другий метод, ПоміститиФайлВременноеСховище(), схожий з попереднім, крім того, що він доступний на сервері, а дані для запису в тимчасове сховище представляються над вигляді шляху у файлової системі, а вигляді змінної типу ДвійковіДані. Так само, якщо не вказана цільова адреса, створюється новий файл у сховищі. Його адреса повертається як наслідок функції.

Отримання файлу з тимчасового сховища

При записі об'єкта в інформаційну базу може знадобитися витягти дані з тимчасового сховища та помістити їх, наприклад, у реквізит. Для цього є відповідний серверний метод - Отримати Файл З Тимчасового Сховища (). Цей метод витягує дані з тимчасового сховища та повертає їх як результат. Для цього необхідно вказати адресу у тимчасовому сховищі. Ця адреса повертає вищеописані методи ПоміститиФайл() і ПоміститиФайлВременноеСховище() у разі успішного виконання.

Видалення файлу з тимчасового сховища

Після збереження даних у реквізиті файл можна видалити у тимчасовому сховищі. Для цього є метод ВидалитиФайлЗ Тимчасового Сховища(), який видаляє файл із тимчасового сховища. Метод приймає у параметрі адресу файлу у тимчасовому сховищі. Доступний на сервері.

Перевірка адреси на належність тимчасовому сховищу

Адреса файлу може вказувати як у тимчасове сховище, і на реквізит інформаційної базі. Для перевірки його типу існує метод ЦеАдрес ТимчасовогоСховища().

Він перевіряє, що передана адреса є адресою, що вказує на сховище. Повертає Істина, якщо адреса вказує на тимчасове сховище. Метод доступний на сервері.

Отримання адреси реквізиту

Після того, як дані поміщені в реквізит в інформаційній базі, може знадобитися отримати доступ до них за допомогою файлових методів.

Але перш ніж отримати дані, наприклад, з реквізиту, необхідно отримати адресу цього реквізиту. Для цього існує метод ОтриматиАдресФайлаВінформаційноїБазі().

Його призначення – повернути адресу файлу в інформаційну базу за вихідними параметрами. Для цього необхідно передати ключ об'єкта (це може бути посилання на об'єкт, так і ключ запису регістра відомостей) та ім'я реквізиту. Якщо потрібно отримати адресу файлу, що зберігається в реквізиті табличної частини, до імені реквізиту в параметрі, що визначає ім'я реквізиту, необхідно додати ім'я табличної частини і точку «.». Метод доступний як у клієнті, і на сервері.

Отримання файлу з інформаційної бази

Метод ОтриматиФайл() отримує файл з інформаційної бази та зберігає його в локальну файлову системукористувача. Перший параметр визначає адресу файлу в реквізиті або тимчасовому сховищі файлів. Другий параметр визначає цільове розташування файлу. У не інтерактивному режимі необхідно вказати шлях. В інтерактивному режимі параметр опціональний.

За промовчанням метод виконується в інтерактивному режимі, тобто останній параметр дорівнює Істина. Це означає, що видається діалогове вікно, в якому можна вказати дію з отриманим файлом: запустити його або зберегти за вказаним користувачем розташування. Якщо активовано інтерактивний режим, а параметр Цільовий шлях до файлу на диску не вказано, операція відкриття файлу недоступна. Повертає булівське значення. Брехня означає, що користувач вибрав скасування операції у діалоговому вікні збереження файлів в інтерактивному режимі.

Приклад використання файлових методів

// Отримання в інтерактивному режимі файлу з диска // та поміщення його в тимчасове сховище &На Клієнті Процедура ВибратиФайлСДискаІЗаписати()

Перем ВибранеІм'я; Перем Адреса ТимчасовогоСховища; Якщо ПоміститиФайл(Адрес ТимчасовогоСховища, Вибране Ім'я, Істина) Тоді Об'єкт.Ім'яФайла = ВибранеІм'я; ПоміститиФайлОбъекта(Адрес ТимчасовогоСховища); КінецьЯкщо;

КінецьПроцедури

// Копіювання файлу з тимчасового сховища в реквізит // довідника, запис об'єкта, видалення файлу з тимчасового // сховища &На Сервері Процедура ПоміститиФайлОб'єкта(Адрес ТимчасовогоСховища)

ЕлементДовідника = РеквізитФормиЗначення("Об'єкт"); ДвійковіДані = ОтриматиФайлЗ ТимчасовогоСховища(Адрес ТимчасовогоСховища); ЕлементДовідника.ДаніФайла = Новий СховищеЗначення(ДвійковіДані); ФайлШляхНаДіске = Новий Файл(ЕлементДовідника.Ім'яФайла); ЕлементДовідника.Ім'яФайла = ФайлШляхНаДіске.Ім'я; ЕлементДовідника.Записати(); Модифікованість = Брехня; ВидалитиФайлЗ Тимчасового Сховища (Адрес Тимчасового Сховища); ЗначенняВРеквізитФорми(ЕлементДовідника, "Об'єкт");

КінецьПроцедури

// Зчитування файлу з реквізиту та збереження його // на локальному дискув інтерактивному режимі &НаКлієнті Процедура ПрочитатиФайлІЗберегтиНаДиск()

Адреса = ОтриматиАдресФайлаВінформаційноїБазі(Об'єкт.Посилання, "ДаніФайлу"); Отримати Файл (Адреса, Об'єкт. Ім'я Файлу, Істина);

КінецьПроцедури

Підтримка адрес у полі картинки

Елемент керування Поле зображення підтримує відображення зображення, заданої адресою файлу в тимчасовому сховищі або базі даних.

Для цього у властивості Дані елемента форми необхідно встановити реквізит рядкового типу. Значення цього реквізиту інтерпретуватиметься як адресу картинки.

приклад // Прив'язка поля картинки до адреси картинки у тимчасовому // сховище. АдресаКартинки реквізит форми рядкового типу

ПоміститиФайл(АдресКартинки,Істина)

Картинка.Дані = АдресаКартинки

Обмеження під час роботи з Веб-клієнтом

p align="justify"> Робота описуваного механізму при використанні Веб-клієнта має деякі обмеження. Ці обмеження пов'язані з особливостями моделі безпеки браузера. Приміром, клієнт самостійно неспроможна зберегти файл у локальну файлову систему, тобто доступний лише інтерактивний варіант клієнтських методів ПоміститиФайл() і ОтриматиФайл(). При спробі використовувати не інтерактивний режим генерується виняток. Діалогові вікна, що відображаються в інтерактивному режимі, специфічні для конкретного типу браузера.

Особливості при роботі з СховищемЗначень на Клієнті

Проблема:

Коли документ у табличній частині має реквізит типу СховищеЗначень, то гальмує відкриття форми документа, якщо в цьому реквізиті записані дані великого розміру.

Ймовірна причина:

Можливо, при відкритті форми, на клієнт передається не посилання на дані, що знаходяться в сховищі значень, а самі дані.

Рішення

  • У властивостях табличного реквізитуФорма є прапор "Використовувати завжди". Якщо він встановлений, вміст поля завжди передається між сервером і клієнтом - наприклад, при відкритті форми. Цей прапор треба вимкнути, але при цьому потрібно врахувати це в коді, тому що значення цього поля за замовчуванням на клієнті не буде. Приклад можна подивитися в 1С: Архів.

Ще краще використовувати тимчасове сховищедля передачі файлів між клієнтом та сервером.

Друк (Ctrl+P)

16.3. Робота з двійковими даними

16.3.1. Загальна інформація

При реалізації прикладних рішеньможливі ситуації, коли потрібно аналізувати різні двійкові дані. Наприклад, потрібно по сигнатурі визначити тип файлу або виконати маніпуляції з картинкою. Для роботи із двійковими даними «1С:Підприємство» надає спеціальні програмні інтерфейси. Далі будуть розглянуті можливості роботи з двійковими даними.
Вся робота з двійковими даними базується на понятті потоку. Потік– це логічне узагальнення довільного (загалом) джерела даних (об'єкт Потік ). Система не дозволяє створити самостійний об'єкт Потік , який не пов'язаний з будь-яким джерелом. Але існують похідні об'єкти, які можна створити - це потік, пов'язаний з файлом на диску (об'єкт Файловий Потік) або потік, створений у пам'яті (об'єкт Поток). Потік дозволяє читати дані, так і записувати їх. Для визначення можливості виконання тих чи інших операцій у потоку (і похідних об'єктів) існують спеціальні методи, що дозволяють визначити, які
операції доступні з цим потоком (методи ДоступнаЗапис(), ДоступноЧитання(), ДоступноЗмінаПозиції()).
Якщо потрібно працювати з потоком на більш високому рівні, зокрема, виконувати читання/запис таких даних, як число (різної розрядності) або рядок, для цього призначені об'єкти ЧитанняДаних/ЗаписДаних. За допомогою цих об'єктів є можливість більш структуровано підходити до двійкових даних, які розташовані в потоці. Так, наприклад, знаючи формат будь-якого файлу, можна досить комфортно виконувати читання такого файлу, отримуючи із заголовків потрібні дані (які, як правило, представлені типами число та рядок), пропускаючи не потрібні блоки даних та завантажуючи для обробки потрібні.
Загальну схему роботи з двійковими даними можна подати так:

  1. Виконується отримання потоку
  2. Створюється об'єкт Читання даних або Запис даних.
  3. За допомогою об'єкта, створеного у п.2, виконуються необхідні дії.
  4. Закривається об'єкт, створений у п.2.
  5. Якщо ніяких операцій більше виконувати не потрібно, то закривається потік, отриманий у п.1.
  6. Якщо потрібно продовжити роботу з потоком, можна виконати установку нової позиціїу потоці (якщо ця операція підтримується) та продовжити роботу, починаючи з п.2.

Є можливість об'єднати пп.1 і 2. Іншими словами, система надає можливість створення об'єктів Читання даних/запис даниходночасно з, наприклад, об'єкта ДвійковіДані .
Для виконання різних операцій з двійковими даними система надає можливість отримати деяку частину потоку як відокремлений фрагмент з довільним (побайтовим) доступом (об'єкт БуферДвійковихДаних). Розмір буфера визначається при створенні і не може бути змінений надалі. При роботі з буфером двійкових даних є можливість працювати з числами різної розрядності як з
єдиним цілим. При цьому є можливість вказівки порядку байтів у словах: «молодший-старший» (little 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 байти містять обсяг власне аудіо даних з системою проходження байт little-endian.
3. наступні 4 байти містять текстовий тип використовуваних даних: WAVE.
Для виконання цих дій буде потрібно наступний код вбудованою мовою:

Читання = Новий ЧитанняДаних(Ім'яФайлу, ПорядокБайтів.LittleEndian);
ФорматФайла = Читання.ПрочитатиСимволи(4);
Розмір Даних = Читання.();
ТипФайла = Читання.ПрочитатиСимволи(4);
Якщо ФорматФайлу<>“RIFF” Тоді
Повідомити(“Це не файл формату RIFF”);
Повернення;
КінецьЯкщо ;
Якщо ТипФайлу = “WAVE” Тоді
Повідомити (“Це WAV-файл з даними, розміром ” + Розмір Даних + ” байт”);
Інакше
Повідомити (“Це не WAV-файл”);
Повернення;
КінецьЯкщо;

Розглянемо приклад докладніше.
Спочатку відкривається файл, ім'я якого міститься в змінній Ім'яФайлу, файл відкривається для читання ( РежимВідкриттяФайла.Відкрити), з файлу тільки читати ( ДоступКФайлу.Читання) і для читання використовуватиметься буфер розміром 16 байт.
Потім формується потік, призначений для читання даних, який матиме порядок проходження байтів «молодший-старший» для даних типу Число. Потім з потоку, що вийшов, зчитується 4 символи, 32-розрядне ціле і ще 4 символи. Дані аналізуються і за результатами аналізу приймається рішення про те, є обраний файл.wav-файлом чи ні.

16.3.3. Запис двійкових даних

Запис двійкових даних у файл, у найпростішому випадку, виконується так:

Запис = Новий ЗаписДаних(Ім'яФайлу);
Для Індекс = 0 По 255 Цикл
Записати. Записати Байт (Індекс);
КінецьЦикл;
Запис.Закрити() ;

Даний приклад виконує запис у файл послідовності байтів від 0 до 255 (0xFF у 16-річній системі). Це найпростіший варіант запису.
Також можна використовувати спосіб, аналогічний способу читання, розглянутому в попередньому прикладі, коли виходить файловий потік і цей файловий потік виконується запис даних.

16.3.4. Робота з буфером двійкових даних

Як було зазначено вище, буфер двійкових даних надає зручний спосіб маніпуляції фрагментами двійкових даних.
Підтримується як читання даних, а й запис.
Як приклад буде розглянуто аналіз заголовка RIFF-файлу з прикладу читання даних (див. тут). Для побудови прикладу будуть використані та сама інформація про формат файлу. Таким чином, необхідно прочитати з вихідного файлубуфер розміром із заголовок файлу. Заголовок складається з трьох 4-байтових полів. Таким чином, необхідно прочитати 12 байт.

Буфер = Новий БуферДвійковихДаних(12);
Файл = Файлові Потоки. Відкрити (Каталог Тимчасових Файлів() + “Windows Logon.wav”, РежимВідкриттяФайла.Відкрити, ДоступКФайлу.Читання);
Прочитати (Буфер, 0, 12);
Розмір = Буфер.ПрочитатиЦіле32(4);
ПотокРядки = Новий ПотокВПам'яті (Буфер);
ПотікРядки.Перейти(0, Позиція У Потоці. Початок);

ФорматФайлу = ЧитанняРядки.ПрочитатиСимволи(4, "windows-1251");
ЧитанняРядки.Закрити();
ПотікРядки.Перейти(8, Позиція У Потоці. Початок);
ЧитанняРядки = Новий ЧитанняДаних (ПотокРядки );
ТипФайлу = ЧитанняРядки.ПрочитатиСимволи( 4, "windows-1251");
ЧитанняРядки.Закрити();

Процес отримання даних у буфер двійкових даних не є нічого особливого. Подальші операції потребують деяких коментарів. Читання чисел будь-якої підтримуваної розрядності можливе з будь-якої позиції буфера. У даному прикладі Буфер.ПрочитатиЦіле32(4); означає читання 32-розрядного цілого числа, починаючи з 4 байти буфера. Таким чином, якщо потрібно прочитати кілька чисел, розташованих у різних місцях буфера, це можна зробити без прямого позиціонування цього буфера.
Проте читання рядка не підтримується буфером двійкових даних. Тому слід скористатися об'єктом, який дозволяє зробити: Читання Даних . Об'єкт Читання даних не може бути створений на підставі буфера двійкових даних. Але на підставі буфера двійкових даних можна створити потік, що є універсальним посередником між фізичним місцем зберігання інформації (файл, буфер двійкових даних) та високорівневим об'єктом, що дозволяє працювати з цими даними.
Коли створюється об'єкт Читання даних на підставі будь-якого потоку, він починає читати дані з тієї позиції, яка в Наразівстановлена ​​у потоці. Тому в прикладі спочатку відбувається встановлення позиції в потоці, а потім створюється об'єкт читання даних і виконується читання потрібної кількості символів. Докладний описрізниці між числом байтів та символів під час читання рядків див. наступний розділ 16.3.5

16.3.5. Особливості використання

При використанні двійкових даних слід враховувати особливості роботи з даними типу Рядок. Особливість полягає в тому, що довжина рядка, який повертає функція глобального контексту СтрДліна(), вимірюється у символах. У символах слід вказувати розміри читаних/записуваних даних у методах запису/читання рядків в об'єктах роботи з двійковими даними ( ПрочитатиСимволи(),
ПрочитатиРядок(), ЗаписатиСимволи(), ЗаписатиРядок()). При цьому не існує однозначного варіанта перетворення довжини рядка в символах на аналогічний параметр в байтах. Залежно від вмісту рядка та кодування, це співвідношення буде різним. Тому при роботі з якими структурами даних, до складу яких входять рядки змінної довжини, слід чітко розуміти, в яких одиницях виражені довжини рядків.
Якщо в наявних даних довжина рядка вказана в байтах, і рядок вказана в багатобайтовому кодуванні змінної довжини (наприклад, UTF-8), то за допомогою об'єктів роботи з двійковими даними прочитати таку структуру з файлу в дані типу Рядок – у загальному випадку неможливо.
Зате в такому випадку можна легко змінювати позицію читання/запису у файловому потоці. Якщо довжина рядка буде вказана в символах, з'являється можливість вважати такий рядок у дані типу Рядок, але стає неможливо виконувати зміну позиції читання/запису в такому потоці.
Для отримання довжини рядка в байтах можна скористатися наступною функцією для перетворення рядка в об'єкт ДвійковіДані :

Функція ОтриматиДвійковіДаніІншіРядки(Знач СтрПараметр , Значення Кодування = “UTF-8”)
ПотікПам'ять = Новий ПотікВПам'яті;
Письменник = Новий ЗаписДаних(ПотокПам'ять);
Письменник.(СтрПараметр, Кодування);
Письменник.();
Повернення ПотокПам'ять.ЗакритиІОтримати ДвійковіДані();
КінецьФункції

Власне розмір у байтах можна отримати за допомогою виклику функції Розмір() у об'єкта ДвійковіДані, який виходить внаслідок роботи функції.
Не рекомендується одночасне використання об'єктів Читання даних/запис данихта потокових об'єктів. Якщо між двома послідовними операціями читання з Читання даних або двома послідовними операціями запису в запис даних відбувається зміна позиції в потоці, з яким працюють об'єкти Ч теніє Даних/ЗаписДаних– генерується виняток. Так, наступний приклад демонструє коректну зміну позиції в потоці під час запису даних у потік:

Потік = Новий ПотікПам'яті ();

Запис Даних. Записати Рядок("Привіт світ!");
ЗаписДаних.();
Потік.Перейти (0, Позиція У Потоці. Початок);
ЗаписДаних = Новий ЗаписДаних (Потік);
Запис Даних. Записати Рядок("Бувай!");
ЗаписДаних.();
Наступний приклад привіт до виникнення винятку:

Потік = Новий ПотікПам'яті();

Запис Даних. Записати Рядок ("Привіт, мир!");
Потік.Перейти(0, ПозиціяУПотоку.Початок);
// У наступному рядку буде згенеровано виняток
Запис Даних. Записати Рядок ( "Поки!");
У той же час, можливі ситуації, коли поведінка системи буде некоректною, але жодних помилок формуватися не буде:

Потік = ОтриматиПотік();
Читання Даних = Новий Читання Даних (Потік);
ТестоваРядок = Читання Даних.
ВихіднаПозиція = Потік.ПоточнаПозиція();
ЗаписДаних = Новий ЗаписДаних(Потік);
Запис Даних. Записати Рядок (“Несподіваний рядок”);
ЗаписДаних.Закрити();
Потік.Перейти(ВихіднаПозиція, ПозиціяУПотоку.Початок);
// У загальному випадку неможливо визначити, яке значення буде поміщено в змінну.
ТестоваРядок2 = Читання Даних.

Описане в даному розділіповедінка викликана тим, що про об'єкти Читання даних / Запис даних використовують власні буфера при роботі з потоком. В результаті фактична позиція потоку відрізняється від логічної позиції, яка сформована як наслідок скоєних операцій.
Також не підтримується одночасне використання об'єктів Читання даних і запис даних, які використовують для своєї роботи один потік.