Картинки в строках дерева значений по условию (8.3)

Публикация № 986265

Программирование - Практика программирования

картинка картинки в строках дерево значений картинка в строке дерева значений

39
На мой взгляд, простой и удобный способ добавления картинок в строках дерева значений по условию (да и без условия).

Доброго всем времени! Статья для новичков. Хотел бы выложить на мой взгляд простой и удобный способ добавления картинок в строках Дерева значений по условию. Изложенный вариант будет простым примером навскидку. 

// Элементы.ДеревоОбъектовКартинка.КартинкаЗначений
// ПутьКДаннымКартинкиСтроки и КартинкаСтрок 
// установку по ИндексуКартинки использовать мы не будем

Уже имеем форму, на ней ДеревоЗначений с колонками и реквизитами, а также Вашими процедурами и функциями для заполнения дерева значений. В моем случае эта форма, на которой выводится список Документов и Справочников. 

Итак.

Имеем Реквизит ДеревоОбъектов с типом ДеревоЗначений.

Помимо имеющихся колонок в дереве (если таковые имеются), добавляем колонку с именем Картинка и типом Картинка

Далее если хотим, чтобы Картинка была в одной колонке, например, с Наименованием, необходимо добавить на форму группу колонок, добавляем и помещаем в группу наши колонки. (в моем примере колонки дерева, Картинка и ИдентификаторОбъекта).

Настраиваем группу колонок, чтобы наши две колонки (в данном случае ИдентификаторОбъекта и Картинка) были в одной ячейке

На форме поле Картинки будет следующим, устанавливаем положение заголовка - Нет

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

Как видим, картинок нет. Все верно, потому что мы настроили только внешнее оформление, теперь добавим сами картинки в строки нашего реквизита ДеревоОбъектов.

Давайте для примера реализуем следующее:

Если тип значения документ (строковый параметр, к примеру равен "Документ"), тогда картинка будет выбираться из стандартной библиотеки картинок - Документ, если Справочник, соответственно картинка справочника, иначе ничего не выводим (в смысле саму картинку не выводим).

Создадим простейшую функцию, которая будет возвращать Картинку из стандартной библиотеки по условию, как описали выше:

&НаСервере
Функция ЗаполнитьКартинкуВСтрокуДерева(УсловноеЗначение = Неопределено) 
	СтроковоеЗначение = Строка(УсловноеЗначение);
	Если СтроковоеЗначение = "Документы" Тогда
		Картинка = БиблиотекаКартинок.Документ;
	ИначеЕсли СтроковоеЗначение = "Справочники" Тогда  
		Картинка = БиблиотекаКартинок.Справочник;
	Иначе
		Картинка = "";
	КонецЕсли;
	
	Возврат Картинка;
КонецФункции

Затем в Вашу Процедуру или функцию, в которой происходит заполнение значениями Дерева значений, добавляем простую строчку (при добавлении строки).

//В данном случае в обработке в значении НовыйОбъект.ИдентификаторОбъекта.Родитель - будет Документы не строкового типа
// далее это значение преобразуется в Строку в Функции ЗаполнитьКартинкуВСтрокуДерева()   

НовыйОбъект = СтрокаДерева.Добавить();
НовыйОбъект.Картинка = ЗаполнитьКартинкуВСтрокуДерева(НовыйОбъект.ИдентификаторОбъекта.Родитель);

При добавлении строки в поле колонки Картинка, которое мы добавляли в ДеревоОбъектов с типом ДеревоЗначений, будет добавлена картинка.

Сохраним все наши изменения и запустим на исполнение формирование Вашей процедуры или функции для получения результата (в моем случае в результате это список документов и справочников). Теперь получим результат с добавленными картинками.

 

Если все описать кратко:

  1. Добавляем в реквизит с типом ДеревоЗначений колонку реквизита с типом Картинка.
  2. Размещаем реквизит колонки на форме
  3. В функции или процедуре при добавлении строк в ДеревоЗначений в свойство реквизита колонки присваиваем картинку.

 

P.S.

Вот вроде бы и все, вроде ничего сложного. Если кому помог, буду рад!

39

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. starik-2005 1864 22.01.19 17:28 Сейчас в теме
А зачем так извращаться-то? Проще надо быть - и люди к вам потянутся!

У дерева на форме есть свойства "ПутьКДаннымКартинкиСтроки" и "КартинкаСтрок". В поле, куда указывает путь, нужно установить путь, а в поле картинки - просто выбрать картинку с кучей всего на свете (например, "ПиктограммыЭлементов"). Дальше помещать индекс картинки в установленное поле картинки. Профит!

