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

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

 

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

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

 

В первой части Пошагового примера загрузки, хранения и отображения картинок (фотографий) в справочниках мы с вами реализовали минимальный функционал, позволяющий нам выводить фото для элементов любого справочника.

На данный момент конфигурация из нашего примера имеет следующие недостатки (убедитесь сами):

  • если в открытой форме элемента справочника Сотрудники мы с помощью кнопки «Добавить картинку» будем последовательно выбирать несколько картинок (даже без выполнения команды «Записать»), то все эти картинки будут сохраняться в справочнике Файлы;
  • при выборе для Сотрудника новой картинки старая (которая была установлена до этого) не удаляется из справочника Файлы, а остается в нем;
  • если мы в открытой форме элемента справочника Сотрудники заменим фотографию сотрудника и попробуем закрыть форму, то форма закроется без каких-либо уведомлений – то есть система «не видит», что в элемент справочника внесены изменения и не спрашивает пользователя сохранять или нет эти изменения.

1. Прежде чем приступить к исправлению имеющихся «глюков» давайте сделаем наш справочник Файлы более удобным и функциональным.  Для этого по аналогии с шагами 6-8 первой части пошагового примера сделаем так, чтобы мы могли просматривать хранимые картинки в самом справочнике Файлы.

Создадим Форму элемента справочника Файлы:
Тип формы: Форма элемента справочника;
Реквизиты формы: Код, Наименование.

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

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

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

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

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

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

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

7. Теперь самое время приступить к исправлению найденных «глюков» при загрузке и хранении фотографий. Для этого в модуле  формы справочника Сотрудники доработаем нашу серверную процедуру УстановитьКартинку() – см. 11 пункт 1 части пошагового примера. Для удобства добавленные строки программного кода выделены подчеркиванием:

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

//добавили во 2 ЧАСТИ ПРИМЕРА
// тут проверим была ли ранее установлена картинка и если да - то удалим ее из справочника Файлы
//вторая проверка Объект.Картинка.ПолучитьОбъект()<>Неопределено нужна чтобы проверить если ли в справочнике
//Файлы элемент, на который ссылается наш реквизит Картинка.
//Тем не менее, картинки может не быть по 2 причинам:
//1 если мы удалим картинку из справочника Файлы вручную
//2 если мы установим новую картинку, но откажемся от сохранения изменений в данный элемент 

//справочника Сотрудники

Если Объект.Картинка.Пустая() = Ложь и Объект.Картинка.ПолучитьОбъект()<>Неопределено Тогда

СтарыйФайлКартинки = Объект.Картинка.ПолучитьОбъект();
СтарыйФайлКартинки.Удалить();
КонецЕсли;

//конец того, что добавили во 2 ЧАСТИ ПРИМЕРА

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

//добавили во 2 ЧАСТИ ПРИМЕРА. Модифицированность. Программно укажем, что данный элемент справочника был изменен.
ЭтаФорма.Модифицированность=Истина;
//если модифицированности недостаточно, то можно использовать метод формы Записать (снять комментарий с последней строки)
//ЭтаФорма.Записать();


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

8. Внимательно прочитайте комментарии в программном коде нашей серверной процедуры УстановитьКартинку().

9. Обратите внимание на следующую сроку кода:

ЭтаФорма.Модифицированность=Истина;

Тут мы свойству Формы «Модифицированность» присвоили значение истина. Так как ссылку на картинку (значение реквизита Картинка справочника Сотрудники) мы устанавливаем программно (в программном модуле, а не интерактивно), то программа «не видит» когда мы меняем значение данного реквизита. Но мы можем программно изменить данное свойство, что мы и делаем.

Теперь, если мы в открытой форме элемента справочника Сотрудники заменим фотографию сотрудника и попробуем закрыть форму, то система «увидит», что форма была модифицирована и задаст нам соответствующий вопрос:

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

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

