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