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










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

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

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

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

Итак.

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

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

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

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

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

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

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

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

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

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

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

Возврат Картинка;
КонецФункции

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

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

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

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

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

 

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

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

 

P.S.

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

25 Comments

  1. starik-2005

    А зачем так извращаться-то? Проще надо быть — и люди к вам потянутся!

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

    И вообще, пиктограмму в колонку нужно устанавливать запросом. Т.е. конструкция «ВЫБОР КОГДА Условие1 ТОГДА 1 КОГДА Условие2 ТОГДА 2 ИНАЧЕ 3 КОНЕЦ КАК Картинка» спасет отцов и детей русской демократии от западного ига!

    Reply
  2. pm74

    (1) коллекция супер

    Reply
  3. aagubarev

    (1)

    Элементы.ДеревоОбъектовКартинка.КартинкаЗначений

    // ПутьКДаннымКартинкиСтроки и КартинкаСтрок

    // установку по ИндексуКартинки использовать мы не будем

    Имхо мне больше нравится именно мой способ, но спасибо за вариант. )

    Reply
  4. json

    Резюме данной статьи:

    Чтобы вывести картинку в строке таблицы — используй тип Картинка.

    (с) Кэп

    Reply
  5. aagubarev

    (4)

    Именно так!

    Reply
  6. w.r.

    Это получается каждую строку дерева нужно обработать функцией ЗаполнитьКартинкуВСтрокуДерева? А если строк в дереве 50-100 тыс или больше?

    Reply
  7. alex15650

    На самом деле, зачем изобретать велосипед. Это делается штатными механизмами без написания кода. В дереве значений (или таблице) делаем специальный реквизит числового типа с индексом картинки в коллекции, когда этот реквизит переносим на форму, ставим ему вид «Поле картинки» и заполняем свойство «Картинка значений». А сам индекс картинки заполняем любым удобным способом в зависимости от условий. Всё. Тут главное иметь в наличии нужную коллекцию картинок.

    Reply
  8. aagubarev

    (7)

    Вот дело в том что в наличии коллекции картинок нет, но нужно вывести картинку (один из способов). Так конечно штатными средствами. Это для пример и ничего больше).

    Reply
  9. rpgshnik

    (6) выше сказано что это ИМХО %)

    Reply
  10. karpik666

    Как-то даже грустно, что такие вещи пользуются популярностью, или сейчас видимо на Инфостарте дефицит статей для программистов, и засисилие графомании, а на безрыбье…

    Reply
  11. Evg-Lylyk

    Поддержу автора, описанный способ более удобен по сравнению с коллекцией картинок.

    Работа с картинками происходит более рационально.

    Примеры: Добавить в коллекцию картинку из библиотеки проблемно, нельзя использовать картинку коллекции как отдельную.

    Reply
  12. starik-2005

    (11)

    нельзя использовать картинку коллекции как отдельную

    Можно. Просто заполните индекс этой картинки в соответствующем реквизите.

    Reply
  13. Evg-Lylyk

    (12) А если это картинка декорация на форме, картинка кнопки или элемент другой коллекции

    или ее нужно вставить в справку.

    Reply
  14. starik-2005

    (13) а что, у вас на компьютере удалили паинт? Не совсем понятен также контекст — с какой целью элемент коллекции нужно отображать в виде декорации? У большинства элементов приведенной мной коллекции есть отдельные картинки. А по поводу справки, то лучше копировать часть интерфейса, а не отдельную картинку. И уже описывать эту часть словами. Но т.к. пользователи все меньше понимают слова, то вместо встроенной в 1С справки лучше записать видео — тогда проблем с картинками в справке вообще не будет.

    Reply
  15. user774630

    (1) +1

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

    Reply
  16. androgin

    Велосипед

    Reply
  17. aagubarev

    (6)

    В чем проблема заполнить картинку 16х16 — 50 тыс строк?

    Reply
  18. aagubarev

    (11)

    Спасибо добрый человек.

    Reply
  19. Evg-Lylyk

    (14) Еще раз поподробнее.

    Публикация уместна при этом проста. Сам я где то около года назад столкнулся с новым методом. Судя по комментариям и плюсам много староверов.

    КоллекцияКартинок и Индекс картинки такой подход использовался только Таблицы и Дерева и не знаю где еще, а вот картинка повсеместно. Теперь же можно за него забыть.

    В новом подходе плюс что не нужно использовать коллекции не происходит дублирования картинки одиночной и внутри коллекции.

    Лично для меня состовляет проблему сделать корректную картинку с прозрачностью внутри коллекции иногда негде взять иногда прозрачность краев на глаз.

    Сейчас 1с начинает использовать картинки zip когда внутри картинки для разных размеров в старом подходе с этим проблемы.

    Когда таблица имеет 3 колонки с картинками в старом подходе проблемы

    Новый подход более читабелен прямо в коде написано

    Если Документ.ПометкаУдаления Тогда

    Картинка = БиблиотекаКартинок.ДокументПомеченныйНаУдаление

    КонецЕсли;

    в старом подходе

    Если Документ.ПометкаУдаления Тогда

    Индекс = 15;

    КонецЕсли;

    «с какой целью элемент коллекции нужно отображать в виде декорации»

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

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

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

    Reply
  20. AlexKo84

    Можно получать картинку из макета двоичных данных

    &НаСервере
    Функция ПолучитьКартинкуИзМакетаНаСервере(ИмяМакета)
    обк = РеквизитФормыВЗначение(«Объект»);
    Макет = обк.ПолучитьМакет(ИмяМакета);
    
    Картинка = Новый Картинка(Макет);
    
    Возврат Картинка;
    КонецФункции

    Показать

    Reply
  21. markers

    Простите, не удержался. Мне забавно смотреть на такой код, который за любой мелочью лезет на сервер да ещё и с контекстом! Простите, зачем тут контекст?

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

    Показать

    А потом удивляются, почему их код тормозит при клиент-серверном взаимодействии, особенно если клиент удаленно разнесен с сервером и не говоря уже о том, что у клиента может быть слабый интернет… Этим даже сама 1С порой страдает…

    Пожалуйста, прочитайте замечательную статью про клиент-серверное взаимодействие https://infostart.ru/public/682305/

    Так-же, вы прекрасно можете кешировать картинку на клиенте, получив с сервера только нужный набор картинок для группы и элемента, а затем на клиенте уже вставляя картинку куда надо.

    Но вообще, как и сказали в (1) правильней использовать ПутьКДаннымКартинкиСтроки, и при таком варианте появляется действительно крутая возможность, определять картинку сразу в запросе не производя ни-каких постобработок результатов запроса.

    Старайтесь думать не о быстроте работы на тестовом компьютере,а том как это будет лучше, и не будут эти места, точкой тормозов при клиент-серверном взаимодействии. Я вот тоже давиче выкатил в прод не оптимальный запрос, у меня всё работало как положено, в центральной базе на сервере с SQL тоже всё было хорошо, но вот РИБ узлы, «оценили» этот кривой запрос. Но то моя вина (поспешил, не проверил обстоятельно).

    Собственно на ошибках учатся, я очень надеюсь в этом на вас!

    Reply
  22. Evg-Lylyk

    (0) Автор исправьте функцию получения картинки можно сделать чтобы работала на клиенте с учетом сообщения 21

    А то опять начинается что лучше ПутьКДаннымКартинки )

    Reply
  23. w.r.
    Reply
  24. Alien_job

    (4) Как бы хотелось, чтобы это было смешно. Но иногда чтобы вывести картинку нужно использовать хранилище и строку.

    Reply
  25. rwn_driver

    Добрый день.

    Куда исчезло сообщение 21?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *