1с робота з двійковими даними. Робота з двійковими даними

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

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

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

// в цьому місці він все виводить ... ЕлементиФорми.ПолеКартінкі1.Картінка \u003d Храніліще.Получіть (); ТекІзображеніе.Запісать ();

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

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

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

Процедура ВосстановітьІзХраніліщаНажатіе (Елемент)

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

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

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

ХЗ \u003d Новий ХраніліщеЗначенія (Новий ДвоічниеДанние (файл));

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

ХЗ \u003d Новий ХраніліщеЗначенія (Новий ДвоічниеДанние (файл), Новий СжатіеДанних (9));

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

Процедура ЗагрузітьОбработкуВХраніліще (РеквізітТіпХраніліще)

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

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

Процедура ЗапустітьОбработкуІзХраніліща (РеквізітТіпХраніліще)

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

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

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

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

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

ДвоічниеДанние \u003d Храніліще.Получіть ();

ДвоічниеДанние \u003d Сховище;

КонецЕсли; ДвоічниеДанние.Запісать (имяфайла);

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

ЗапустітьПріложеніе (имяфайла);

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

РеквізітХраніліще \u003d Не визначено;

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

призначення

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Перем ВибранноеІмя; Перем АдресВременногоХраніліща; Якщо ПоместітьФайл (АдресВременногоХраніліща, ВибранноеІмя, Істина) Тоді Об'ект.ІмяФайла \u003d ВибранноеІмя; ПоместітьФайлОб'екта (АдресВременногоХраніліща); КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

проблема:

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

Передбачувана причина:

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

Рішення

  • У властивостях табличного реквізиту форми є прапор "Використовувати завжди". Якщо він встановлений, то вміст поля завжди передається між сервером і клієнтом - наприклад, при відкритті форми. Цей прапор треба відключити, але при цьому потрібно врахувати це в коді, так як за замовчуванням значення цього поля на клієнті не буде. Приклад можна подивитися в 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.
Для виконання цих дій буде потрібно наступний код на вбудованій мові:

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

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

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

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

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

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

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

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

Буфер \u003d Новий БуферДвоічнихДанних(12);
файл \u003d ФайловиеПотокі.Открить (КаталогВременнихФайлов() + "Windows Logon.wav", РежімОткритіяФайла.Открить, ДоступКФайлу.Чтеніе);
Файл.Прочітать (Буфер, 0, 12);
Розмір \u003d Буфер.ПрочітатьЦелое32(4);
ПотокСтрокі \u003d Новий ПотокВПамяті (Буфер);
ПотокСтрокі.Перейті(0, ПозіціяВПотоке.Начало);

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

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

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

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

функція ПолучітьДвоічниеДанниеІзСтрокі(Знач СтрПараметр, Знач Кодування \u003d "UTF-8")
ПотокПамять \u003d Новий ПотокВПамяті;
Письменник \u003d Новий ЗапісьДанних (ПотокПамять);
Пісатель.ЗапісатьСтроку(СтрПараметр, Кодування);
Пісатель.Закрить();
повернення ПотокПамять.ЗакритьІПолучітьДвоічниеДанние();
КонецФункціі

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

Потік \u003d Новий ПотокВПамяті ();

ЗапісьДанних.ЗапісатьСтроку("Привіт світ!");
ЗапісьДанних.Закрить();
Поток.Перейті (0, ПозіціяВПотоке.Начало);
ЗапісьДанних \u003d Новий ЗапісьДанних (Потік);
ЗапісьДанних.ЗапісатьСтроку("Поки!");
ЗапісьДанних.Закрить();
Наступний приклад привіт до виникнення виключення:

Потік \u003d Новий ПотокВПамяті ();

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

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

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

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

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

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

При роботі з двійковими даними платформа 8.3 вміє виконувати такі дії:

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

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

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

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


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


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

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

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


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

рис.9

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

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

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

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

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

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

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

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

рис.11

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

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

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

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

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

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

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

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

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

ХраніліщеДанних \u003d Новий ХраніліщеЗначенія (Файл, Новий СжатіеДанних (9));

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

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

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

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

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

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

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

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

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

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