gifts2017

Хранение изображений в сетевом каталоге

Опубликовал Farzar (Farzar) в раздел Программирование - Практика программирования

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

Опишу вкратце действия шаг за шагом но если что-то сложно написал, заранее прошу прощения.    

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 
Процедура ПоказатьОсновноеИзображение() Экспорт

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

П.С. не забываем дать разрешение на чтение и запись в сетевой каталог для изображений.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. ivanov660 ivanov660 (ivanov660) 18.08.14 23:06
На сколько я понял, речь идет о примере для "своей" конфигурации. На мой взгляд удобнее использовать механизмы БСП "присоединенные файлы" или "файлы".
В примере присутствует много листинга, но возможно чего-то не хватает; для этого случая хорошо было бы выложить cf.
Мне очень не понравилась практика названия реквизитов как "объект".
2. Farzar (Farzar) 19.08.14 12:10
Написано на типовой как раз БСП переделан чтоб в SQL не хранить файлы. Листинг рабочий но получился большой. Будьте внимательны с событиями формы. Если ошибки есть или сложности пишите.
3. Михаил Кузнецов (hotey) 19.08.14 22:11
(2) Farzar, Вы же пишете, что делаете это для УПП, КА. Разве там используется БСП?
А у БСП есть свои настройки для хранения файлов в томах на диске.
4. Farzar (Farzar) 20.08.14 09:48
Типовые конфигурации, где используются управляемые формы написаны на базе БСП от этого отталкивался
5. Евгений Фербер (omut) 20.08.14 11:38
(3) hotey, в КА используются точно )
6. artur rakhmatulin (нормальный такой) 21.08.14 09:28
в скуле всё равно безопаснее хранить :)
7. Иван Устьянцев (nSpirit2) 21.08.14 10:07
Автор конечно молодец работа с файлами без попытки доставляет. Я так понимаю это сделано для файловой базы данных?
8. Farzar (Farzar) 21.08.14 11:07
Скорее для серверной, файловая при больших объемах все равно не выживет. Когда у вас 2000 позиций и еще 5000 характеристик в этом случае Вы экономите пару гигабайт.
9. Иван Устьянцев (nSpirit2) 21.08.14 11:19
(8) Farzar, А смысл при использовании SQL хранить данные в отдельно лежащей папке на файловой системе вы думаете так быстрее будет ?
10. Farzar (Farzar) 21.08.14 11:41
Главное экономия места и время выполнения резервного архива и например отчет "Остатки в картинках" работает чуть быстрее.
11. CatMix 21.08.14 12:25
По мне так плохой метод.
Какой-нить пользователь удалит картинки с общего ресурса или переместит их в другое место и всё?
Или Вы не разрешаете пользователям добавлять номенклатуру и редактировать изображения?
Как это всё разворачивать быстро на другом сервере?
Если экономите место в базе, почему не вынести картинку в другую sql базу?
Если скорость то лучше переместить таблицу с файлами на другой раздел/сервер итд?
BigB; nSpirit2; +2 Ответить 1
12. artur rakhmatulin (нормальный такой) 21.08.14 12:32
(9) nSpirit2, на самом деле с файлами быстрее работается... но я с вами солидарен, смысл хранить в файлах, если пользуется скуль.
в общем, велосипед на любителя...

(10) Farzar, никакой экономии времени на резервное копирование нет, это миф. да и + к тому это не безопасно. вот нападет какой-нибудь вирь и пожрет ваши картинки и документы
Когда данные лежат в едином месте, как единое целое, вот тут вы экономите время на резервное копирование и перенос "в случае чего"...

У нас была похожая практика использования файлов на сетевом ресурсе, но это бред и мы от этого ушли, когда объём файлов стал > 350ГБ и число этих файлов перевалило за 2 000 000
Если сильно захотеть, можно использовать скульный FileStream, тогда и файлы получатся как файлы и вроде как бы в скуле.

13. Анянов Михаил (insurgut) 21.08.14 11:00
Конечно все зависит от размеров организации и объема номенклатуры, с которой она работает.

