Почему некорректно отображается картинка строк в динамическом списке 1С?

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

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

Причина 1. Программная перезапись текста запроса динамического списка

Проанализируем наиболее частую скрытую причину проблемы в типовых и доработанных конфигурациях (например, 1С:Управление торговлей, 1С:ERP или 1С:Комплексная автоматизация). При открытии формы в процедуре ПриСозданииНаСервере вызываются процедуры общих модулей для инициализации динамических списков. Нередко в этих процедурах текст запроса списка переопределяется динамически или дополняется новыми секциями выборки.

Если в конфигураторе в запросе динамического списка было добавлено числовое поле с индексом картинки, а затем общий модуль полностью переписал свойство Список.ТекстЗапроса, добавленное поле пропадает из итоговой выборки. В результате платформа не может прочитать значение по пути Список.ИндексКартинки и подставляет пиктограмму по умолчанию.

Для исправления ситуации выполним следующие действия:

  1. Найдем в модуле формы вызовы процедур инициализации в событии ПриСозданииНаСервере.
  2. Поставим точку останова после вызовов общих модулей и проверим в отладчике текущий Список.ТекстЗапроса.
  3. Убедимся, что вычисляемое поле с индексом картинки присутствует в итоговом тексте запроса. Если запрос формируется программно, добавим поле в алгоритм сборки текста запроса.

Причина 2. Оптимизация полей и свойство «ИспользоватьВсегда»

Платформа 1С:Предприятие 8.3 оптимизирует запросы динамического списка и запрашивает у СУБД только те поля, которые реально отображаются в элементах формы или используются в оформлении. Если поле индекса картинки присутствует в запросе, но не выведено в виде отдельной видимой колонки таблицы, платформа может исключить его из запроса.

Чтобы гарантировать выборку поля, настроим его принудительное чтение:

  1. Откроем свойства динамического списка в форме.
  2. Перейдем в настройку КомпоновщикНастроек → Настройки.
  3. В списке доступных полей найдем поле индекса и установим для него флаг Использовать (или в коде установим свойство ИспользоватьВсегда).

ПолеИндекса = Список.КомпоновщикНастроек.Настройки.Структура[0].Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ПолеИндекса.Поле = Новый ПолеКомпоновкиДанных("ИндексКартинки");
ПолеИндекса.Использование = Истина;

Причина 3. Некорректный тип данных, значения NULL и нумерация индексов

Рассмотрим правила работы свойства КартинкаСтрок с числовыми индексами:

  1. Индексация с нуля: Первый кадр коллекции имеет индекс 0, второй — 1 и так далее. Если передать индекс, превышающий количество кадров в файле, платформа выведет последний кадр коллекции.
  2. Строгая типизация: Поле, указанное в свойстве ПутьКДаннымКартинкиСтрок, обязательно должно иметь тип Число.
  3. Обработка пустых значений: Если в результате соединения таблиц или ветвления логики возвращается NULL или отрицательное число, поведение отображения становится непредсказуемым.

Посмотрим на пример правильного формирования поля индекса в запросе с обязательной веткой ИНАЧЕ и приведением типа:


ВЫБРАТЬ
    Спр.Ссылка КАК Ссылка,
    Спр.Наименование КАК Наименование,
    Спр.ПометкаУдаления КАК ПометкаУдаления,
    Спр.ЭтоГруппа КАК ЭтоГруппа,
    ВЫБОР
        КОГДА Спр.ПометкаУдаления ТОГДА 2
        КОГДА Спр.ЭтоГруппа ТОГДА 0
        ИНАЧЕ 1
    КОНЕЦ КАК ИндексКартинки
ИЗ
    Справочник.Номенклатура КАК Спр

Причина 4. Пользовательские настройки формы

Платформа кэширует настройки динамических списков для каждого пользователя в системном хранилище настроек. Если состав полей динамического списка изменялся, старые пользовательские настройки могут блокировать чтение новых полей. Для проверки сбросим настройки формы через меню Еще → Установить стандартные настройки.

Альтернативный вариант: Условное оформление динамического списка

Если нет возможности формировать многокадровые графические коллекции (strip-картинки) и высчитывать числовые индексы, выделим строки с помощью механизма условного оформления:

  1. Откроем свойства динамического списка и перейдем в Условное оформление.
  2. Добавим новый элемент оформления, где в качестве оформляемого поля укажем целевую колонку (или всю строку).
  3. В значении оформления выберем свойство Картинка и укажем стандартную пиктограмму из БиблиотекаКартинок.
  4. На вкладке Условие зададим логическое правило отображения.

Такой подход не зависит от числовой индексации и упрощает поддержку прикладного кода при обновлении конфигурации.

← На главную