Доброго всем времени! Статья для новичков. Хотел бы выложить на мой взгляд простой и удобный способ добавления картинок в строках Дерева значений по условию. Изложенный вариант будет простым примером навскидку.
// Элементы.ДеревоОбъектовКартинка.КартинкаЗначений
// ПутьКДаннымКартинкиСтроки и КартинкаСтрок
// установку по ИндексуКартинки использовать мы не будем
Уже имеем форму, на ней ДеревоЗначений с колонками и реквизитами, а также Вашими процедурами и функциями для заполнения дерева значений. В моем случае эта форма, на которой выводится список Документов и Справочников.
Итак.
Имеем Реквизит ДеревоОбъектов с типом ДеревоЗначений.
Помимо имеющихся колонок в дереве (если таковые имеются), добавляем колонку с именем Картинка и типом Картинка
Далее если хотим, чтобы Картинка была в одной колонке, например, с Наименованием, необходимо добавить на форму группу колонок, добавляем и помещаем в группу наши колонки. (в моем примере колонки дерева, Картинка и ИдентификаторОбъекта).
Настраиваем группу колонок, чтобы наши две колонки (в данном случае ИдентификаторОбъекта и Картинка) были в одной ячейке
На форме поле Картинки будет следующим, устанавливаем положение заголовка — Нет
Сохраним все наши изменения и запустим на исполнение формирование Вашей процедуры или функции для получения результата. (в моем случае в результате это список документов и справочников). Получим результат без добавления картинок.
Как видим, картинок нет. Все верно, потому что мы настроили только внешнее оформление, теперь добавим сами картинки в строки нашего реквизита ДеревоОбъектов.
Давайте для примера реализуем следующее:
Если тип значения документ (строковый параметр, к примеру равен "Документ"), тогда картинка будет выбираться из стандартной библиотеки картинок — Документ, если Справочник, соответственно картинка справочника, иначе ничего не выводим (в смысле саму картинку не выводим).
Создадим простейшую функцию, которая будет возвращать Картинку из стандартной библиотеки по условию, как описали выше:
&НаСервере
Функция ЗаполнитьКартинкуВСтрокуДерева(УсловноеЗначение = Неопределено)
СтроковоеЗначение = Строка(УсловноеЗначение);
Если СтроковоеЗначение = "Документы" Тогда
Картинка = БиблиотекаКартинок.Документ;
ИначеЕсли СтроковоеЗначение = "Справочники" Тогда
Картинка = БиблиотекаКартинок.Справочник;
Иначе
Картинка = "";
КонецЕсли;
Возврат Картинка;
КонецФункции
Затем в Вашу Процедуру или функцию, в которой происходит заполнение значениями Дерева значений, добавляем простую строчку (при добавлении строки).
//В данном случае в обработке в значении НовыйОбъект.ИдентификаторОбъекта.Родитель - будет Документы не строкового типа
// далее это значение преобразуется в Строку в Функции ЗаполнитьКартинкуВСтрокуДерева()
НовыйОбъект = СтрокаДерева.Добавить();
НовыйОбъект.Картинка = ЗаполнитьКартинкуВСтрокуДерева(НовыйОбъект.ИдентификаторОбъекта.Родитель);
При добавлении строки в поле колонки Картинка, которое мы добавляли в ДеревоОбъектов с типом ДеревоЗначений, будет добавлена картинка.
Сохраним все наши изменения и запустим на исполнение формирование Вашей процедуры или функции для получения результата (в моем случае в результате это список документов и справочников). Теперь получим результат с добавленными картинками.
Если все описать кратко:
- Добавляем в реквизит с типом ДеревоЗначений колонку реквизита с типом Картинка.
- Размещаем реквизит колонки на форме
- В функции или процедуре при добавлении строк в ДеревоЗначений в свойство реквизита колонки присваиваем картинку.
P.S.
Вот вроде бы и все, вроде ничего сложного. Если кому помог, буду рад!
А зачем так извращаться-то? Проще надо быть — и люди к вам потянутся!
У дерева на форме есть свойства «ПутьКДаннымКартинкиСтроки» и «КартинкаСтрок». В поле, куда указывает путь, нужно установить путь, а в поле картинки — просто выбрать картинку с кучей всего на свете (например, «ПиктограммыЭлементов»). Дальше помещать индекс картинки в установленное поле картинки. Профит!
И вообще, пиктограмму в колонку нужно устанавливать запросом. Т.е. конструкция «ВЫБОР КОГДА Условие1 ТОГДА 1 КОГДА Условие2 ТОГДА 2 ИНАЧЕ 3 КОНЕЦ КАК Картинка» спасет отцов и детей русской демократии от западного ига!
(1) коллекция супер
(1)
Элементы.ДеревоОбъектовКартинка.КартинкаЗначений
// ПутьКДаннымКартинкиСтроки и КартинкаСтрок
// установку по ИндексуКартинки использовать мы не будем
Имхо мне больше нравится именно мой способ, но спасибо за вариант. )
Резюме данной статьи:
Чтобы вывести картинку в строке таблицы — используй тип Картинка.
(с) Кэп
(4)
Именно так!
Это получается каждую строку дерева нужно обработать функцией ЗаполнитьКартинкуВСтрокуДерева? А если строк в дереве 50-100 тыс или больше?
На самом деле, зачем изобретать велосипед. Это делается штатными механизмами без написания кода. В дереве значений (или таблице) делаем специальный реквизит числового типа с индексом картинки в коллекции, когда этот реквизит переносим на форму, ставим ему вид «Поле картинки» и заполняем свойство «Картинка значений». А сам индекс картинки заполняем любым удобным способом в зависимости от условий. Всё. Тут главное иметь в наличии нужную коллекцию картинок.
(7)
Вот дело в том что в наличии коллекции картинок нет, но нужно вывести картинку (один из способов). Так конечно штатными средствами. Это для пример и ничего больше).
(6) выше сказано что это ИМХО %)
Как-то даже грустно, что такие вещи пользуются популярностью, или сейчас видимо на Инфостарте дефицит статей для программистов, и засисилие графомании, а на безрыбье…
Поддержу автора, описанный способ более удобен по сравнению с коллекцией картинок.
Работа с картинками происходит более рационально.
Примеры: Добавить в коллекцию картинку из библиотеки проблемно, нельзя использовать картинку коллекции как отдельную.
(11)
Можно. Просто заполните индекс этой картинки в соответствующем реквизите.
(12) А если это картинка декорация на форме, картинка кнопки или элемент другой коллекции
или ее нужно вставить в справку.
(13) а что, у вас на компьютере удалили паинт? Не совсем понятен также контекст — с какой целью элемент коллекции нужно отображать в виде декорации? У большинства элементов приведенной мной коллекции есть отдельные картинки. А по поводу справки, то лучше копировать часть интерфейса, а не отдельную картинку. И уже описывать эту часть словами. Но т.к. пользователи все меньше понимают слова, то вместо встроенной в 1С справки лучше записать видео — тогда проблем с картинками в справке вообще не будет.
(1) +1
А кому интересно — посмотреть рабочий пример можно в 1С:СППР. Там как раз дерево метаданных так и визуализировано (т.е. справочник, представляющий метаданные конфигураций.
Велосипед
(6)
В чем проблема заполнить картинку 16х16 — 50 тыс строк?
(11)
Спасибо добрый человек.
(14) Еще раз поподробнее.
Публикация уместна при этом проста. Сам я где то около года назад столкнулся с новым методом. Судя по комментариям и плюсам много староверов.
КоллекцияКартинок и Индекс картинки такой подход использовался только Таблицы и Дерева и не знаю где еще, а вот картинка повсеместно. Теперь же можно за него забыть.
В новом подходе плюс что не нужно использовать коллекции не происходит дублирования картинки одиночной и внутри коллекции.
Лично для меня состовляет проблему сделать корректную картинку с прозрачностью внутри коллекции иногда негде взять иногда прозрачность краев на глаз.
Сейчас 1с начинает использовать картинки zip когда внутри картинки для разных размеров в старом подходе с этим проблемы.
Когда таблица имеет 3 колонки с картинками в старом подходе проблемы
Новый подход более читабелен прямо в коде написано
Если Документ.ПометкаУдаления Тогда
Картинка = БиблиотекаКартинок.ДокументПомеченныйНаУдаление
КонецЕсли;
в старом подходе
Если Документ.ПометкаУдаления Тогда
Индекс = 15;
КонецЕсли;
«с какой целью элемент коллекции нужно отображать в виде декорации»
Нужно достаточно часто. В бух.3 есть в форме документа картинка Проведен, НеПроведен, ПомеченНаУдаление
«У большинства элементов приведенной мной коллекции есть отдельные картинки.» дублирование картинок
Новый подход удобнее в разработке для себя не заметил плюсов старого похода.
Можно получать картинку из макета двоичных данных
Показать
Простите, не удержался. Мне забавно смотреть на такой код, который за любой мелочью лезет на сервер да ещё и с контекстом! Простите, зачем тут контекст?
Показать
А потом удивляются, почему их код тормозит при клиент-серверном взаимодействии, особенно если клиент удаленно разнесен с сервером и не говоря уже о том, что у клиента может быть слабый интернет… Этим даже сама 1С порой страдает…
https://infostart.ru/public/682305/
Пожалуйста, прочитайте замечательную статью про клиент-серверное взаимодействие
Так-же, вы прекрасно можете кешировать картинку на клиенте, получив с сервера только нужный набор картинок для группы и элемента, а затем на клиенте уже вставляя картинку куда надо.
Но вообще, как и сказали в (1) правильней использовать ПутьКДаннымКартинкиСтроки, и при таком варианте появляется действительно крутая возможность, определять картинку сразу в запросе не производя ни-каких постобработок результатов запроса.
Старайтесь думать не о быстроте работы на тестовом компьютере,а том как это будет лучше, и не будут эти места, точкой тормозов при клиент-серверном взаимодействии. Я вот тоже давиче выкатил в прод не оптимальный запрос, у меня всё работало как положено, в центральной базе на сервере с SQL тоже всё было хорошо, но вот РИБ узлы, «оценили» этот кривой запрос. Но то моя вина (поспешил, не проверил обстоятельно).
Собственно на ошибках учатся, я очень надеюсь в этом на вас!
(0) Автор исправьте функцию получения картинки можно сделать чтобы работала на клиенте с учетом сообщения 21
А то опять начинается что лучше ПутьКДаннымКартинки )
(4) Как бы хотелось, чтобы это было смешно. Но иногда чтобы вывести картинку нужно использовать хранилище и строку.
Добрый день.
Куда исчезло сообщение 21?