Реализовал аналогично в относительно небольшой организации (число номенклатурных позиций не больше 100 000), путь к сетевому каталогу храним в константе, картинка при выборе ее пользователем автоматом копируется на сетевой ресурс с именем, равным коду номенклатуры. Много лет - полет нормальный.

Для того, чтобы пользователи на сетевом ресурсе не грохнули картинки, защита от дурака - сетевой ресурс скрываем символом $ в имени ресурса.
svetanik; t278; GAMLET; gradi; Farzar; +5 Ответить 1
14. Farzar (Farzar) 21.08.14 13:30
(11) CatMix,
Мое личное мнение не претендующее на единственное верное.
Отвечу по пунктам:
Какой-нить пользователь удалит картинки с общего ресурса или переместит их в другое место и всё?
Или Вы не разрешаете пользователям добавлять номенклатуру и редактировать изображения?
- пользователь пути к картинке не видит, полный путь в константе.
Как это всё разворачивать быстро на другом сервере?
- константе задаем новый путь, копируем директорию
Если экономите место в базе, почему не вынести картинку в другую sql базу? - не вижу смысла хранить бинарные неструктурированные данные в скл.
Если скорость то лучше переместить таблицу с файлами на другой раздел/сервер итд? - более сложный вариант.
15. Александр Аляев (alyaev.a.v) 25.08.14 21:16
Так и не понял, если есть БСП с механизмом хранения в томах на дисках, зачем велосипед?
16. Анянов Михаил (insurgut) 26.08.14 10:49
(15) alyaev.a.v, насколько понимаю, тут конкретный пример доработки типовой УТ 10.3. Доработать только эту часть, либо встраивать БСП в УТ 10.3 и все равно делать какие-то доработки? Тут каждый решает сам для себя :)
17. Farzar (Farzar) 26.08.14 11:15
Из статьи
http://infostart.ru/public/190375/

Реально самописки делают по двум причинам:

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

2. есть принципиальные расхождения требуемых алгоритмов от того что есть в типовых, в данном случае то же БСП не сильно подходит.

18. Олег Каратаев (Kyrales) 26.08.14 08:24
А как быть если распределенная база?
19. Farzar (Farzar) 26.08.14 13:15
(18) Kyrales,

Первое что приходит на ум включить в план обмена регистр Изображения далее в константе ПутьККартинкамНаСервере указать новый путь.
Возможно несколько вариантов пути:
1. Дописать к плану обмена копирование файлов при отправке и при получении данных.
2. Простой если скорость интернета позволяет можно расшарить ресурс, не забывая о безопастности, поставить запрет на редактирования из подчиненной базы.
3. и тд.
20. Анянов Михаил (insurgut) 26.08.14 13:46
Первое, что приходит на ум, облачные сервисы :) Яндекс.Диск например, дешево и сердито, практически 0 строчек кода доработки.
21. Антон Антонов (monkbest) 03.09.14 09:44
Все тут говорят про БСП, как про некую панацею. Мол если 1С создало БСП, то нафига велосипед городить.
БСП бывает разных версий. В УТ 10.3, УПП 1.3, Бух 2.0 она тоже есть, в них есть куча общих одинаковых для всех конфигураций модулей с полезными функциями.
Для управляемых форм в БСП есть механизмы по хранению файлами, но Вы пробовали посмотреть код, которым это реализовано? Там черт ногу сломает. А что если завтра БСП обновят? Все переписывать?
Для таких задач - только самописки потому, что:
1. Дешевле в разработке
2. Читабельный код, который через 2 года другой специалист поймет (если кодер не ушлепок:) )
3. Быстрее работает (100%)
4. Решает конкретную задачу, и делается под хотелки заказчика, а не универсально для всех на свете ООО. Самописка - всегда удобнее (если кодер не ушлепок:) )
5. Меньшая зависимость от смены релизов
22. Иван Устьянцев (nSpirit2) 03.09.14 10:00
(21) monkbest, Я надеюсь это был такой "Плохой совет" чтобы никто не делал так.
1. Дешевле в разработке

