Главная Материалы Пошаговый пример 1С 8.2: загрузка, хранение и отображение картинок (фотографий) в справочниках (1 часть)

Пошаговый пример 1С 8.2: загрузка, хранение и отображение картинок (фотографий) в справочниках (1 часть)

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

Пример является универсальным и без труда может быть использован в любой конфигурации платформы 1С: Предприятие 8.2

 

1. Постановка задачи: нам необходимо реализовать для нашей кадровой службы возможность добавления фотографий в наш справочник Сотрудники и сделать так, чтобы данные фотографии отображались при просмотре информации по конкретному сотруднику. Каждому сотруднику будет устанавливаться 1 фотография.

2. Приступаем к реализации: решение данной задачи будет выполняться с использование платформы 1С:Предприятие 8.2. Скачать платформу 1С 8.2 можно тут.

3. Создайте новую конфигурацию и запустите систему в режиме конфигуратора. Более подробную информацию вы найдете в шагах с 1 по 9 данного пошагового примера.

4. Создайте новый справочник Файлы. Перейдите на закладку «Данные», длину кода и наименования оставьте без изменений. Создайте новый реквизит справочника «Файл»с типом значения ХранилищеЗначения.

Для хранения файлов, в том числе и Картинок в системе 1С Предприятие 8.2 используется особый тип значений - ХранилищеЗначения.

Зачем нам понадобился отдельный справочник Файлы? Ведь можно было создать справочник Сотрудники и в этом справочнике сделать дополнительный реквизит Файл с типом значения ХранилищеЗначения?
Фотографии могут быть довольно большого объема. А если еще у нас будет много сотрудников, то работать с таким справочником очень скоро станет некомфортно. Дело в том, что при открытии списка справочника, считываются все реквизиты (поля) его элементов, а значит, если мы будем хранить фото в его реквизитах, то будут считываться и все фотографии. Понятно, что при выборках и работе со списком справочника Сотрудники система будет «тормозить». Чтобы этого не было, мы создаем отдельный служебный справочник Файлы, а в справочнике Сотрудники будем в одном из реквизитов хранить лишь ссылку на определенный элемент справочника Файлы (ссылку на фото). В таком режиме работать со справочником Сотрудники будет комфортно.

5. Создайте новый справочник Сотрудники. Перейдите на закладку «Данные», длину кода и наименования оставьте без изменений. Создайте новый реквизит справочника Картинка с типом значения СправочникСсылка.Файлы.

6. Перейдите на закладку «Формы» нашего справочника Сотрудники. Для создания формы элемента справочника нажмите на кнопку Открыть.

На первом шаге выбираем тип формы: Форма элемента справочника. На втором шаге убираем галку с реквизита Картинка, так как данный реквизит (ссылку на фото) мы будем заполнять программно, а не интерактивно.

7. Перед нами открывается конструктор форм. Создайте новый реквизит формы Фото, тип – Строка, длина 0.

8. Мышкой перетащите созданный в шаге 7 реквизит Фото на Форму элемента справочника Сотрудники. В свойстве «Вид» получившегося поля меняем значение с «Поле ввода» на «Поле картинки».

Именно в этом поле (Фото) у нас на Форме и будет отображаться фотография, установленная данному сотруднику.


9. Для того, чтобы можно было загружать фотографии в базу данных 1С, создадим команду ДобавитьКартинку.

Перейдите на закладку «Команды» и создайте новую команду «ДобавитьКартинку». Далее нажмите на увеличительное стекло в свойстве «Действие» для перехода в программный модуль и создания шаблона процедуры ДобавитьКартинку(Команда).

10.  Теперь в программном модуле нам необходимо описать действие нашей команды «ДобавитьКартинку». Пишем следующий программный код:

