Как правильно установить картинку в табличной части управляемой формы 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Отображение иконок или статусных значков в строках табличной части — это классическая задача, которая позволяет сделать интерфейс более интуитивно понятным для пользователя. Однако начинающие разработчики часто сталкиваются с ситуацией, когда вместо ожидаемой картинки в колонке отображается пустота или число. В этой статье мы подробно разберем, почему так происходит, и рассмотрим три надежных способа реализации этой задачи.

Разбор типичной ошибки: Объекты против Индексов

Проанализируем ситуацию, с которой столкнулся автор темы. В его коде предпринимается попытка присвоить реквизиту строки значение напрямую из БиблиотекаКартинок:

Стр.Значок = БиблиотекаКартинок.СигналАктивный

Это принципиальная ошибка для табличных частей. В 1С:Предприятие 8.3 механизм отображения картинок в списках и таблицах чаще всего работает через индексы. Если колонка таблицы предназначена для вывода иконки, она ожидает целое число (0, 1, 2...), которое указывает на порядковый номер картинки в предварительно заданной коллекции. Непосредственно объект типа Картинка таким образом вывести не удастся. Для формирования таких коллекций значков можно использовать набор графических ресурсов платформы 1С.

Способ №1. Использование коллекции картинок и свойства ПутьКДаннымКартинки

Это стандартный и наиболее производительный метод. Рассмотрим его по шагам:

  1. Подготовка коллекции: Создайте в конфигураторе (или возьмите из общих картинок) одну картинку, которая состоит из нескольких иконок одинакового размера, расположенных в ряд (например, 16x16 пикселей каждая).
  2. Настройка таблицы формы: Выделите элемент формы «Таблица» (вашу табличную часть). В палитре свойств найдите поле Картинка строк и выберите вашу коллекцию картинок.
  3. Настройка колонки: У колонки, где должен отображаться значок, установите свойство ПутьКДаннымКартинки. В этом свойстве укажите реквизит табличной части (типа Число), в котором будет храниться индекс иконки.
  4. Программная установка: Теперь в коде достаточно присваивать числовые значения. Если в коллекции первая картинка — это «Активен», а вторая — «Неактивен», то код будет выглядеть так:

НовСтр = Объект.ТЧ.Добавить();
Если РезультатЗапроса.КоличествоТовара >= 3 Тогда 
    НовСтр.Значок = 0; // Индекс первой картинки в коллекции
Иначе 
    НовСтр.Значок = 1; // Индекс второй картинки в коллекции
КонецЕсли;

Важный нюанс: Если вы хотите скрыть картинку в конкретной строке, установите значение индекса равным -1.

Способ №2. Условное оформление формы (без написания лишнего кода)

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

Разберем, как настроить это программно в процедуре ПриСозданииНаСервере:


ЭлементОформления = УсловноеОформление.Элементы.Добавить();

// 1. Указываем поле, которое будем оформлять
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТЧЗначок");

// 2. Задаем условие: КоличествоТовара >= 3
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТЧ.КоличествоТовара");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
ЭлементУсловия.ПравоеЗначение = 3;

// 3. Устанавливаем значение картинки (индекс или конкретную картинку)
ЭлементОформления.Оформить.ЗначениеКартинки.Установить(БиблиотекаКартинок.СигналАктивный);

Преимущество этого метода в том, что при изменении пользователем количества товара в строке, картинка обновится автоматически без вызова серверных процедур. Для автоматической генерации программных настроек подойдёт конструктор кода условного оформления для табличных частей.

Способ №3. Использование навигационных ссылок (Двоичные данные)

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

Алгоритм действий следующий:

  1. Реквизит в табличной части должен иметь тип Строка.
  2. На сервере картинка помещается во временное хранилище с помощью функции ПоместитьВоВременноеХранилище().
  3. Полученный адрес (строка вида e1cib/tempstorage/...) записывается в реквизит строки ТЧ.
  4. У элемента формы (колонки) в свойстве ПутьКДанным указывается этот строковый реквизит, а вид элемента должен быть Поле картинки.

Оптимизация алгоритма обхода данных

Проанализируем еще одну критическую ошибку в исходном коде автора. Внутри цикла Пока РезультатЗапроса.Следующий() он использует вложенный цикл Для Каждого Стр Из Объект.ТЧ.

Почему это плохо: Если в результате запроса 100 строк, то при добавлении первой строки программа выполнит 1 итерацию, при добавлении второй — снова обойдет все созданные строки, и так далее. В итоге вместо 100 операций программа выполнит тысячи лишних действий. Это классическая проблема производительности O(n^2).

Правильно устанавливать значение только для текущей добавляемой строки. Посмотрим на исправленный вариант:


Пока РезультатЗапроса.Следующий() Цикл
    НовСтр = Объект.ТЧ.Добавить();
    ЗаполнитьЗначенияСвойств(НовСтр, РезультатЗапроса);
    
    // Работаем только с НовСтр, никакой вложенный цикл не нужен!
    Если РезультатЗапроса.КоличествоТовара >= 3 Тогда 
        НовСтр.Значок = 0; // Предположим, 0 - активный сигнал
    Иначе 
        НовСтр.Значок = 1; // 1 - неактивный сигнал
    КонецЕсли;
КонецЦикла;

Резюме: Для большинства задач со статусными иконками используйте Способ №1 (Коллекция + Индексы). Это обеспечит максимальную скорость работы интерфейса и простоту поддержки кода. Если же значок должен меняться "на лету" при редактировании строки пользователем — выбирайте Условное оформление.

← На главную