Дешевле чем то что уже разработано? У вас разработка что бесплатная?
2. Читабельный код, который через 2 года другой специалист поймет (если кодер не ушлепок:) )

Ахаха написать что то свое всегда проще чем разобраться в чем то. Вы то точно умнее чем те кто написали эту недалекую конфигурацию.
3. Быстрее работает (100%)

Выше записать двоичные данные работает быстрей чем 1с 100% никто и не сомневался.

Знаете что я хочу сказать использование стандартных механизмов. Является правильным и хорошим тоном то что у разработчика нет желания разбираться со стандартным функционалом конфигурации это только его минус нежели плюс. Я вас умоляю написать свой велосипед с деревянными квадратными колесами вместо того чтобы ездить с остальными в метро еще тот обман жизни.
Работа с файлами в любом языке программирования очень сложная тем что при работе с файлами может возникнуть большое количество исключений которые надо обрабатывать а не бросать в надежде что ваши файлы не пропадут не попадут на бед окажутся теми что вы оставили все это остается на авось. Писать на 1с не зная БСП это как на С++ без STL.
23. OBEH (OBEH) 03.09.14 11:46
(22)Все так пафосно. "Является правильным и хорошим тоном...", "Писать на 1с не зная БСП это как на С++ без STL..." и т.д.
Сравнение 1С(с ее БСП) и "С++ без STL", вообще, поражает дикостью.
В (21) верно подмечено. Сам не раз в этом убеждался. А работа "из коробки" у фирмы 1С имеет только смысл, что "вроде как работает и ладно".
24. Антон Антонов (monkbest) 03.09.14 16:28
(22) nSpirit2, вы хоть раз открывали модули отвечающие за работу с файлами в БСП? Видимо, нет. Я открывал.
По претензиям ко мне:
1. дешевле = потратить меньше времени на разработку. Такие мелкие задачи обычно оплачиваются по факту отработанного времени
2. я не ругал БСП, я просто довожу до сведенья незнающих, он сложна. Хотя, ДА - Я хорошего мнения о своих способностях, как разработчика. Да и опыт у меня богатый. Но авторов БСП не ставлю ниже себя:)

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

что я должен делать? Пару часов смотреть в модули БСП, потом час вкрячивать туда своё и выдать потом решение не очень удобное в плане интерфеса? И объяснять менеджерам, что это не удобно, зато универсально. Да им пое**ть, что это решение универсально и будет рабоать на соседнем заводе так же хорошо, как в их фирме. им нужно хорошо у них, а директору надо быстро, потому что время - деньги.

нет я за 15 минут набрасываю регистр сведений и рисую в документе пару кнопок (добавить, просмотреть файл), выгоняю на 5 минут всех из базы, сохраняюсь проверяю и все! и перехожу к следующе задаче

в БСП учитывается много фишек, оно работает в web клиенте, в серверной базе, в файловой... все это круто, но надо решать конкретные задачи. Самые живучие решения - простые, их потом легко трансформировать под новые обстоятельства.
svetanik; GAMLET; +2 Ответить 2
25. OBEH (OBEH) 03.09.14 17:29
(24)"за 15 минут набрасываю регистр сведений и рисую в документе пару кнопок..."
Ага. Был у меня случай с "чудо программистом". Писал все влет... регистры, документы, справочники. Просто скорость поражала и такое знание языка.
Хорошо, что нашел время потестить это чудо мысли. Я ужаснулся реализации. Там, при изменении конфы, пришлось бы каждый раз его вызывать.
Снес его поделку и решил, по максимуму, штатными средствами. Не так быстро, довольно прилично призадумываясь, что можно использовать из того, что уже есть.
Работает несколько лет и не просит кушать.
Так что использование штатных возможностей, на мой взгляд, должно быть не на последнем месте.
EmpireSer; nSpirit2; +2 Ответить 1
26. Иван Устьянцев (nSpirit2) 03.09.14 17:35
(24) monkbest, Это называется методом костыльного программирования. Они захотели я им сделал за 15 минут костыль. Они захотел хранить еще и сканы договоров. Я и там сделал костыль... Хотя БСП с точки зрения интерфейса тут каркас позволяет хранить все файлы однообразно... А еще вы точно за 15 минут написали все проверки на существование.. Проверку доступа и прочие вещи которые надо написать при работе с файлами...