Комментарии

  • <p>Спасибо за долгожданное продолжение.<br />Влад, есть опечаточка. В пункте 3.<br />&quot;<span style="font-size: 1em; line-height: 1.5; font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify;">Мышкой перетащите созданный в&nbsp;</span><a href="http://1c-uroki.ru/articles/pokaz_kartinok_v_spravochnike_1C_8.2" style="font-size: 1em; line-height: 1.5; border: 0px none; border-collapse: collapse; font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify;" target="_blank" title="Пошаговый пример Показ картинок в справочниках 1С 8.2 1 часть">шаге 7</a><span style="font-size: 1em; line-height: 1.5; font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify;">&nbsp;реквизит Фото на Форму элемента справочника Сотрудники&nbsp;</span><span style="font-size: 1em; line-height: 1.5;">&quot;</span></p><p><span style="font-size: 1em; line-height: 1.5;">следует читать как</span></p><p><span style="font-size: 1em; line-height: 1.5;">&quot;</span><span style="font-size: 1em; line-height: 1.5; font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify;">Мышкой перетащите созданный в&nbsp;</span><a href="http://1c-uroki.ru/articles/pokaz_kartinok_v_spravochnike_1C_8.2" style="font-size: 1em; line-height: 1.5; border: 0px none; border-collapse: collapse; font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify;" target="_blank" title="Пошаговый пример Показ картинок в справочниках 1С 8.2 1 часть">ш</a>аге 2<span style="font-size: 1em; line-height: 1.5; font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify;">&nbsp;реквизит Фото на Форму элемента справочника Файлы</span><span style="font-size: 1em; line-height: 1.5;">&quot;.</span></p><p><span style="font-size: 1em; line-height: 1.5;">Есть вопрос.&nbsp;<br />Понимаю, что за рамками нашего примера остался вопрос с размером картинки, имею в виду X на Y пикселей. Размер важен, т.к., если в базу помещать картинки большого размера - база быстро распухнет. Нагружать пользователя вопросами разрешения изображения - моветон. &nbsp;Возможно ли средствами 1С платформы, на этабе выбора картинки, автоматически преобразовывать к программно заданному разрешению, делая автомасштаб? Если да, то как или в какую сторону копать ?</span></p>
    31 марта 2014 , 16:01
  • <p>Ответ на вопрос&nbsp;<a href="http://1c-uroki.ru/user/2306" style="font-size: 1em; line-height: 1.5; border: 0px none; border-collapse: collapse; font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif;">johnylast</a>. В 1С средств для корректировки физического размера картинок нет. Но есть оператор&nbsp;<font color="#0000ff" style="font-size: 1em; line-height: 1.5; background-color: rgb(255, 255, 0);"><font color="#0000ff">Выполнить</font></font><span style="font-size: 1em; line-height: 1.5;">(&lt;Строка&gt;), где&nbsp;</span><u style="font-size: 1em; line-height: 1.5;">Строка - это с</u><span style="font-size: 1em; line-height: 1.5;">трока, содержащая текст исполняемого кода. Таким образом мы можем , например, с помощью такой коммандной строки вызвать программу&nbsp;</span><span style="font-family: Verdana; font-size: 14px; font-weight: bold; line-height: 21.46320152282715px;">ImageMagick, показать ей какой файл надо уменьшить и до какого размера (все эти параметры можно задать коммандной строкой), а затем результат такой обработки грузить уже в программу. Если это покажется слишком сложным,</span><span style="font-family: Verdana; font-size: 14px; font-weight: bold; line-height: 21.46320152282715px;">&nbsp;можно сделать еще проще: прочитать значение свойства &quot;Размер&quot; загружаемого файла и если он больше какого-то количества байт (килобайт) выводить пользователю предупреждение. В принципе нажать правый клик по картинке и выбрать вариант &quot;изменить&quot; сможет любой пользователь, а дальше ему останется только выбрать изменить размер и все...<br />Но я бы, конечно постарался реализовать 1 вариант, сейчас к сожалению с временем напряг, возможно позже помогу с кодом :)</span></p>
    01 апреля 2014 , 09:30
  • <p><u style="font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify;"><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">Если&nbsp;</span><span style="border: 0px none; border-collapse: collapse; color: rgb(0, 0, 255);">Объект</span><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">.</span><span style="border: 0px none; border-collapse: collapse; color: rgb(0, 0, 255);">Картинка</span><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">.</span><span style="border: 0px none; border-collapse: collapse; color: rgb(0, 0, 255);">Пустая</span><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">() = Ложь и</span><span style="border: 0px none; border-collapse: collapse; color: rgb(0, 0, 255);">&nbsp;Объект</span><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">.</span><span style="border: 0px none; border-collapse: collapse; color: rgb(0, 0, 255);">Картинка</span><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">.</span><span style="border: 0px none; border-collapse: collapse; color: rgb(0, 0, 255);">ПолучитьОбъект</span><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">()&lt;&gt;Неопределено Тогда</span><br /><br /><span style="border: 0px none; border-collapse: collapse; color: rgb(0, 0, 255);">СтарыйФайлКартинки&nbsp;</span><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">=&nbsp;</span><span style="border: 0px none; border-collapse: collapse; color: rgb(0, 0, 255);">Объект</span><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">.</span><span style="border: 0px none; border-collapse: collapse; color: rgb(0, 0, 255);">Картинка</span><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">.</span><span style="border: 0px none; border-collapse: collapse; color: rgb(0, 0, 255);">ПолучитьОбъект</span><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">();</span><br /><span style="border: 0px none; border-collapse: collapse; color: rgb(0, 0, 255);">СтарыйФайлКартинки</span><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">.</span><span style="border: 0px none; border-collapse: collapse; color: rgb(0, 0, 255);">Удалить</span><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">();</span><br /><span style="border: 0px none; border-collapse: collapse; color: rgb(255, 0, 0);">КонецЕсли;</span></u></p><p style="text-align: justify; "><font color="#ff0000" face="Lucida Sans Unicode, Lucida Sans, Lucida Grande, Verdana, Geneva, sans-serif"><u>При этом коде удаляется даже первый раз созданный элемент спрравочника Файлы</u></font></p>
    13 апреля 2014 , 08:19
  • <p>Я так понимаю, что картинки опять хранятся в БД, хотя в части 1 было написано что это плохо. Подскажите как хранить файлы с картинками на диске и отображать на форме?</p>
    10 января 2016 , 12:02