И вообще, пиктограмму в колонку нужно устанавливать запросом. Т.е. конструкция "ВЫБОР КОГДА Условие1 ТОГДА 1 КОГДА Условие2 ТОГДА 2 ИНАЧЕ 3 КОНЕЦ КАК Картинка" спасет отцов и детей русской демократии от западного ига!
Прикрепленные файлы:
gelmoriel; sorb; VooDOOPRo; kote; skalex; mivari; Krio2; markers; mirco; WizaXxX; Plotks2017; karpik666; awk; ivanov660; CSiER; user774630; wowik; ABudnikov; Shmell; kolya_tlt; Soloist; rpgshnik; json; Knopodav; fancy; dsdred; Bazil; Diversus; pm74; +29 1 Ответить
2. pm74 124 22.01.19 17:37 Сейчас в теме
3. aagubarev 96 23.01.19 03:18 Сейчас в теме
(1)
Элементы.ДеревоОбъектовКартинка.КартинкаЗначений
// ПутьКДаннымКартинкиСтроки и КартинкаСтрок
// установку по ИндексуКартинки использовать мы не будем


Имхо мне больше нравится именно мой способ, но спасибо за вариант. )
15. user774630 23.01.19 14:57 Сейчас в теме
(1) +1
А кому интересно - посмотреть рабочий пример можно в 1С:СППР. Там как раз дерево метаданных так и визуализировано (т.е. справочник, представляющий метаданные конфигураций.
21. markers 237 24.01.19 05:04 Сейчас в теме
Простите, не удержался. Мне забавно смотреть на такой код, который за любой мелочью лезет на сервер да ещё и с контекстом! Простите, зачем тут контекст?
&НаСервере
Функция ЗаполнитьКартинкуВСтрокуДерева(УсловноеЗначение = Неопределено) 
	СтроковоеЗначение = Строка(УсловноеЗначение);
	Если СтроковоеЗначение = "Документы" Тогда
		Картинка = БиблиотекаКартинок.Документ;
	ИначеЕсли СтроковоеЗначение = "Справочники" Тогда  
		Картинка = БиблиотекаКартинок.Справочник;
	Иначе
		Картинка = "";
	КонецЕсли;
	
	Возврат Картинка;
КонецФункции
Показать

А потом удивляются, почему их код тормозит при клиент-серверном взаимодействии, особенно если клиент удаленно разнесен с сервером и не говоря уже о том, что у клиента может быть слабый интернет... Этим даже сама 1С порой страдает...
Пожалуйста, прочитайте замечательную статью про клиент-серверное взаимодействие https://infostart.ru/public/682305/
Так-же, вы прекрасно можете кешировать картинку на клиенте, получив с сервера только нужный набор картинок для группы и элемента, а затем на клиенте уже вставляя картинку куда надо.
Но вообще, как и сказали в (1) правильней использовать ПутьКДаннымКартинкиСтроки, и при таком варианте появляется действительно крутая возможность, определять картинку сразу в запросе не производя ни-каких постобработок результатов запроса.
Старайтесь думать не о быстроте работы на тестовом компьютере,а том как это будет лучше, и не будут эти места, точкой тормозов при клиент-серверном взаимодействии. Я вот тоже давиче выкатил в прод не оптимальный запрос, у меня всё работало как положено, в центральной базе на сервере с SQL тоже всё было хорошо, но вот РИБ узлы, "оценили" этот кривой запрос. Но то моя вина (поспешил, не проверил обстоятельно).
Собственно на ошибках учатся, я очень надеюсь в этом на вас!
VooDOOPRo; A_Max; rpgshnik; mivari; pavlov_dv; Krio2; +6 Ответить
23. w.r. 314 24.01.19 11:43 Сейчас в теме
(1)
олонку нужно устанавливать запросом. Т.е. конструкция "ВЫБОР КОГДА Условие1 ТОГДА 1 КОГДА Условие2 ТОГДА 2 ИНАЧЕ 3 КОНЕЦ КАК Картинка" спасет отцов и детей русской демократии от западного ига!


Для примера автора я бы сделал через СКД внешнюю функцию ОбщегоНазначения.ВидОбъектаПоТипу и дерево значений примерно так

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ТекстЗапросаКомпоновки= 
	   "ВЫБРАТЬ
	   |	АктОбОказанииУслуг.Ссылка КАК Ссылка
	   |ИЗ
	   |	Документ.АктОбОказанииУслуг КАК АктОбОказанииУслуг
	   |
	   |ОБЪЕДИНИТЬ ВСЕ
	   |
	   |ВЫБРАТЬ
	   |	Номенклатура.Ссылка
	   |ИЗ
	   |	Справочник.Номенклатура КАК Номенклатура";
	
	ДеревоРезультата = Новый ДеревоЗначений;
	
	СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
	
	ИсточникДанных=СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
	ИсточникДанных.Имя="ИсточникДанных";
	ИсточникДанных.ТипИсточникаДанных="Local";
	
	НаборДанныхЗапрос=СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
	НаборДанныхЗапрос.Имя="НаборДанных1";
	НаборДанныхЗапрос.Запрос=ТекстЗапросаКомпоновки;
	НаборДанныхЗапрос.ИсточникДанных="ИсточникДанных";
	
	ПолеСсылка=НаборДанныхЗапрос.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
	ПолеСсылка.Поле="Ссылка";
	ПолеСсылка.ПутьКДанным="Ссылка";
	
	ПолеКартинка = СхемаКомпоновкиДанных.ВычисляемыеПоля.Добавить();
	ПолеКартинка.ПутьКДанным = "Картинка";                                                                
	ПолеКартинка.Выражение = "выбор 
							 |когда ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗначения(Ссылка)) = ""Документ"" тогда 0 
							 |когда ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗначения(Ссылка))  = ""Справочник"" тогда 1 
							 |конец";
	
	ПолеОбъект = СхемаКомпоновкиДанных.ВычисляемыеПоля.Добавить();
	ПолеОбъект.ПутьКДанным = "Объект";
	ПолеОбъект.Выражение = "ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗначения(Ссылка))";
	
	НастройкаКомпоновки=СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
	ГруппировкаОбъект=НастройкаКомпоновки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	
	ПолеОбъект=ГруппировкаОбъект.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	ПолеОбъект.Поле=Новый ПолеКомпоновкиДанных("Объект");	
	ГруппировкаОбъект.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));

	ГруппировкаВложеная = ГруппировкаОбъект.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	ПолеСсылка=ГруппировкаВложеная.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	ПолеСсылка.Поле=Новый ПолеКомпоновкиДанных("Ссылка");
	ПолеКартинка=ГруппировкаВложеная.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	ПолеКартинка.Поле=Новый ПолеКомпоновкиДанных("Картинка");
	ГруппировкаВложеная.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	
    КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновкиДанных=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкаКомпоновки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    ПроцессорКомпоновкиДанных=Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,,,Истина);
    ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВывода.УстановитьОбъект(ДеревоРезультата);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
	ЗначениеВРеквизитФормы(ДеревоРезультата, "Дерево");
	
