Інтернет Windows Android

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

Двійкові дані в 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 ХраніліщеДанних. Отримати ();

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

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

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

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

ТекІзображеніе.Об'ект \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С: Архів.

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