При разработке интерфейсов на управляемых формах 1С программисты часто сталкиваются с тем, что стандартные иконки 16х16 выводятся корректно, но стоит добавить прямоугольное изображение (например, информационную плашку или сложную иконку 48х16), как платформа начинает «самодеятельность». Картинка либо нещадно сжимается до нечитаемого состояния, либо искажается, превращаясь в «насиженное мухами» пятно. Разберем детально, почему это происходит и как заставить платформу отображать графику именно так, как задумал разработчик.
Прежде всего, нам необходимо понять, как движок управляемых форм рассчитывает пространство внутри ячейки таблицы. В 1С высота строки, заданная числом «1», не является константой в пикселях. Это расчетная величина, которая напрямую зависит от установленного системного шрифта и настроек масштабирования экрана (DPI).
Рассмотрим стандартную ситуацию: если в системе установлен шрифт 9pt, фактическая высота строки обычно составляет около 18–19 пикселей. Казалось бы, картинка высотой 16 пикселей должна входить идеально. Однако платформа резервирует внутренние отступы (padding) сверху и снизу. В итоге чистое пространство под контент может сократиться до 14–15 пикселей. Как только высота картинки превышает доступное пространство хотя бы на один пиксель, платформа включает алгоритм пропорционального вписывания. Для прямоугольной картинки 48х16 это означает, что она будет уменьшена по вертикали до 14 пикселей, и, сохраняя пропорции, ее ширина уменьшится с 48 до 42 пикселей. Результат — размытость и потеря четкости.
Самый простой способ, который часто помогает «вернуть» картинке ее законные размеры — изменение свойства ВысотаСтроки всей таблицы. Проанализируем, почему значение «1» может не работать, а «2» кажется избыточным.
Если мы установим свойство ВысотаСтроки в значение 2, платформа выделит под строку место, эквивалентное двум высотам стандартного шрифта. Это гарантированно даст место для картинки 16 или даже 24 пикселя в высоту, но визуально таблица станет «разреженной», что не всегда приемлемо для пользователя. Выясним причину, почему соседние колонки с квадратными иконками 16х16 при этом выглядят нормально: квадратные иконки часто имеют прозрачные поля или изначально спроектированы так, что их минимальное сжатие незаметно глазу. Прямоугольные же объекты гораздо чувствительнее к потере пропорций.
Если вы используете общую картинку, которая является набором (Image Collection), крайне важно правильно настроить свойства самого объекта в дереве метаданных. Допустим, ваша общая картинка имеет размер 144х16 пикселей и состоит из трех логических сегментов по 48 пикселей в ширину каждый.
Разберем по шагам настройку такого объекта:
Картинка в конфигураторе.ШиринаЯчейки.По умолчанию платформа часто подставляет туда значение 16. Если оставить 16 при общей ширине 144, 1С будет считать, что в наборе 9 квадратных иконок. При попытке вывести «первую» иконку, платформа попытается вырезать кусок 16х16 из вашего прямоугольника 48х16, что приведет к отображению только левой части изображения. Если же вы программно укажете индекс, платформа может выдать «кашу» из фрагментов разных иконок.
Для поля картинки в колонке таблицы существует свойство РазмерКартинки. Рассмотрим подробнее, как ведут себя его различные значения:
Начиная с версии платформы 8.3.14, у формы появилось свойство ПлотностьСодержимого. Посмотрим на разницу между режимами:
В режиме «Компактный» платформа минимизирует все отступы. Это часто приводит к тому, что прямоугольные картинки начинают сжиматься даже там, где раньше (в старых версиях платформы) они выводились нормально. Если ваша задача — вывести качественную графику, попробуйте переключить форму в режим «Удобный». В этом режиме под контент выделяется больше реальных пикселей, и картинка 48х16 может внезапно «расправиться» без изменения высоты строки в настройках таблицы.
Если никакие настройки не помогают сохранить четкость без увеличения высоты строк, применим хитрость, проверенную опытными разработчиками. Создадим для нашей иконки 48х16 прозрачный «подложечный» холст размером 48х48 (квадрат). Разместим нашу прямоугольную иконку по центру или по верхнему краю этого холста.
Проанализируем ситуацию: теперь платформа видит квадратный объект. При отрисовке в таблице она будет масштабировать квадрат 48х48 до размера, например, 16х16. Пропорции сохранятся идеально, и ваша прямоугольная часть внутри этого квадрата уменьшится ровно в 3 раза, оставшись четкой и неискаженной. Единственный минус — визуально полезная нагрузка картинки станет меньше, зато уйдет «размытость».
Иногда полезно управлять выводом картинок через событие ПриВыводеДанных (для обычных форм) или через условное оформление и отдельные реквизиты (для управляемых). Если мы используем динамический список, помните, что платформа оптимизирует его отрисовку для быстрой прокрутки. В динамических списках лучше придерживаться стандартных размеров кратных 16 (16, 32, 48).
Рассмотрим пример кода, где мы подготавливаем данные для вывода различных картинок в зависимости от условий, что поможет избежать лишних преобразований «на лету»:
// В обработчике ПриСозданииНаСервере или при получении данных
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Если СтрокаТЧ.Статус = Перечисления.СтатусыЗаказов.Готов Тогда
СтрокаТЧ.ИндексКартинки = 1; // Индекс в наборе 48х16
Иначе
СтрокаТЧ.ИндексКартинки = 0;
КонецЕсли;
КонецЦикла;
В данном случае, если свойство ШиринаЯчейки у набора картинок установлено в 48, платформа корректно выберет нужный сегмент. Чтобы картинка не сжималась, убедитесь, что в свойствах поля колонки РастягиватьПоГоризонтали и РастягиватьПоВертикали установлены в значение Нет.
Подведем итог нашим изысканиям. Чтобы прямоугольная картинка в таблице 1С выглядела достойно, необходимо:
ВысотаСтроки до 2, либо сменить ПлотностьСодержимого формы.РазмерКартинки в значение Пропорционально.Соблюдение этих правил позволит избежать «магии» 1С и добиться предсказуемого отображения интерфейса.