КонецПроцедуры
Показать
Olenevod; +1 Ответить
25. rpgshnik 1194 25.01.19 04:19 Сейчас в теме
Предлагаю автору статьи отметить первый комментарий кнопкой "ЛУЧШИЙ".
4. json 2190 23.01.19 11:41 Сейчас в теме
Резюме данной статьи:
Чтобы вывести картинку в строке таблицы - используй тип Картинка.
(с) Кэп
5. aagubarev 96 23.01.19 11:43 Сейчас в теме
24. Alien_job 161 24.01.19 16:04 Сейчас в теме
(4) Как бы хотелось, чтобы это было смешно. Но иногда чтобы вывести картинку нужно использовать хранилище и строку.
6. w.r. 314 23.01.19 12:32 Сейчас в теме
Это получается каждую строку дерева нужно обработать функцией ЗаполнитьКартинкуВСтрокуДерева? А если строк в дереве 50-100 тыс или больше?
9. rpgshnik 1194 23.01.19 13:01 Сейчас в теме
(6) выше сказано что это ИМХО %)
17. aagubarev 96 23.01.19 16:09 Сейчас в теме
(6)

В чем проблема заполнить картинку 16х16 - 50 тыс строк?
7. alex15650 134 23.01.19 12:56 Сейчас в теме
На самом деле, зачем изобретать велосипед. Это делается штатными механизмами без написания кода. В дереве значений (или таблице) делаем специальный реквизит числового типа с индексом картинки в коллекции, когда этот реквизит переносим на форму, ставим ему вид "Поле картинки" и заполняем свойство "Картинка значений". А сам индекс картинки заполняем любым удобным способом в зависимости от условий. Всё. Тут главное иметь в наличии нужную коллекцию картинок.
PitonTBs; kote; +2 Ответить
8. aagubarev 96 23.01.19 13:00 Сейчас в теме
(7)

