Отображение иконок или статусных значков в строках табличной части — это классическая задача, которая позволяет сделать интерфейс более интуитивно понятным для пользователя. Однако начинающие разработчики часто сталкиваются с ситуацией, когда вместо ожидаемой картинки в колонке отображается пустота или число. В этой статье мы подробно разберем, почему так происходит, и рассмотрим три надежных способа реализации этой задачи.
Проанализируем ситуацию, с которой столкнулся автор темы. В его коде предпринимается попытка присвоить реквизиту строки значение напрямую из БиблиотекаКартинок:
Стр.Значок = БиблиотекаКартинок.СигналАктивный
Это принципиальная ошибка для табличных частей. В 1С:Предприятие 8.3 механизм отображения картинок в списках и таблицах чаще всего работает через индексы. Если колонка таблицы предназначена для вывода иконки, она ожидает целое число (0, 1, 2...), которое указывает на порядковый номер картинки в предварительно заданной коллекции. Непосредственно объект типа Картинка таким образом вывести не удастся. Для формирования таких коллекций значков можно использовать набор графических ресурсов платформы 1С.
Это стандартный и наиболее производительный метод. Рассмотрим его по шагам:
Число), в котором будет храниться индекс иконки.
НовСтр = Объект.ТЧ.Добавить();
Если РезультатЗапроса.КоличествоТовара >= 3 Тогда
НовСтр.Значок = 0; // Индекс первой картинки в коллекции
Иначе
НовСтр.Значок = 1; // Индекс второй картинки в коллекции
КонецЕсли;
Важный нюанс: Если вы хотите скрыть картинку в конкретной строке, установите значение индекса равным -1.
Выясним причину, почему использование циклов для установки картинок может быть избыточным. Если логика отображения значков проста (зависит от значений других полей в этой же строке), лучше использовать механизм Условного оформления. Это работает на уровне платформы и не требует обхода строк в коде.
Разберем, как настроить это программно в процедуре ПриСозданииНаСервере:
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// 1. Указываем поле, которое будем оформлять
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТЧЗначок");
// 2. Задаем условие: КоличествоТовара >= 3
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТЧ.КоличествоТовара");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
ЭлементУсловия.ПравоеЗначение = 3;
// 3. Устанавливаем значение картинки (индекс или конкретную картинку)
ЭлементОформления.Оформить.ЗначениеКартинки.Установить(БиблиотекаКартинок.СигналАктивный);
Преимущество этого метода в том, что при изменении пользователем количества товара в строке, картинка обновится автоматически без вызова серверных процедур. Для автоматической генерации программных настроек подойдёт конструктор кода условного оформления для табличных частей.
Как упомянул автор в сообщении 4, проблему можно решить и через двоичные данные. Этот метод сложнее, но он незаменим, если картинки не статичны и загружаются, например, из присоединенных файлов (фотографии товаров).
Алгоритм действий следующий:
Строка.ПоместитьВоВременноеХранилище().e1cib/tempstorage/...) записывается в реквизит строки ТЧ.Проанализируем еще одну критическую ошибку в исходном коде автора. Внутри цикла Пока РезультатЗапроса.Следующий() он использует вложенный цикл Для Каждого Стр Из Объект.ТЧ.
Почему это плохо: Если в результате запроса 100 строк, то при добавлении первой строки программа выполнит 1 итерацию, при добавлении второй — снова обойдет все созданные строки, и так далее. В итоге вместо 100 операций программа выполнит тысячи лишних действий. Это классическая проблема производительности O(n^2).
Правильно устанавливать значение только для текущей добавляемой строки. Посмотрим на исправленный вариант:
Пока РезультатЗапроса.Следующий() Цикл
НовСтр = Объект.ТЧ.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр, РезультатЗапроса);
// Работаем только с НовСтр, никакой вложенный цикл не нужен!
Если РезультатЗапроса.КоличествоТовара >= 3 Тогда
НовСтр.Значок = 0; // Предположим, 0 - активный сигнал
Иначе
НовСтр.Значок = 1; // 1 - неактивный сигнал
КонецЕсли;
КонецЦикла;
Резюме: Для большинства задач со статусными иконками используйте Способ №1 (Коллекция + Индексы). Это обеспечит максимальную скорость работы интерфейса и простоту поддержки кода. Если же значок должен меняться "на лету" при редактировании строки пользователем — выбирайте Условное оформление.