Опишу вкратце действия шаг за шагом но если что-то сложно написал, заранее прошу прощения.
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 Процедура ПоказатьОсновноеИзображение() Экспорт Если ЭлементыФормы.ДействияФормы.Кнопки.Изображение.Пометка = Истина Тогда //Если мТекущееОсновноеИзображение = Неопределено Тогда // ЭлементыФормы.ОсновноеИзображение.Картинка = мПустаяКартинка; //Иначе // ЭлементыФормы.ОсновноеИзображение.Картинка = мТекущееОсновноеИзображение; //КонецЕсли; ЭлементыФормы.ОсновноеИзображение.Картинка = Добавленные.ПоказатьКартинкуИзРегистра(ЭтотОбъект.Ссылка); КонецЕсли; КонецПроцедуры // ПоказатьОсновноеИзображение()
П.С. не забываем дать разрешение на чтение и запись в сетевой каталог для изображений.