При разработке интерфейсов на управляемых формах часто возникает задача визуализировать статус документа с помощью иконок — для этого подойдёт отображение иконки скрепки при наличии файлов. Например, нужно показать, отгружен ли товар, оплачен ли счет или создан ли на основании реализации какой-либо другой документ. В этой статье мы подробно разберем, как реализовать вывод произвольных картинок в динамический список, не нарушая работу стандартных иконок проведения и удаления.
Это классический и наиболее производительный метод. Суть его заключается в том, что мы передаем из запроса числовой индекс, который указывает платформе, какую именно картинку из предварительно подготовленной коллекции нужно отобразить в данной строке.
Шаг 1. Подготовка коллекции картинок
Для начала нам понадобится объект конфигурации Картинка. Это не просто одно изображение, а «полоска» (библиотека картинок), состоящая из нескольких иконок одинакового размера (например, 16x16 пикселей), расположенных горизонтально или вертикально. Каждая иконка в этой полоске имеет свой индекс, начиная с 0.
Шаг 2. Настройка запроса динамического списка
Разберем ситуацию, когда нам нужно вывести иконку в зависимости от того, создан ли документ «Передача товара» на основании «Реализации». Перейдем в настройки динамического списка (свойство ПроизвольныйЗапрос) и добавим логику определения индекса. Проанализируем пример кода: для этой задачи есть готовый вывод изображений и состояния товаров в списках.
ВЫБРАТЬ
ДокументРеализация.Ссылка КАК Ссылка,
ДокументРеализация.Номер КАК Номер,
ДокументРеализация.Дата КАК Дата,
ВЫБОР
КОГДА ПередачаТовара.Ссылка ЕСТЬ НЕ NULL
ТОГДА 1 // Индекс картинки "Отгружено" в коллекции
ИНАЧЕ 2 // Индекс картинки "Не отгружено" в коллекции
КОНЕЦ КАК ИндексСтатусаОтгрузки
ИЗ
Документ.РеализацияТоваровУслуг КАК ДокументРеализация
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПередачаТовараКлиенту КАК ПередачаТовара
ПО ПередачаТовара.ДокументОснование = ДокументРеализация.Ссылка
Важный нюанс: Если документов-оснований может быть несколько, используйте ВЫБРАТЬ РАЗЛИЧНЫЕ или сгруппируйте запрос по ссылке реализации, чтобы избежать дублирования строк в списке.
Шаг 3. Настройка элемента формы
После изменения запроса в списке полей появится наше поле ИндексСтатусаОтгрузки. Вытащим его на форму и настроим свойства колонки:
Вид в значение Поле картинки.КартинкиЗначений выберем нашу созданную общую картинку (коллекцию).ИндексСтатусаОтгрузки.Выясним причину, по которой иногда вместо картинок отображается пустота или числа. Это часто связано с неверным указанием индексов. Как показывает практика, индексы в коллекции могут идти не подряд, если в графическом редакторе были оставлены пустые области. Если вы видите пустую колонку, попробуйте временно сменить вид поля на Поле ввода и посмотреть, какие числа реально приходят из запроса.
Рассмотрим альтернативный способ, который удобен, если иконки уже есть в типовой библиотеке картинок или вы не хотите создавать специальные коллекции. Условное оформление позволяет «подменять» картинку в колонке на лету (удобно через конструктор интерфейсов и динамических списков 1С).
Посмотрим на алгоритм действий:
Картинка и укажем конкретное изображение из библиотеки.ТоварОтгружен Равно Истина.Этот метод гибче, так как позволяет использовать любые картинки без привязки к их порядковому номеру в файле. Однако при большом количестве условий это может незначительно повлиять на скорость отрисовки списка.
Бывают ситуации, когда условие для вывода картинки слишком сложное для языка запросов (например, требуется расчет по сложным регистрам или обращение к внешним системам). В этом случае проанализируем использование серверного события.
Рассмотрим пример реализации:
&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
Для Каждого СтрокаСписка Из Строки Цикл
// Допустим, у нас есть сложная функция проверки
Статус = ПроверитьСложныйСтатус(СтрокаСписка.Значение.Ссылка);
Если Статус = "Проблема" Тогда
СтрокаСписка.Оформление["КолонкаСтатус"].УстановитьЗначениеПараметра("Картинка", БиблиотекаКартинок.Ошибка);
Иначе
СтрокаСписка.Оформление["КолонкаСтатус"].УстановитьЗначениеПараметра("Картинка", БиблиотекаКартинок.Готово);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Внимание: Данный метод следует использовать с осторожностью. Он вызывается каждый раз при прокрутке списка или обновлении данных. Сложные вычисления внутри цикла «Для каждого» могут привести к «тормозам» интерфейса у пользователя.
Разберем важные моменты, с которыми сталкиваются программисты:
КартинкиСтрок, платформа может заменить стандартные значки проведения и пометки удаления на ваши. Чтобы этого избежать, всегда создавайте отдельную колонку для своих статусов и назначайте КартинкиЗначений именно ей, а не всему списку.ПутьКДаннымПодсказки. Тогда при наведении на иконку пользователь увидит пояснение, например: «Документ полностью оплачен».Подводя итог, можно сказать, что наиболее стабильным и правильным вариантом для большинства задач является Метод 1. Он обеспечивает высокую скорость работы и легко поддерживается. Если же нужно быстро добавить иконку без изменения метаданных картинок — используйте условное оформление.