&НаКлиенте
Процедура ДобавитьКартинку(Команда)
ИмяФайла = "";
ПутьФайла = "";
//Вызываем Диалоговое окно и помещаем файл Картинки из локальной файловой системы во временное хранилище
Если ПоместитьФайл(ПутьФайла, , ИмяФайла, Истина) = Истина Тогда
 
//в строковый реквизит ФОТО нашей формы сохраняем ссылку на Картинку во временном хранилище
Фото = ПутьФайла;
//для создания нового элемента в Справочнике Файлы и записи Картинки в его реквизит Файл
//переходим на сервер с помощью вызова серверной процедуры

УстановитьКартинку();
КонецЕсли; 
//условие ЕСЛИ нужно для того, чтобы если пользователь отказался от выбора файла
//мы не вызывали серверную процедуру УстановитьКартинку()

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

11.  Действия по установке (загрузке) картинки и ее отображения на форме нашего справочника Сотрудника необходимо выполнять на стороне сервера. Это особенность работы системы с файлами. Именно для этого в тексте процедуры ДобавитьКартинку осуществляется вызов другой процедуры УстановитьКартинку(), которая будет выполняться на сервере.

В программном модуле, ниже процедуры ДобавитьКартинку(Команда) пишем следующий программный код:

&НаСервере
Процедура УстановитьКартинку()
//создаем новый элемент в Справочнике Файлы
НовыйФайлКартинки = Справочники.Файлы.СоздатьЭлемент();
//в реквизит СправочникаФайлы Файл помещаем выбранную ранее Картинку
НовыйФайлКартинки.Файл = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Фото));
Фото = ПоместитьВоВременноеХранилище(НовыйФайлКартинки.Файл.Получить());
//записываем новый элемент справочника Файлы
НовыйФайлКартинки.Записать();

//устанавливаем значение реквизита Картинка Справочника Сотрудники
Объект.Картинка = НовыйФайлКартинки.Ссылка;
КонецПроцедуры

12.  Теперь нам остается добавить на Форму Кнопку и связать Кнопку с нашей командой «ДобавитьКартинку».

13.  Как мы уже говорили в шаге 11, для отображения картинки на форме процедуру необходимо выполнять на сервере. Для этого выделяем Форму, в свойствах нашей Формы переходим на закладку «События» и переходим к событию ПриСозданииНаСервере.

14.  Напишем программный код процедуры ПриСозданииНаСервере(Отказ, СтандартнаяОбработка):

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//отображение картинки при открытии формы справочника
Фото = ПолучитьНавигационнуюСсылку(Объект.Картинка, "Файл");

//устанавливаем автомасштаб для картинки
Элементы.Фото.РазмерКартинки = РазмерКартинки.АвтоРазмер;
КонецПроцедуры

15. Запускаем систему в режиме 1С:Предприятие и смотрим что у нас получилось:

На этом упрощенная реализация отображения картинок в справочника закончена. Вы можете скачать кофигурацию с данным примером по ссылке ниже:

Скачать конфигурацию "Хранение и отображение картинок в справочнике 1С"

О том, как можно улучшить нашу конфигурацию и какие дополнительные проверки можно добавить мы поговорим во второй части пошагового примера.

Пошаговый пример 1С 8.2: загрузка, хранение и отображение картинок (фотографий) в справочниках (2 часть)

Количество просмотров: 255967