вы хоть раз открывали модули отвечающие за работу с файлами в БСП?

Не поверите да и всем доволен.
27. Антон Антонов (monkbest) 03.09.14 17:41
(25) OBEH, БСП входит в состав конфигураций, но не все его механизмы везде задействованы во всех объектах. Например 1С Бухгалтерии 3.0 есть БСП последней версии, в которой реализована работа с хранением файлов. Но это не значит, что вы можете прикрепить произвольный файл к документу "реализация товаров и услуг" быстро и удобно

Есть справочник файлов. Есть доп.сведенья, в которых можно указывать тип значения - "файл". Это стандартные подсистемы.

Но, чтобы прикрепить файл к документы, надо:
1. Записать документ
2. Нажать кнопку доп сведенья
3. Начать редактировать сведенье, в котором лежит файл
4. Из списка всех файлов в справочнике выбрать нужный, а там его, т.е. нажать кнопку создать
5. Сохранить файл в справочнике.
6. Выбрать в доп сведенье элемент справочника.

Это не удобно. Каждый руководитель сам принимает решение "ломать" "не ломать". Если ломать, то он думает "А по чем?".
Ломание механизмов БСП - дорого, аукнется при обновлении еще дороже.
28. Антон Антонов (monkbest) 03.09.14 17:46
(26) nSpirit2, мои костыли прочные и красивые, не переживайте, работаю годами. Я сам порой забываю об их существовании, настолько они органично врастают в систему и в жизнь предприятия, как будто они тут были еще до меня, со времен установки типовой конфигурации
29. OBEH (OBEH) 03.09.14 18:26
(26) "всем доволен....".
По моему, это клиника. Особенно, применительно к 1С.
30. Анянов Михаил (insurgut) 04.09.14 09:22
(22) nSpirit2,
Знаете что я хочу сказать использование стандартных механизмов. Является правильным и хорошим тоном


Одно дело, когда есть исходный функционал в конфигурации, тут да, моветон. Но когда конфигурацию необходимо этим функционалом дорабатывать, что бы потом его использовать - тут уже можно и поспорить :)
nSpirit2; asylum90; +2 Ответить 1
31. Иван Устьянцев (nSpirit2) 04.09.14 10:03
(29) OBEH, Ну да все прекрасно работает... Вам не нравиться 1С. Напишите что нибудь свое умное и хорошее. Боюсь все проблемы 1С вытекают из того что она и так вам жизнь упрощает в плане программирования как может.
(30) insurgut, Вот с вами я полностью согласен. Ну чтобы не попасть в просак каркас следует знать типовой функционал. Причем я именно говорю о том какие функции торчат из БСП наружу. Что бы не написать свой деревянный велосипед.

В конечном итоге костыли всегда оставаться костылями. И потом при переходе при смене редакции тот кто будет это делать заставят вас икать за ваш костыль.
32. OBEH (OBEH) 04.09.14 10:43
Станет все проще, если понять, что 1С торгует платформой и коробками с описанием языка и примерами прикладных решений на этой платформе.
Именно, примерами, а не законченными решениями.
Поэтому "Все прекрасно работает", если предприятие подгонять под этот пример.
Так что все, кто хочет реально работать, берут напильник и пилят этот самый пример для себя.
33. Яков Коган (Yashazz) 08.09.14 16:59
Курочить конфу, когда можно обойтись штатными средствами, да и безо всяких БСП - жуть.

