В статье рассмотрен пример вывод изображения на управляемую форму элемента справочника при отказе режима модальности.
Применимость
В статье рассматривается платформа «1С:Предприятие» редакции 8.3. Представленная информация актуальна для текущих релизов платформы.
Работа с файлами (картинками) в интерфейсе Такси
Рассмотрим алгоритм работы с файлами и картинками в новом интерфейсе 1С:Предприятие 8.3 “Такси”.
Во-первых, почему я решил написать эту статью: Новая концепция 1С – отказ от модальных окон, следовательно все методы и объекты, которые порождали открытие модальных окон в новом интерфейсе работать не смогут, точнее смогут, только если в свойствах конфигурации разрешить модальные окна.
Однако, если разрешить модальные окна, то мы столкнемся с проблемами при работе в web-клиенте.
Во-вторых, о работе с картинками в управляемых формах часто спрашивают.
Итак, задача: в справочнике “Товары” необходимо сохранять и отображать в форме фотографию товара.
Исходная конфигурация не содержит ничего, кроме самого справочника с товарами, выкладывать ее не буду, просто создайте пустую конфигурацию в 8.3.
Для хранения самого графического файла, в справочнике создадим реквизит “ДанныеКартинки”, с типом “Хранилище значений”.
Для увеличения нажмите на изображение.
Если планируете выгружать картинку (файл) из информационной базы обратно в файловую систему, то добавьте еще реквизит, который будет хранить исходное имя файла и его тип.
Для увеличения нажмите на изображение.
Как будем отображать картинку в форме? Нет, не декорацией с типом “картинка”. А в виде реквизита формы с типом “строка”. Да, да! Это очевидно, и странно, что мало кто об этом догадывается сам.
Все дело в том, что если на форму вынести реквизит с типом “строка”, который будет содержать навигационную ссылку на графические данные или адрес временного хранилища которое содержит такие данные, то форма сможет отобразить сами графические данные.
Добавим реквизит формы с именем “СсылкаНаКартинку”, тип “строка”, длина не ограничена. И поместим его в реквизиты формы.
Для увеличения нажмите на изображение.
По умолчанию, строка в форме будет выглядеть как поле ввода, нам нужно поменять это, в свойствах элемента формы. Выберем в свойстве “Вид” “Поле картинки”.
Для увеличения нажмите на изображение.
Интерфейсная часть готова. Займемся кодингом. Создадим команду формы “ВыбратьФайлКартинки”, в виде кнопки расположим ее на форме.
Для увеличения нажмите на изображение.
В модуле опишем обработчик события “Действие” для созданной команды формы:
Для увеличения нажмите на изображение.
Пару комментариев к вышеописанному коду:
Если бы мы не обращали внимание на режим модальности приложения, то могли вполне использовать метод “ПоместитьФайл”, однако цель статьи показать работу с файлами именно в таком режиме.
Метод НачатьПомещениеФайла помещает выбранный файл во временное хранилище (если выбор файла был произведен) и вызывает процедуру “ОбработатьВыборФайла” в этом же модуле.
Обращаю внимание на выделенный “УникальныйИдентификатор”, этим свойством мы связали временное хранилище с текущей формой. В противном случае файл в хранилище помещен будет, но само хранилище при серверном вызовет будет уничтожено, а нам оно еще понадобится, для записи файла в реквизит справочника.
Опишем процедуру “ОбработатьВыборФайла”:
Для увеличения нажмите на изображение.
Если пользователь не отказался от выбора файла, то в реквизит формы “СсылкаНаКартинку” помещаем адрес во временном хранилище, куда были помещены данные картинки.
Вуаля!
Так, осталось теперь при записи элемента справочника записать данные из временного хранилища в реквизит элемента справочника. Описываем событие ПередЗаписьюНаСервере:
Для увеличения нажмите на изображение.
Проверяем в реквизите формы у нас что? Если адрес временного хранилища, пишем данные в реквизит элемента справочника, обращаясь к “ТекущийОбъект”, “ТекущийОбъект” – это сконвертированные данные формы, которые пишутся в базу в этот момент времени.
Осталось описать открытие формы, для отображения картинки уже сохраненной в реквизите элемента справочника.
Для увеличения нажмите на изображение.
Вот и все. Готовую базу можно взять .
Павел Чистов
Время неумолимо идёт вперёд, а платформа 1С 8 бежит ещё быстрей этого времени.
Управляемые формы теперь называются "интерфейс ТАКСИ", модальные окна запрещены, а режим использования синхронных вызовов расширений и внешних компонент наглухо положил работоспособность большинства этих расширений и внешних компонент, и половину старых методов в добавок.
В общем, пацаны, дела такие - многие из вас читали статью великолепного Чистова П. о работе с файлами в 8.3
Если Вы ещё этого не сделали - бегом марш! ()
Суть механизма работы с файлами в кратце:
1) На клиенте выбираем файл
2) Пихаем его в чёрный ящик
3) Сохраняем содержимое чёрного ящика на сервере
Загвоздка состоит в том, что делать это надо особенно, по-новому и с душой.
Поэтому ваши
ВыбранныйФайл.Существует()
и прочие языческие штучки здесь не прокатят.
Итак, поехали!
Вот листинг кода, который позволяет загрузить файл с клиента
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтаФорма); ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогОткрытияФайла.МножественныйВыбор = Ложь; НачатьПомещениеФайлов(ОписаниеОповещения, ДиалогОткрытияФайла, Истина, УникальныйИдентификатор);
Нас интересует метод "НачатьПомещениеФайлов ", который, собственно, вызывает диалог выбора файла и помещает этот файл во временное хранилище. Заморачиваться с описанием временного хранилища нет смысла, просто запомните - это то место, куда помещаются все выбранные нами файлы в виде двоичных данных (черный ящик).
&НаКлиенте Процедура ОбработатьВыборФайла(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт Если ПомещенныеФайлы = Неопределено Тогда Возврат; КонецЕсли; Для каждого ПереданныйФайл Из ПомещенныеФайлы Цикл ПутьКФайлу = ПереданныйФайл.Имя; Запись.ИмяФайла = РазборСтроки(ПутьКФайлу, "\"); Элементы.ОткрытьФайл.Заголовок = Запись.ИмяФайла; Адрес = ПереданныйФайл.Хранение; КонецЦикла; КонецПроцедуры // ()
Понять, что там и как храниться в этом временном хранилище практически невозможно. Можно только обратиться к нашему файлу по навигационной ссылке, которая присваивается автоматически (см. переменную "Адрес ").
С тем, что файлы нужно хранить в реквизите или ресурсе с типом "Хранилище значения ", спорить, думаю, никто не будет. Достать файл из временного хранилища и поместить его в реквизит с типом "Хранилище значения " можно след.образом:
Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Адрес));
С одним разобрались, теперь второе - как достать файл из этого хранилища значений (которое, напомню, находится на сервере) и сохранить на диск клиента?
Прежде всего, нам надо получить навигационную ссылку на реквизит с типом "Хранилище значения ", куда у нас помещается файл в виде бинарных данных.
Будьте, внимательны! Эта навигационная ссылка уже не имеет с временным хранилищем ничего общего! Проверить тип навигационной ссылки можно методом
ЭтоАдресВременногоХранилища(Адрес)
По традиции, листинг кода, который вызывает диалог сохранения файла
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаСохраненияФайлов", ЭтаФорма); Файл = Новый ОписаниеПередаваемогоФайла(ИмяФайла, Адрес); ПолучаемыеФайлы = Новый Массив; ПолучаемыеФайлы.Добавить(Файл); ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); ДиалогОткрытияФайла.МножественныйВыбор = Ложь; НачатьПолучениеФайлов(ОписаниеОповещения,ПолучаемыеФайлы, ДиалогОткрытияФайла, Истина);
Значение переменной "Файл " это ещё одна особенность данного способа. Здесь стоит обратить внимание на "ИмяФайла ". Дело в том, что помещая файл во временное хранилище, информация о его имени и расширении теряется. Поэтому не забудьте где-нибудь сохранять корректное имя файла, или хотя бы его расширение, чтобы потом не мучаться с вопросом "А это вордовский документ или мп3? "
Метод "НачатьПолучениеФайлов " аналогичен методу "НачатьПомещениеФайлов ". Просто один открывает диалог для выбора файла, другой же, наоборот, открывает диалог для сохранения файла.
В принципе всё.
При использовании данного способа, никакие совместимости модальности и синхронных вызовов в свойствах конфигурации устанавливать не нужно.
Статью писал больше как памятку для себя.
Время неумолимо идёт вперёд, а платформа 1С 8 бежит ещё быстрей этого времени.
Управляемые формы теперь называются “интерфейс ТАКСИ”, модальные окна запрещены, а режим использования синхронных вызовов расширений и внешних компонент наглухо положил работоспособность большинства этих расширений и внешних компонент, и половину старых методов в добавок.
В общем, пацаны, дела такие – многие из вас читали статью великолепного Чистова П. о работе с файлами в 8.3
Если Вы ещё этого не сделали – бегом марш! ()
Суть механизма работы с файлами в кратце:
1) На клиенте выбираем файл
2) Пихаем его в чёрный ящик
3) Сохраняем содержимое чёрного ящика на сервере
Загвоздка состоит в том, что делать это надо особенно, по-новому и с душой.
Поэтому ваши
ВыбранныйФайл.Существует()
и прочие языческие штучки здесь не прокатят.
Итак, поехали!
Вот листинг кода, который позволяет загрузить файл с клиента
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтаФорма); ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогОткрытияФайла.МножественныйВыбор = Ложь; НачатьПомещениеФайлов(ОписаниеОповещения, ДиалогОткрытияФайла, Истина, УникальныйИдентификатор);
Нас интересует метод “НачатьПомещениеФайлов “, который, собственно, вызывает диалог выбора файла и помещает этот файл во временное хранилище. Заморачиваться с описанием временного хранилища нет смысла, просто запомните – это то место, куда помещаются все выбранные нами файлы в виде двоичных данных (черный ящик).
&НаКлиенте Процедура ОбработатьВыборФайла(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт Если ПомещенныеФайлы = Неопределено Тогда Возврат; КонецЕсли; Для каждого ПереданныйФайл Из ПомещенныеФайлы Цикл ПутьКФайлу = ПереданныйФайл.Имя; Запись.ИмяФайла = РазборСтроки(ПутьКФайлу, "\"); Элементы.ОткрытьФайл.Заголовок = Запись.ИмяФайла; Адрес = ПереданныйФайл.Хранение; КонецЦикла; КонецПроцедуры // ()
Понять, что там и как храниться в этом временном хранилище практически невозможно. Можно только обратиться к нашему файлу по навигационной ссылке, которая присваивается автоматически (см. переменную “Адрес “).
С тем, что файлы нужно хранить в реквизите или ресурсе с типом “Хранилище значения “, спорить, думаю, никто не будет. Достать файл из временного хранилища и поместить его в реквизит с типом “Хранилище значения ” можно след.образом:
Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Адрес));
С одним разобрались, теперь второе – как достать файл из этого хранилища значений (которое, напомню, находится на сервере) и сохранить на диск клиента?
Прежде всего, нам надо получить навигационную ссылку на реквизит с типом “Хранилище значения “, куда у нас помещается файл в виде бинарных данных.
Будьте, внимательны! Эта навигационная ссылка уже не имеет с временным хранилищем ничего общего! Проверить тип навигационной ссылки можно методом
ЭтоАдресВременногоХранилища(Адрес)
По традиции, листинг кода, который вызывает диалог сохранения файла
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаСохраненияФайлов", ЭтаФорма); Файл = Новый ОписаниеПередаваемогоФайла(ИмяФайла, Адрес); ПолучаемыеФайлы = Новый Массив; ПолучаемыеФайлы.Добавить(Файл); ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); ДиалогОткрытияФайла.МножественныйВыбор = Ложь; НачатьПолучениеФайлов(ОписаниеОповещения,ПолучаемыеФайлы, ДиалогОткрытияФайла, Истина);
Значение переменной “Файл ” это ещё одна особенность данного способа. Здесь стоит обратить внимание на “ИмяФайла “. Дело в том, что помещая файл во временное хранилище, информация о его имени и расширении теряется. Поэтому не забудьте где-нибудь сохранять корректное имя файла, или хотя бы его расширение, чтобы потом не мучаться с вопросом “А это вордовский документ или мп3? “
Метод “НачатьПолучениеФайлов ” аналогичен методу “НачатьПомещениеФайлов “. Просто один открывает диалог для выбора файла, другой же, наоборот, открывает диалог для сохранения файла.
В принципе всё.
При использовании данного способа, никакие совместимости модальности и синхронных вызовов в свойствах конфигурации устанавливать не нужно.
Статью писал больше как памятку для себя.
Файл с расширением.MXL представляет собой табличный документ, созданный программой «1С:Предприятие». Первоначально «1С:Предприятие» было предназначено для автоматизации бухгалтерского учёта. В нашей статье расскажем как открыть файл с расширением.MXL.
Чтобы открыть такой файл, запустите «1С Предприятие» и выберите меню «Файл» -> «Открыть». При желании, можно сохранить такой файл в формате Excel. Для этого всё в том же меню «Файл» выбрать пункт «Сохранить как..», а затем установить тип файла «Таблица Excel». Если «1С Предприятие» на вашем компьютере не установлено, вы можете скачать и установить бесплатное приложение «1С Предприятие — Работа с файлами» с официального сайта компании. Это программа поможет открыть, просмотреть, распечатать и конвертировать файлы.
Скачать «1С Предприятие — Работа с файлами» бесплатно
Загрузить программу с официального сайта . Работа с файлами аналогична работе с файлами в режиме «1С:Предприятие».
Доступна русскоязычная версия программы. При установке программы нужно выбрать полный дистрибутив.
После установки «1С Предприятие — Работа с файлами» вы сможете не просто просмотреть файл с расширением.mxl, но и конвертировать его в exel.
Технологическая платформа 1С:Предприятие 8 позволяет сохранять в информационной базе произвольные файлы, получать их оттуда и использовать различными способами. Рассмотрим эти операции на примерах.
Перед выполнением загрузки файла в информационную базу 1С нужно получить полный адрес файла на диске. Работа с диалогами выбора файлов описана в .
Для хранения файлов используется реквизит (или ресурс регистра) с типом ХранилищеЗначения .
Загрузка произвольного файла в информационную базу 1С
Любой файл можно представить в виде двоичных данных и загрузить в ХранилищеЗначений .
При преобразовании двоичных данных в объект ХранилищеЗначения используется конструкция новый ХранилищеЗначения(Данные,Сжатие) с двумя параметрами:
- Данные — двоичные данные, которые нужно поместить в хранилище
- Сжатие — степень сжатия алгоритма Deflation. Целое число в диапазоне -1…9. -1 — степень сжатия по умолчанию. 0 — никакого сжатия, 9 — максимальная степень сжатия. Значение по умолчанию: -1. Параметр необязательный, если не указан, то сжатие не используется.
//Преобразуем файл в двоичные данные
Файл =
Новый
ДвоичныеДанные(Путь)
;
//Создаем новый объект ХранилищеЗначения
ХранилищеДанных =
Новый
ХранилищеЗначения(Файл,
Новый
СжатиеДанных(9
)
)
;
Сохранение произвольного файла из информационной базы 1С на диск
Для сохранения файла из базы 1С на диск нужно определить путь и имя файла. Для этого существует диалог сохранения файлов, работа с которым описана в .
//Получаем двоичные данные из хранилища
//ХранилищеДанных - реквизит объекта с типом ХранилищеЗначения
//Записываем полученные данные на диск
//В переменной Путь находится полный адрес файла на диске
Данные.
Записать(Путь)
;
Просмотр файла, находящегося в информационной базе 1С
Для просмотра сохраненного в базе файла необходимо, чтобы на компьютере было установлено приложение, открывающее данный файл.
//Получаем имя временного файла с необходимым расширением
//В переменную Расширение нужно поместить расширение файла, например "pdf"
Путь=
ПолучитьИмяВременногоФайла(Расширение)
;
//Получаем данные из хранилища
//ХранилищеДанных - реквизит объекта с типом ХранилищеЗначения
Данные=
ХранилищеДанных.
Получить()
;
//Записываем данные во временный файл
Данные.
Записать(Путь)
;
//Пытаемся открыть файл в предназначенном для него приложении
//Если приложение не найдено, появится системный диалог "Открыть с помощью..."
ЗапуститьПриложение(Путь)
;