Опишу вкратце действия шаг за шагом но если что-то сложно написал, заранее прошу прощения.
1. Создаю константу ПутьККартинкамНаСервере. В нее пишу полный путь к сетевому каталогу. Выполняем код: Константы.ПутьККартинкамНаСервере.Установить("\\ВашПуть\");
2. Создаю регистр сведений ИзображенияНоменклатуры с двумя измерениями Объект (Справочник.Номенклатура), Путь (Строка, 255) и реквизитом Основное (Булево).
3. В регистр сведений ИзображенияНоменклатуры добавляю основную форму записи. После на форму кнопку ИзменитьКартинку. В модуль формы пишу код листинга 1.0 и привяжем событие Нажатие на кнопку.
//листинг 1.0
Функция КоличествоКартинок(Объект)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИзображенияНоменклатуры.Объект КАК Объект
|ИЗ
| РегистрСведений.ИзображенияНоменклатуры КАК ИзображенияНоменклатуры
|ГДЕ
| ИзображенияНоменклатуры.Объект = &Объект";
Запрос.УстановитьПараметр("Объект",Объект);
Результат = Запрос.Выполнить().Выгрузить();
Возврат Результат.Количество();
КонецФункции
Функция ПолучитьЧастьСтрокиОтделеннойСимволом(Знач ИсходнаяСтрока, Знач СимволПоиска)
ПозицияСимвола = СтрДлина(ИсходнаяСтрока);
Пока ПозицияСимвола >= 1 Цикл
Если Сред(ИсходнаяСтрока, ПозицияСимвола, 1) = СимволПоиска Тогда
Возврат Сред(ИсходнаяСтрока, ПозицияСимвола + 1);
КонецЕсли;
ПозицияСимвола = ПозицияСимвола - 1;
КонецЦикла;
Возврат "";
КонецФункции
Процедура ИзменитьКартинкуНажатие(Элемент)
СтандартнаяОбработка = ложь;
ПутьКСерверу = Константы.ПутьККартинкамНаСервере.Получить();
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогОткрытияФайла.Заголовок = "Выберите файл с изображением";
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
ДиалогОткрытияФайла.ПредварительныйПросмотр = Истина;
Фильтр = "(*.jpg)|*.jpg,(*.png)|*.png";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ВыбранноеИзображение = ДиалогОткрытияФайла.ПолноеИмяФайла;
Иначе
Возврат;
КонецЕсли;
Артикул = Объект.Артикул;
КолКарт = КоличествоКартинок(Объект);
Расширение = ПолучитьЧастьСтрокиОтделеннойСимволом(ДиалогОткрытияФайла.ПолноеИмяФайла,".");
Имякартинки = "NPhoto_";
Если КолКарт = 0 тогда
ИмяНаСервере = Строка(Имякартинки)+СокрЛП(Артикул)+"."+Расширение;
Иначе
ИмяНаСервере = Строка(Имякартинки)+СокрЛП(Артикул)+"_"+Строка(КолКарт)+"."+Расширение;
КонецЕсли;
КопироватьФайл(ДиалогОткрытияФайла.ПолноеИмяФайла, ПутьКСерверу+ИмяНаСервере);
ПутьККартинке = ИмяНаСервере;
Путь = ПутьККартинке;
КонецПроцедуры
4. Добавляю общую форму ФормаИзображения с полем картинки ОсновноеИзображение и табличное поле Изображения которое будет содержать список для редактирования изображения. В модуле пишу листинг 2.0. Далее в свойстве табличного поля указываю ТипЗначения: РегистрСведенийСписок.ИзображенияНоменклатуры и событие ИзображенияОбработкаЗаписиНовогоОбъекта. И обязательно привязать одноименное событие формы ПриОткрытии. //листинг 2.0
Перем мКартинки;
Перем ПутьКСерверу;
Процедура ПриОткрытии()
УстОтбор(Изображения.Отбор,,"Объект", ВладелецФормы.Ссылка, Истина);
мКартинки = Добавленные.ПолучитьКартинкиИзРегистра(ВладелецФормы.Ссылка);
Если мКартинки.количество() > 0 тогда
ФайлКартинки = новый Файл(ПутьКСерверу+мКартинки[0].Путь);
Если ФайлКартинки.Существует() и СтрДлина(мКартинки[0].Путь) > 0 тогда
ЭлементыФормы.ОсновноеИзображение.картинка = новый Картинка(ПутьКСерверу+мКартинки[0].Путь);
КонецЕсли;
Иначе
ЭлементыФормы.ОсновноеИзображение.картинка = новый Картинка();
КонецЕсли;
ТекущиеИзображение = 0;
КонецПроцедуры
Процедура УстОтбор(Отбор,НастройкаОтбора=0,Поле="Объект",Значение,ОтключатьПустое=Ложь) Экспорт
Если Отбор.Найти(Поле) = Неопределено Тогда
Отбор.Добавить(Поле);
КонецЕсли;
Попытка
Отбор[Поле].ВидСравнения=ВидСравнения.Равно;
Исключение
Отбор[Поле].ВидСравнения=ВидСравнения.Содержит;
КонецПопытки;
Отбор[Поле].Значение=Значение;
Отбор[Поле].Использование=?(ОтключатьПустое,ЗначениеЗаполнено(Значение),Истина);
Если ЗначениеЗаполнено(НастройкаОтбора) Тогда
НастройкаОтбора[Поле].Доступность=Ложь;
КонецЕсли;
КонецПроцедуры
Процедура ИзображенияОбработкаЗаписиНовогоОбъекта(Элемент, Объект, СтандартнаяОбработка)
СтандартнаяОбработка = ложь;
КонецПроцедуры
функция ПолучитьКартинкиИзРегистра(объект)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИзображенияНоменклатуры.Путь
|ИЗ
| РегистрСведений.ИзображенияНоменклатуры КАК ИзображенияНоменклатуры
|ГДЕ
| ИзображенияНоменклатуры.Объект = &Объект
|
|УПОРЯДОЧИТЬ ПО
| ИзображенияНоменклатуры.Основное";
Запрос.УстановитьПараметр("Объект", Объект);
Результат = Запрос.Выполнить().Выгрузить();
Возврат Результат;
КонецФункции
ПутьКСерверу = Константы.ПутьККартинкамНаСервере.Получить();
мКартинки = новый ТаблицаЗначений;
5. Идем в ФормуЭлемента номенклатуры и заменяем код в процедуре ОсновноеИзображениеНажатие(). Код в листинге 3.0//листинг 3.0
Процедура ОсновноеИзображениеНажатие(Элемент)
//Если Не РаботаСДиалогами.ЗаписатьНовыйОбъектВФорме(ЭтаФорма) Тогда
// Возврат;
//КонецЕсли;
//РаботаСФайлами.ОткрытьФормуИзображения(ЭтаФорма, ОсновноеИзображение, Ссылка);
Форма = ОткрытьФорму("ОбщаяФорма.ФормаИзображения", , ЭтаФорма);
КонецПроцедуры
Осталось только написать запрос получения изображения из регистра для показа в формах.
6. Так как форм где необходимо отобразить изображение может быть много, функции из листинга 4.0 поместим в общий модуль. У меня общий модуль называется "Добавленные".
// листинг 4.0
#Если Клиент Тогда
функция ПолучитьКартинкиИзРегистра(объект) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИзображенияНоменклатуры.Путь
|ИЗ
| РегистрСведений.ИзображенияНоменклатуры КАК ИзображенияНоменклатуры
|ГДЕ
| ИзображенияНоменклатуры.Объект = &Объект
|
|УПОРЯДОЧИТЬ ПО
| ИзображенияНоменклатуры.Основное УБЫВ";
Запрос.УстановитьПараметр("Объект", Объект);
Результат = Запрос.Выполнить().Выгрузить();
Возврат Результат;
КонецФункции
Функция ПоказатьКартинкуИзРегистра(объект) Экспорт
ПутьКСерверу = Константы.ПутьККартинкамНаСервере.Получить();
мКартинки = ПолучитьКартинкиИзРегистра(объект);
Если мКартинки.количество() > 0 тогда
ФайлКартинки = новый Файл(ПутьКСерверу+мКартинки[0].Путь);
Если ФайлКартинки.Существует() и СтрДлина(мКартинки[0].Путь) > 0 тогда
Картинка = новый Картинка(ПутьКСерверу+мКартинки[0].Путь);
КонецЕсли;
Иначе
Картинка = новый Картинка();
КонецЕсли;
Возврат картинка;
КонецФункции
#КонецЕсли
7. Пример из модуля формы элемента Номенклатуры в листинге 5.0
// листинг 5.0 Процедура ПоказатьОсновноеИзображение() Экспорт Если ЭлементыФормы.ДействияФормы.Кнопки.Изображение.Пометка = Истина Тогда //Если мТекущееОсновноеИзображение = Неопределено Тогда // ЭлементыФормы.ОсновноеИзображение.Картинка = мПустаяКартинка; //Иначе // ЭлементыФормы.ОсновноеИзображение.Картинка = мТекущееОсновноеИзображение; //КонецЕсли; ЭлементыФормы.ОсновноеИзображение.Картинка = Добавленные.ПоказатьКартинкуИзРегистра(ЭтотОбъект.Ссылка); КонецЕсли; КонецПроцедуры // ПоказатьОсновноеИзображение()
П.С. не забываем дать разрешение на чтение и запись в сетевой каталог для изображений.
Вступайте в нашу телеграмм-группу Инфостарт