Комментарии

  • Влад,а можно поэксперементировать с конфигурацией готовой,например на 6 уроке?
    16 февраля 2014 , 13:05
  • <p>Игорь, не то что можно, а нужно!!! Вы всегда можете скачать эталонную конфигурацию с моего сайта.</p>
    16 февраля 2014 , 22:24
  • <p>Да, спасибо, ценный опыт. Загрузил фото для пары сотрудников, Все отображается корректно. Только не понял: в хранилище хранятся только ссылки на внешние файлы или сами фото?</p>
    17 февраля 2014 , 19:19
  • И еще,а каком формате комфортнее хранить фото для 1с?
    17 февраля 2014 , 20:46
  • <p>Для Игоря. 1. В хранилище хранятся не ссылки, а сами файлы в двоичном виде (в том виде, в котором они записываются на жесткий диск). Другими словами - наш файл конфигурации становится больше и содержит все картинки. В хранилище значений можно хранить файлы любого типа: картинки, видео, текстовые и т.д. Это как жесткий диск или флэшка внутри нашей конфигурации. Почему такая сложная реализация? Да потому, что у нас клиент-серверная среда и файлы, которые выбирает пользователь &quot;на клиенте&quot;, нужно передать на сервер (в идеале на другой компьютер) и там сохранить. Именно поэтому данные процедуры и выполняются на стороне сервера.</p><p>2. Для того, чтобы хранить ссылки на файлы нам достаточно иметь строковй реквизит, прочитать полный путь нашего файла и сохранить его в этот реквизит. Потом мы сможем даже открывать такие файлы из приложения 1С. Вообще давно планирую сделать материал по хранению файлов в 1С и рассмотреть все 4 основных варианта: 1. хранение ссылок на файл и копирование таких файлов в отдельный каталог средствами 1С; 2 храниение в справочнике (рассмотрели); 3 - хранение в регистре сведений - более общий случай, когда нам может понадобиться прикреплять файлы к различным справочниками и документам, создаем одно хранилище и работаем с ним; 4 используем Библиотеку стандартных подсистем и работаем с ее подсистемой работы с файлами.</p>
    18 февраля 2014 , 09:39
  • <p>По поводу формата хранения фото и картинок. Тут можно дать общие рекомендации по форматам картинок: самый компактный формат jpeg, не содержит прозрачных областей (невозможно создать прозрачную область или фон), затем идет gif - тоже что jpeg, но может содержать прозрачные области и может содержать анимацию - размер картинки в данном формате отличается незначительно. Png - может содержать прозрачность, но совсем другой алгоритм сжатия. За счет чего качество картинки выше, но и размер файла существенно больше. Даже если просто картинку в формате png взять и сохранить в формате jpeg или gif, ее размер может стать меньше в 2 раза. Ну и, наконец, формат BMP &nbsp;- фйл картинки в первозданном виде, без сжатия и других алгоритмов уменьшения размера файла. Самый большой размер файла. Со всеми указанными форматами система 1С умеет прекрасно работать с незапамятных времен...Вывод: оптимальные форматы для хранения картинок: jpeg или gif. &nbsp;</p>
    18 февраля 2014 , 14:44
  • <p>Влад, ОГРОМНОЕ СПАСИБО ! Это ответ на мой вопрос.</p><p>Попробовал - все получилось. Даже немножко подругому реализвал - в Справочник Ученики через Документ ПриемУченика. С возможным дублированием записей разобрался. Копаю теперь темочку с диалогом пользователя, пока не совсем получается, но решу обязательно. Кстати, подкидываю идейку для статьи про диалог с пользователем, там же есть особенности - на клиенте.</p>
    19 февраля 2014 , 10:03
  • <p>Ну и отлично! Про диалоги тоже сделаю материальчик :)</p>
    19 февраля 2014 , 10:21
  • <p>Теперь не могу найти файлы картинок, чтобы их удалить из БД. Можно, конечно добавить кнопку &quot;УдалитьКартинку&quot; и прописать все то же, только ссылку сделать пустой, но файл то не удалится?!</p><p>&nbsp;</p>
    19 февраля 2014 , 11:33
  • <p>Я об этом и говорил в конце! Во 2 части примера мы посмотрим, как улучшить наши процедуры, чтобы не хранить в базе не используемые картинки. Кроме того, сейчас есть такая неприятная вещь: если в открытой форме мы будем поочереди добавлять несколько файлов (добавили один - непонравился, добавили другое фото), то все эти картинки будут сохраняться в базе данных.</p>
    19 февраля 2014 , 12:36