Делается просто:
1. Добавляется доп.свойство справочника, хранящее строковый адрес картинки;
2. Добавляется внешняя печатная форма, привязанная к карточке номенклатуры, суть которой в работе с картинкой (выбор, показ, файловые операции);
3. Добавляется внешняя обработка, групповой менеджер картинок, настроек работы с ними (кои хранятся в общем хранилище настроек) и прочая.

Всё.
34. Farzar (Farzar) 08.09.14 18:18
(33) Yashazz, Ваш ход мыслей верный в плане того что можно не редактировать типовую конфу. ЕЕ легко ОБНОВЛЯТЬ.
Но в примере минимум изменений кода в форме номенклатуры:
1. ПоказатьИзображение -
Форма = ОткрытьФорму("ОбщаяФорма.ФормаИзображения", , ЭтаФорма);

2. ОткрытьИзображение -
ЭлементыФормы.ОсновноеИзображение.Картинка = Добавленные.ПоказатьКартинкуИзРегистра(ЭтотОбъект.Ссылка);


Основной код в отдельном общем модуле и общей форме которые не будут обновляться.
Разница только в том где хранить код в отдельном общем модуле или во внешней обработке.
35. Антон Антонов (monkbest) 09.09.14 13:05
(33) Yashazz, хорошая мысль, мне нравится. Помимо печатных форм еще есть и обработки заполнения, которые тоже везде можно присоединить.
единственное, сложно будет реализовать для незаписанного объекта
36. John Smith (PiccaHut001) 09.09.14 17:45
(0) хорошее решение, сам так делал
37. Иван Иванов (kosmo0) 10.09.14 13:56
Я один заметил что не будет работать код (в цикл не зайдет)

Функция ПолучитьЧастьСтрокиОтделеннойСимволом(Знач ИсходнаяСтрока, Знач СимволПоиска)

ПозицияСимвола = СтрДлина(ИсходнаяСтрока);
Пока ПозицияСимвола = 1 Цикл
38. Иван Иванов (kosmo0) 10.09.14 14:13
(33) Ограничение - работа с ЕДИНСТВЕННЫМ изображением. Иногда этого не достаточно (ну либо опять воротить костыли).
39. Farzar (Farzar) 10.09.14 14:14
(37) kosmo0,
Должно быть так:
Пока ПозицияСимвола >= 1 Цикл

Скорее при вставке глюк, спасибо коммент.
40. Farzar (Farzar) 10.09.14 14:37
(38) kosmo0, Костыли воротить не надо, добавьте в форму только две кнопочки вперед и назад:
Попытка
//назад +1		
Номер = ТекущиеИзображение -1;
		ОснованаяКартинка = новый Картинка(ПутьКСерверу+мКартинки[Номер].Путь);
		ЭлементыФормы.ОсновноеИзображение.картинка = ОснованаяКартинка;
		ТекущиеИзображение = Номер;
	Исключение
	КонецПопытки;
...Показать Скрыть

41. Александр Крынецкий (echo77) 13.09.14 05:40
Поправьте, пожалуйста, ошибки

Опишу в вкратце действия
В модель формы пишу код
4. Добавляю общею форму
42. Farzar (Farzar) 16.09.14 10:40
(41) echo77, исправил, большое спасибо.
Только подсветка кода слетела, после сохранения..
43. Иван Иванов (kosmo0) 17.09.14 11:39
(33) (40) Сначала. Что понимается под термином "свойство"? Я предполагал что это типа из УПП свойства объектов, на основе Планов видов характеристик. Если я понял правильно, то будете создавать свойства "Картинка1", "Картинка2" и далее? А если какому-то элементу нужно будет 30 картинок?
44. Alex Necro (alexnecro) 23.09.14 11:57
(13) insurgut, Делал так же, еще на самописной семерке, а все операции над изображением производил с помощью командной строки IrfanView.
45. haz haz (hazd) 06.10.14 00:07
тоже страдаем раздуванием базы, а как быть если распределенная база?
46. Анянов Михаил (insurgut) 06.10.14 08:17
(45) hazd, Яндекс.Диск или OneDrive вам в помощь. Проще уже некуда :)
47. Igor Pogoreltsev (IgorArhangel) 27.02.15 09:52
Интересно данный материал нормально будет работать на УТП 8..2?

