1с перетворити рядок в двійкові дані. Робота з двійковими даними
Двійкові дані в 1С призначені для зберігання фалів довільного формату. З їх допомогою можна:
- Організувати взаємодію за допомогою бінарного протоколу з різними пристроями;
- Зберігати у вигляді реквізиту об'єкта метаданих файли будь-яких форматів;
- Конвертувати текстові дані в бінарні (найчастіше використовується для відправки звітів);
- Працювати з двійковими даними в пам'яті.
Що може система
При роботі з двійковими даними платформа 8.3 вміє виконувати такі дії:
- Виконувати читання і запис двійкових даних;
- Переміщати дані з клієнта на сервер і назад з використанням тимчасового сховища;
- Ініціалізувати за допомогою бінарних файлів об'єкт типу «Картинка»;
- Зчитувати їх з всесвітньої мережі з використанням об'єктів «ПочтовоеВложеніе», «НТТРСоедіненіе» і т.д.
- використовувати криптографічні засоби для шифрування і підпису важливих вкладень;
- За допомогою об'єкта «ХешірованіеДанних» обчислювати хеш-функцію.
Збереження даних в реквізит
Для прикладу створимо в тестовій конфігурації довідник.
Насправді, використовувати один і той же довідник для зберігання інформації про номенклатуру та бінарних даних картинок трохи неправильно. При досить великих обсягах даних і великовагових файлах великого розміру можуть виникнути небажані простої і «гальма» в роботі системи. Набагато коректніше з точки зору системи буде організувати окремий довідник «Картинки», посилання на який ми могли б задати як тип реквізиту.
Важливо відзначити, що з огляду на те, що реквізити типу «ХраніліщеЗначенія», що містять двійкові дані недоступні в режимі керованого застосування, звернення до них можливо тільки з використанням методу РеквізітФормиВЗначеніе.
В поле повідомлення представлена \u200b\u200bзапис двійкових даних сховища значень.
Читання даних з реквізиту
Створимо обробку, яка буде виводити зберігається в бінарному вигляді в нашій конфігурації файл в табличний документ (це потрібно, припустимо для виведення на друк логотипу фірми).
В принципі, це весь код, який нам потрібен. За допомогою оператора Отримати () ми читаємо двійкові дані, що зберігаються у відповідному реквізиті довідника і передаємо їх в об'єкт «Картинка», який і буде показаний у верхній лівій клітинці табличного документа форми (Рис.9).
рис.9
перетворення даних
Нечасто, але буває, що при роботі з нестандартними обмінами з зовнішніми системами потрібна конвертація даних з двійкового формату в формат Base64 або назад.
У більшості випадків платформа самостійно перетворює дані, якщо цього не відбувається, необхідно скористатися глобальними функціями перекладу:
- Base64Строка - переводить задане значення в рядок відповідної кодування;
- Base64Значеніе - робить зворотне перетворення.
Оптимізація вищенаведеного коду
Код, представлений на Рис.4, безумовно, працює, але з одним суттєвим застереженням: якщо у властивостях конфігурації встановлений прапорець «Режим використання модальності» (Рис.10). В іншому випадку його використання викличе помилку.
рис.10
Для того, щоб цього не відбувалося треба перебуваючи в модулі форми елемента довідника, зайти в меню текст-\u003e Рефакторінг-\u003e Нерекомендовані синхронні визови-\u003e Перетворити виклики модуля.
Після деякого часу синхронні виклики автоматично будуть перетворені в асинхронні, а код набуде вигляду (Рис.11)
рис.11
Технологічна платформа 1С: Підприємство 8 дозволяє зберігати в інформаційній базі довільні файли, отримувати їх звідти і використовувати різними способами. Розглянемо ці операції на прикладах.
Перед виконанням завантаження файлу в інформаційну базу 1С потрібно отримати повну адресу файлу на диску. Робота з діалогами вибору файлів описана в.
Для зберігання файлів використовується реквізит (або ресурс регістра) з типом ХраніліщеЗначенія.
Завантаження довільного файлу в інформаційну базу 1С
Будь-який файл можна представити у вигляді двійкових даних і завантажити в ХраніліщеЗначеній.
При перетворенні двійкових даних в об'єкт ХраніліщеЗначенія використовується конструкція новий ХраніліщеЗначенія (Дані, Стиснення) з двома параметрами:
- дані - виконавчі дані, які потрібно помістити в сховище
- стиснення - ступінь стиснення алгоритму Deflation. Ціле число в діапазоні -1 ... 9. -1 - ступінь стиснення за замовчуванням. 0 - ніякого стиснення, 9 - максимальна ступінь стиснення. Значення за замовчуванням: -1. Параметр необов'язковий, якщо не вказано, то стиснення не використовується.
// Перетворимо файл в двійкові дані
Файл \u003d Новий ДвоічниеДанние (Шлях);
// Створюємо новий об'єкт ХраніліщеЗначенія
ХраніліщеДанних \u003d Новий ХраніліщеЗначенія (Файл, Новий СжатіеДанних (9));
Збереження довільного файлу з інформаційної бази 1С на диск
Для збереження файлу з бази 1С на диск потрібно визначити шлях і ім'я файлу. Для цього існує діалог збереження файлів, робота з яким описана в.
// Отримуємо двійкові дані зі сховища
// ХраніліщеДанних - реквізит об'єкта з типом ХраніліщеЗначенія
// Записуємо отримані дані на диск
// В змінної Шлях знаходиться повну адресу файлу на диску
Дані. Записати (Шлях);
Перегляд файлу, що знаходиться в інформаційній базі 1С
Для перегляду збереженого в базі файлу необхідно, щоб на комп'ютері було встановлено додаток, що відкриває даний файл.
// Отримуємо ім'я тимчасового файлу з необхідним розширенням
// У змінну Розширення потрібно помістити розширення файлу, наприклад "pdf"
Шлях \u003d ПолучітьІмяВременногоФайла (Розширення);
// Отримуємо дані зі сховища
// ХраніліщеДанних - реквізит об'єкта з типом ХраніліщеЗначенія
Дані \u003d ХраніліщеДанних. Отримати ();
// Записуємо дані в тимчасовий файл
Дані. Записати (Шлях);
// Намагаємося відкрити файл в призначеному для нього додатку
// Якщо програма не знайдено, з'явиться системний діалог "Відкрити за допомогою ..."
ЗапустітьПріложеніе (Шлях);
У сховищі значення можна зберегти майже будь-яку інформацію, наприклад,
... картинки (фотки):
// в цьому місці він все виводить ... ЕлементиФорми.ПолеКартінкі1.Картінка \u003d Храніліще.Получіть (); ТекІзображеніе.Запісать ();
... табличний документ:
ТабДок \u003d Новий ТаблічнийДокумент; ТабДок.Вивесті (ЕлементиФорми.ПолеТаблічногоДокумента1); Сховище \u003d Новий ХраніліщеЗначенія (ТабДок); Записати ();
КонецПроцедури
Процедура ВосстановітьІзХраніліщаНажатіе (Елемент)
ТабДок \u003d Храніліще.Получіть (); якщо ТабДок<>Не визначено Тоді ЕлементиФорми.ПолеТаблічногоДокумента1.Вивесті (ТабДок); КонецЕсли;
КонецПроцедури
... довільні файли (двійкові дані):
Вісімка підтримує стиснення даних, які розміщені в сховище:
... зовнішні обробки і звіти:
СтепеньСжатія \u003d Новий СжатіеДанних (9); // 9 максимум РеквізітТіпХраніліще \u003d Новий ХраніліщеЗначенія (Новий ДвоічниеДанние ( "c: \\ звіти \\ отчет.epf", СтепеньСжатія));
КонецПроцедури
Процедура ЗапустітьОбработкуІзХраніліща (РеквізітТіпХраніліще)
ІмяВременногоФайла \u003d КаталогВременнихФайлов () + "отчет.epf"; ДвоічниеДанние \u003d РеквізітТіпХраніліще.Получіть (); ДвоічниеДанние.Запісать (ІмяВременногоФайла); ВнешняяОбработка \u003d ВнешніеОбработкі.Создать (ІмяВременногоФайла); ВнешняяОбработка.ПолучітьФорму (). Відкрити ();
КонецПроцедури
Робота зі сховищем
Якщо це були ДвоічниеДанние, то їх можна відновити з сховища значення методом Отримати і записати в файл методом Записати ().
ДвоічниеДанние \u003d Храніліще.Получіть ();
ДвоічниеДанние \u003d Сховище;
КонецЕсли; ДвоічниеДанние.Запісать (имяфайла);
Якщо це був, наприклад, Word-документ (doc-файл, або інший файл зареєстрованого типу), то його можна відкрити так:
Щоб очистити поле типу Сховище значення, потрібно присвоїти йому Не визначено:
Робота з файлами і картинками у вбудованій мові 1С: Підприємство 8
призначення
У керованому додатку реалізований новий механізм роботи з файлами. Він забезпечує обмін файлами між інформаційною базою і клієнтським додатком. Особливістю даного механізму є те, що він орієнтований на використання в тонкому клієнті і Веб-клієнті і розроблений з урахуванням обмежень на роботу з файлами, що накладаються веб-браузерами.
Механізм являє собою набір методів, за допомогою яких можна помістити дані, що зберігаються локально у користувача, у тимчасове сховище інформаційної бази, Перенести цю інформацію з тимчасового сховища в базу даних і отримати її назад на комп'ютер користувача. Найбільш поширені прикладні завдання, які вирішуються цим механізмом, - це зберігання супровідної інформації, наприклад, зображень товарів, пов'язаних з договорами документів і т. П.
Область дії методів
тимчасове сховище
Тимчасове сховище - це спеціалізована область інформаційної бази, в яку можуть бути поміщені двійкові дані. Основне призначення - це тимчасове зберігання інформації при клієнт-серверному взаємодії до її перенесення до бази даних.
Необхідність у тимчасовому сховищі виникає через те, то в моделі роботи веб-браузера потрібно передати вибраний користувачем файл безпосередньо на сервер без можливості його зберігання на клієнті. При передачі файлу він поміщається в тимчасове сховище і вже потім може бути використаний під час запису об'єкта в базу даних.
Найбільш типова розв'язувана тимчасовим сховищем прикладна задача - забезпечення доступу до файлів або картинок до того, як об'єкт буде записаний в інформаційну базу, наприклад, у формі елемента.
Файл або двійкові дані, вміщені в сховище, ідентифікуються унікальним адресою, який в подальшому можна використовувати в операціях запису, читання або видалення. Ця електронна адреса була видають методи запису файлу у тимчасове сховище. Окремий метод у вбудованому мовою дозволяє визначити, чи є переданий адреса адресою, що вказує на дані у тимчасовому сховищі.
інформаційна база
Механізм дозволяє отримати доступ до двійковим даних, що зберігаються в реквізитах типу ХраніліщеЗначеній.
Як і в разі тимчасового сховища, доступ до інформації можливий через спеціальну адресу. Отримати його можна через спеціальний метод, передавши посилання на об'єкт або ключ записи регістру відомостей, і ім'я реквізиту. У разі табличній частині додатково потрібно передати і індекс рядка табличної частини.
Методи роботи з файлами мають обмеження при роботі з реквізитами інформаційної бази. Для них, на відміну від тимчасового сховища, є тільки читання інформації, але не її запис або видалення.
Опис методів роботи з файлами
Збереження даних в тимчасове сховище
Найбільш типовий сценарій використання даного механізму передбачає початкове розміщення даних користувача у тимчасове сховище. Для цього призначені два методи: ПоместітьФайл () і ПоместітьФайлВоВременноеХраніліще ().
Перший метод, ПоместітьФайл (), поміщає файл з локальної файлової системи в тимчасове сховище. Метод може приймати цільової адресу в сховище. Якщо ж він не визначений або є символом нового рядка, то буде створено новий файл і метод поверне його адресу через відповідний параметр.
Якщо параметр, що визначає інтерактивний режим роботи, дорівнює Істина, то метод відобразить стандартне діалогове вікно вибору файлу, в якому можна вибрати файл для приміщення в сховище. У цьому випадку метод також поверне адресу обраного файлу.
Як результат метод повертає Брехня, якщо користувач в інтерактивному режимі відмовився від здійснення операції в діалозі вибору файлу. Метод доступний тільки на клієнті.
Другий метод, ПоместітьФайлВоВременноеХраніліще (), схожий з попереднім, за винятком того, що він доступний на сервері, а дані для запису в тимчасове сховище подаються не у вигляді шляху в файлової системі, а у вигляді змінної типу ДвоічниеДанние. Точно так же, якщо не вказано цільової адресу, створюється новий файл в сховище. Його адреса повертається як результат функції.
Отримання файлу з тимчасового сховища
При записи об'єкта в інформаційну базу може знадобитися витягти дані з тимчасового сховища і помістити їх, наприклад, в реквізит. Для цього є відповідний серверний метод - ПолучітьФайлІзВременногоХраніліща (). Цей метод витягує дані з тимчасового сховища і повертає їх як результат. Для цього необхідно вказати адресу у тимчасовому сховищі. Ця електронна адреса повертають вищеописані методи ПоместітьФайл () і ПоместітьФайлВоВременноеХраніліще () в разі їх успішного виконання.
Видалення файлу з тимчасового сховища
Після того, як дані збережені в реквізиті, файл у тимчасовому сховищі можна видалити. Для цього є метод УдалітьФайлІзВременногоХраніліща (), який видаляє файл з тимчасового сховища. Метод приймає в параметрі адресу файлу у тимчасовому сховищі. Доступний на сервері.
Перевірка адреси на приналежність тимчасового сховища
Адреса файлу може вказувати як на тимчасове сховище, так і на реквізит в інформаційній базі. Для перевірки його типу існує метод ЕтоАдресВременногоХраніліща ().
Він перевіряє, що передана адреса є адресою, що вказує на сховище. Повертає Істина, якщо адреса вказує на тимчасове сховище. Метод доступний на сервері.
Отримання адреси реквізиту
Після того, як дані поміщені в реквізит в інформаційній базі, може знадобитися отримати доступ до них за допомогою файлових методів.
Але перш ніж отримати дані, наприклад з реквізиту, необхідно отримати адресу цього реквізиту. Для цього існує метод ПолучітьАдресФайлаВІнформаціоннойБазе ().
Його призначення - повернути адресу файлу в інформаційній базі по вихідним параметрам. Для цього необхідно передати ключ об'єкта (це може бути як посилання на об'єкт, так і ключ записи регістру відомостей) і ім'я реквізиту. Якщо потрібно отримати адресу файлу, що зберігається в реквізиті табличній частині, до імені реквізиту в параметрі, що задає ім'я реквізиту, необхідно додати ім'я табличній частині і точку «.». Метод доступний як на клієнті, так і на сервері.
Отримання файлу з інформаційної бази
Метод ПолучітьФайл () отримує файл з інформаційної бази і зберігає його в локальну файлову систему користувача. Перший параметр визначає адресу файлу в реквізиті або у тимчасовому сховищі файлів. Другий параметр визначає цільове розташування отриманого файлу. В не інтерактивному режимі необхідно вказати шлях. В інтерактивному режимі параметр є опціональним.
За замовчуванням метод виповнюється в інтерактивному режимі, тобто останній параметр дорівнює Істина. Це означає, що видається діалогове вікно, в якому можна вказати дію з отриманим файлом: запустити його або зберегти за вказаною користувачем розташуванню. Якщо активний інтерактивний режим, а параметр Цільовий шлях до файлу на диску не вказано, то операція відкриття файлу не доступна. Повертає булевское значення. Брехня означає, що користувач вибрав скасування операції в діалоговому вікні збереження файлів в інтерактивному режимі.
Приклад використання файлових методів
Перем ВибранноеІмя; Перем АдресВременногоХраніліща; Якщо ПоместітьФайл (АдресВременногоХраніліща, ВибранноеІмя, Істина) Тоді Об'ект.ІмяФайла \u003d ВибранноеІмя; ПоместітьФайлОб'екта (АдресВременногоХраніліща); КонецЕсли;
КонецПроцедури
// Копіювання файлу з тимчасового сховища в реквізит // довідника, запис об'єкта, видалення файлу з тимчасового // сховища & НаСервере Процедура ПоместітьФайлОб'екта (АдресВременногоХраніліща)
ЕлементСправочніка \u003d РеквізітФормиВЗначеніе ( "Об'єкт"); ДвоічниеДанние \u003d ПолучітьФайлІзВременногоХраніліща (АдресВременногоХраніліща); ЕлементСправочніка.ДанниеФайла \u003d Новий ХраніліщеЗначенія (ДвоічниеДанние); ФайлПутьНаДіске \u003d Новий Файл (ЕлементСправочніка.ІмяФайла); ЕлементСправочніка.ІмяФайла \u003d ФайлПутьНаДіске.Імя; ЕлементСправочніка.Запісать (); Модифікування \u003d Брехня; УдалітьФайлІзВременногоХраніліща (АдресВременногоХраніліща); ЗначеніеВРеквізітФорми (ЕлементСправочніка, "Об'єкт");
КонецПроцедури
// Зчитування файлу з реквізиту та збереження його // на локальному диску в інтерактивному режимі & НаКліенте Процедура ПрочітатьФайлІСохранітьНаДіск ()
Адреса \u003d ПолучітьАдресФайлаВІнформаціоннойБазе (Об'ект.Ссилка, "ДанниеФайла"); ПолучітьФайл (Адреса, Об'ект.ІмяФайла, Істина);
КонецПроцедури
Підтримка адрес в полі картинки
Елемент управління Поле картинки підтримує відображення картинки, заданої адресою файлу у тимчасовому сховищі або в базі даних.
Для цього у властивості Дані елемента форми необхідно задати реквізит строкового типу. Значення цього реквізиту і буде інтерпретуватися як адреса картинки.
приклад
ПоместітьФайл (АдресКартінкі, Істина)
Картінка.Данние \u003d АдресКартінкі
Обмеження при роботі з Веб-клієнтом
Робота описуваного механізму при використанні Веб-клієнта має деякі обмеження. Ці обмеження пов'язані з особливостями моделі безпеки браузера. Так, наприклад, клієнт самостійно не може зберегти файл в локальну файлову систему, тобто доступний тільки інтерактивний варіант клієнтських методів ПоместітьФайл () і ПолучітьФайл (). При спробі використовувати не інтерактивний режим генерується виняток. діалогові вікна, Які відображаються в інтерактивному режимі, специфічні для конкретного типу браузера.
Особливості при роботі з ХраніліщемЗначеній на Клієнта
проблема:
Коли у Документа в табличній частині є реквізит типу ХраніліщеЗначеній, то гальмує відкриття форми документа, якщо в цьому реквізиті записані дані великого розміру.
Передбачувана причина:
Можливо, при відкритті форми, на клієнт передається не посилання на дані знаходяться в ХраніліщеЗначеній, а самі дані.
Рішення
- У властивостях табличного реквізиту форми є прапор "Використовувати завжди". Якщо він встановлений, то вміст поля завжди передається між сервером і клієнтом - наприклад, при відкритті форми. Цей прапор треба відключити, але при цьому потрібно врахувати це в коді, так як за замовчуванням значення цього поля на клієнті не буде. Приклад можна подивитися в 1С: Архів.
Ще краще використовувати тимчасове сховище для передачі файлів між клієнтом і сервером.