Пошаговый пример 1С 8.2: загрузка, хранение и отображение картинок (фотографий) в справочниках (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)
Комментарии