Просто стандартные методы забиваю оперативную память в хлам. Работать просто не возможно.
48. Igor Pogoreltsev (IgorArhangel) 02.03.15 12:03
Начал делать все по инструкции и на конечном этапе выплыла такая вот ошибка:

{Справочник.Номенклатура.Форма.ФормаЭлемента.Форма(56)}: Ошибка при установке значения атрибута контекста (Картинка)
        ЭлементыФормы.ОсновноеИзображение.Картинка = Добавленные.ПоказатьКартинкуИзРегистра(ЭтотОбъект.Ссылка);
по причине:
Несоответствие типов


Странно правда.

ОсновноеИзображение имеет тип поле картинки.

2. Создаю регистр сведений ИзображенияНоменклатуры с двумя измерениями Объект (Справочник.Номенклатура), Путь (Строка, 255) и реквизитом Основное (Булево).


Вот это все так же сделано.

Может кто подскажет кудой копать?
49. Igor Pogoreltsev (IgorArhangel) 02.03.15 14:42
Все разобрался..

У Вас в коде нужно поправить в двух местах:

Если ФайлКартинки.Существует() и СтрДлина(мКартинки[0].Путь) > 0 тогда


Я сначала поставил = , а как оказалось нужно было поставить <>.
50. Igor Pogoreltsev (IgorArhangel) 23.04.15 11:25
Чуть переделал данное решение с полем HTML
Ну это не суть важно.
Мне интересно как открыть форму изображения например при клике на миниатюру в подборе или в справочнике.

П = Новый Структура("Ключ", ТекущиеДанныеСписка.Ссылка);
	ФормаНоменклатуры = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", П);
	Форма = ОткрытьФорму("ОбщаяФорма.ФормаИзображения", , ФормаНоменклатуры);


То есть передаю владельца формы в третьем параметре, но ничего не открывается, а если перед выводом формы Открыть форму Номенклатуры:
ФормаНоменклатуры.Открыть();


Тогда открывается и форма элемента и форма Изображения

Можно ли как-то сделать чтобы просто открывалась форма изображения?
51. Igor Pogoreltsev (IgorArhangel) 25.06.15 11:46
Все сделал. У меня все получилось.
Теперь оперативная память не забивается.
Поле HTML рулит.
Если что обращайтесь. Подскажу.
52. Виталий Жуланов (VZhulanov) 21.03.16 12:16
А никто не рассматривал смешанный вариант хранения картинок?
1. все картинки хранятся на диске/фтп/облаке
2. в БД есть регистр/справочник, в котором хранится путь к картинке и на который ссылаются нужные справочники (товары, сертификаты, клиенты и прочее)
этот регистр/справочник общий для всех баз в распределенке
3. в БД есть "локальный кеш" справочник/регистр, в котором хранятся сами картинки, к которым было обращение за последний месяц.
Этот справочник исключительно локальный и в обменах не участвует. Его без проблем можно чистить каждый месяц или вообще не чистить.
Можно картинки в нем хранить не по дате обращения, а по количеству обращений.

Таки образом получаем и возможность хранения огромного количества картинок (любых файлов) без раздувания БД
И за счет локального "кэша" картинок в самой базе получаем быстрый доступ к часто используемым картинкам, что уменьшает количество тормозов при хранении в сети/облаке/фтп
Причем размером локального кеша (размером БД) можно управлять без потери данных.
53. Igor Pogoreltsev (IgorArhangel) 20.04.16 11:11
(52) VZhulanov, как вариант имеет право на существование. Я сейчас примерно так и сделал. Все фото хранятся в Dropbox локально на каждом сервере. Dropbox запущен службой. И мне достаточно добавить новые фотографии на одном сервере и фотки загрузятся на остальные.
Вариант с часто используемыми нормальный, НО в подборе используется отображение картинки и получается, что все картинки будут тащиться в кеш.
А позиций более 8000.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа