Отримати дані зі сховища значень 1С 8.3. Обмеження під час роботи з Веб-клієнтом

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Призначення

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Проблема:

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

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

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

Рішення

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

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

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

Для прикріплення довільного файлу з диска у формі елемента реалізовано команду "Прикріпити файл". Її програмний код представлений на наступному лістингу:

& НаКлієнті Процедура ПрикріпитиФайл(Команда) // Обробник команди клієнта. Вибір файлу // Діалог вибору файлу з дискаРежим = РежимДіалогуВиборуФайлу. Відкриття; ДіалогВідкриттяФайлу = Новий ДіалогВиборуФайлу(Режим) ; ДіалогВідкриттяФайлу. Повне ім'я файлу = " " ; ДіалогВідкриттяФайлу. Множинний Вибір = Брехня; ДіалогВідкриттяФайлу. Заголовок = "Виберіть файли"; Якщо діалог відкриття файлу. Вибрати() Тоді ШляхКФайлу = ДіалогВідкриттяФайлу. Повне Ім'я Файлу; // Отримання двійкові дані файлуДвійковіДані = Новий ДвійковіДані(ШляхКФайлу) ; // Передача двійкових даних на серверПрикріпити Файл Сервер (Двійкові Дані); Інакше Текст = " ru = " " Файл (и) не обраний!" " ; en =" " File (s) not selected!" " " ; Попередження(НСтр(Текст) ) ; КінецьЯкщо ; // Обробник на сервері запису файлу в ІБ // Трансформуємо об'єкт форми у довідник-об'єктОб'єктПоточний = РеквізитФормиЗначення("Об'єкт"); // Привласнюємо нове значення реквізиту "Дані"Об'єктПоточний. Дані = Новий СховищеЗначення(ДвійковіДані) ; // Зберігаємо зміниОб'єктПоточний. Записати() ; КінецьПроцедури

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

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

Вплив на продуктивність

Проведемо кілька тестів на продуктивність. У тестах будуть використовуватись два елементи довідника "Товари" з прикріпленим файлом і без. Розмір прикріпленого файлу складає 5 мегабайт.

Всі тести проводяться за допомогою обробки "ОтриманняЕлементу" у тестовій конфігурації. Завантажити цю конфігурацію Ви можете за посиланням наприкінці статті.

Виміряємо час відкриття елементів довідника "Товари". Для відкриття елемента використовується метод глобального контексту "ВідкритиЗначення()", як параметр якого передається посилання на елемент. Виконаємо замір часу відкриття за допомогою стандартного інструменту вимірювання продуктивності. Результати представлені на наступному скріншоті:

Як бачимо, час відкриття елемента з прикріпленим файлом більше 10 раз! Зробимо інший тест. Виконаємо метод "ОтриматиОб'єкт()" для посилання на елемент довідника товари. Результат тесту можна побачити на наступному скріншоті.

Різниця дуже суттєва. Отримання елемента без прикріпленого файлу відпрацьовує швидше у 194 рази!

Це відбувається тому, що метод "Отримати Об'єкт()" отримує всі дані з реквізитів елемента довідника за посиланням. Відповідно, метод отримує значення як реквізитів " Код " і " Найменування " , а й значення реквізиту " Дані " . Якщо в ньому зберігаються двійкові дані розміром 5 мегабайт (як у нашому прикладі), то при отриманні об'єкта ці дані розміщуються в оперативній пам'яті (як і інші реквізити) і потім передаються на сторону клієнта. Саме отримання даних із цього реквізиту збільшує час отримання об'єкта елемента. Якщо ж використовується тонкий канал зв'язку, то час відкриття збільшиться ще значніше через передачу великого обсягу інформації по мережі.

Примітка: при виконанні методу "ВідкритиЗначення()" також спочатку виходить об'єкт елемента довідника, потім трансформується в об'єкт форми і передається на клієнт (для керованих форм). Тобто, при відкритті елемента посилання одержання об'єкта також виконується.

Проведемо останній тест на час відкриття та запису елемента довідника з прикріпленим файлом і без нього. Результат подано на наступному скріншоті.

Закономірний результат. Час отримання і, потім, запис для елемента довідника з прикріпленим файлом виявився в ~19 разів більше. Як було зазначено вище, при отриманні об'єкта виходять значення всіх його реквізитів, зокрема і реквізиту " Дані " у якому збережено 5 мегабайт інформації. При записі елемента цей обсяг даних знову записується до інформаційної бази. Отже, зберігання даних у реквізиті довідника (або документа) з типом "СховищеЗначення" негативно впливає на продуктивність як при отриманні об'єкта, так і при поміщенні його в інформаційну базу.

Який спосіб вирішення завдання зберігання даних для об'єктів інформаційної бази найбільш правильний?

Правильне рішення

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

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

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

Тестова конфігурація з прикладом статті: LINK .

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

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

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

І тепер ми можемо створювати у цьому довіднику елементи, а у реквізит Об'єкткожного елемента записувати файл.

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

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

&На сервері Процедура ЗавантажитиВивантажитиФайл(ЕлементДовідника) Об'єктДовідника = ЕлементДовідника. Отримати Об'єкт () ; //Поміщаємо картинку в сховище значеньЯрликЗавантаження = Новий Зображення("g:\musor\favicon.ico" ) Новий СховищеЗначення; //Записуємо елемент довідникаОб'єкт Довідника. Об'єкт Об'єкт Довідника. Записати() ; //Вивантажуємо картинку зі сховища значень у файлІм'яФайлу = "g:\musor\favicon_1.ico" ; ЯрликВивантаження = Об'єктДовідника. Об'єкт. Отримати() ; ЯрликВивантаження. Записати(Ім'яФайлу) ; КінецьПроцедури

І кілька пояснень до коду.

  • Об'єкт розміщується у сховищі безпосередньо при створенні сховища за допомогою конструктора.

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