Вот дело в том что в наличии коллекции картинок нет, но нужно вывести картинку (один из способов). Так конечно штатными средствами. Это для пример и ничего больше).
10. karpik666 2487 23.01.19 13:48 Сейчас в теме
Как-то даже грустно, что такие вещи пользуются популярностью, или сейчас видимо на Инфостарте дефицит статей для программистов, и засисилие графомании, а на безрыбье...
kote; rpgshnik; json; ifal; +4 1 Ответить
11. Evg-Lylyk 2572 23.01.19 13:50 Сейчас в теме
Поддержу автора, описанный способ более удобен по сравнению с коллекцией картинок.
Работа с картинками происходит более рационально.
Примеры: Добавить в коллекцию картинку из библиотеки проблемно, нельзя использовать картинку коллекции как отдельную.
aagubarev; frkbvfnjh; +2 Ответить
12. starik-2005 1864 23.01.19 14:28 Сейчас в теме
(11)
нельзя использовать картинку коллекции как отдельную
Можно. Просто заполните индекс этой картинки в соответствующем реквизите.
rpgshnik; +1 Ответить
13. Evg-Lylyk 2572 23.01.19 14:41 Сейчас в теме
(12) А если это картинка декорация на форме, картинка кнопки или элемент другой коллекции
или ее нужно вставить в справку.
14. starik-2005 1864 23.01.19 14:47 Сейчас в теме
(13) а что, у вас на компьютере удалили паинт? Не совсем понятен также контекст - с какой целью элемент коллекции нужно отображать в виде декорации? У большинства элементов приведенной мной коллекции есть отдельные картинки. А по поводу справки, то лучше копировать часть интерфейса, а не отдельную картинку. И уже описывать эту часть словами. Но т.к. пользователи все меньше понимают слова, то вместо встроенной в 1С справки лучше записать видео - тогда проблем с картинками в справке вообще не будет.
rpgshnik; +1 Ответить
19. Evg-Lylyk 2572 23.01.19 17:04 Сейчас в теме
(14) Еще раз поподробнее.
Публикация уместна при этом проста. Сам я где то около года назад столкнулся с новым методом. Судя по комментариям и плюсам много староверов.

КоллекцияКартинок и Индекс картинки такой подход использовался только Таблицы и Дерева и не знаю где еще, а вот картинка повсеместно. Теперь же можно за него забыть.
В новом подходе плюс что не нужно использовать коллекции не происходит дублирования картинки одиночной и внутри коллекции.
Лично для меня состовляет проблему сделать корректную картинку с прозрачностью внутри коллекции иногда негде взять иногда прозрачность краев на глаз.
Сейчас 1с начинает использовать картинки zip когда внутри картинки для разных размеров в старом подходе с этим проблемы.
Когда таблица имеет 3 колонки с картинками в старом подходе проблемы
Новый подход более читабелен прямо в коде написано
Если Документ.ПометкаУдаления Тогда
Картинка = БиблиотекаКартинок.ДокументПомеченныйНаУдаление
КонецЕсли;
в старом подходе
Если Документ.ПометкаУдаления Тогда
Индекс = 15;
КонецЕсли;

"с какой целью элемент коллекции нужно отображать в виде декорации"
Нужно достаточно часто. В бух.3 есть в форме документа картинка Проведен, НеПроведен, ПомеченНаУдаление

"У большинства элементов приведенной мной коллекции есть отдельные картинки." дублирование картинок

Новый подход удобнее в разработке для себя не заметил плюсов старого похода.
Gorus; unichkin; aagubarev; +3 Ответить
18. aagubarev 96 23.01.19 16:09 Сейчас в теме
(11)

Спасибо добрый человек.
16. androgin 23.01.19 15:41 Сейчас в теме
20. AlexKo84 23.01.19 17:56 Сейчас в теме
Можно получать картинку из макета двоичных данных

&НаСервере
Функция ПолучитьКартинкуИзМакетаНаСервере(ИмяМакета)
	обк = РеквизитФормыВЗначение("Объект");
	Макет = обк.ПолучитьМакет(ИмяМакета);
	
	Картинка = Новый Картинка(Макет);
	
	Возврат Картинка;
КонецФункции
Показать
Olenevod; +1 Ответить
22. Evg-Lylyk 2572 24.01.19 10:21 Сейчас в теме
(0) Автор исправьте функцию получения картинки можно сделать чтобы работала на клиенте с учетом сообщения 21
А то опять начинается что лучше ПутьКДаннымКартинки )
26. rwn_driver 7 25.01.19 10:12 Сейчас в теме
Добрый день.
Куда исчезло сообщение 21?
Оставьте свое сообщение