При разработке интерфейсов на платформе 1С:Предприятие 8 часто возникает задача сделать списки документов или табличные части более наглядными. Самый эффективный способ — добавить колонку с иконкой статуса (проведен, помечен на удаление, только записан), как это реализовано в стандартных журналах документов. В этой статье мы подробно разберем, как работает механизм «нарезки» картинок платформой, как правильно подготовить коллекцию пиктограмм и как вычислить нужный индекс в запросе.
Для начала разберем техническую сторону вопроса. Платформа 1С не требует загрузки каждой маленькой иконки по отдельности. Вместо этого используется так называемый спрайт — одна длинная горизонтальная картинка, состоящая из набора квадратных иконок. Рассмотрим ситуацию, когда у нас есть файл формата PNG размером 144х16 пикселей.
Выясним, как платформа определяет, какой фрагмент показать. Механизм довольно прост: 1С берет высоту картинки (в нашем примере это 16 пикселей) и принимает её за размер стороны квадрата. Затем вся ширина картинки (144 пикселя) мысленно делится на эти отрезки. В результате получается массив из 9 виртуальных квадратов (144 / 16 = 9), каждый из которых имеет свой индекс, начиная с 0.
Важные требования к картинке-коллекции:
Чтобы вывести картинку в таблице, нам нужно выполнить несколько действий в конфигураторе. Проанализируем необходимые настройки:
Число. Именно в этой колонке будет храниться индекс иконки.Если в ячейку с индексом передать значение -1, то платформа не будет отображать в этой строке никакую картинку.
Наиболее производительный метод — вычислять номер иконки прямо в тексте запроса. Это избавляет от необходимости обходить строки таблицы программно. Рассмотрим классический пример формирования индекса для стандартных состояний документа.
Допустим, наша коллекция содержит иконки в следующем порядке: индекс 6 — записан, индекс 7 — проведен, индекс 8 — помечен на удаление. Посмотрим на пример кода в запросе:
ВЫБОР
КОГДА Ссылка.Проведен ТОГДА
7
ИНАЧЕ
ВЫБОР
КОГДА Ссылка.ПометкаУдаления ТОГДА 8
ИНАЧЕ 6
КОНЕЦ
КОНЕЦ КАК ИндексКартинки
Этот подход отлично работает, если у вас один тип документов. Однако в сложных журналах документов часто используется расширенная логика, например, при настройке автоматического обмена данными по расписанию между разными базами.
В типовых конфигурациях 1С (УТ 11, ERP, БП 3.0) принят стандарт использования триад. Это означает, что для каждого типа объекта в коллекции выделяется три последовательных позиции:
Проанализируем сложный пример, когда в одной таблице выводятся разные типы документов (например, заказы и накладные), и для каждого типа есть своя группа иконок в общем спрайте. Выясним причину использования смещения:
// Сначала определяем базовое смещение для типа документа
ВЫБОР
КОГДА Тип = ТИП(Документ.ЗаказПокупателя) ТОГДА 0 // Иконки заказа в коллекции начинаются с 0
КОГДА Тип = ТИП(Документ.РеализацияТоваровУслуг) ТОГДА 3 // Иконки реализации начинаются с 3
ИНАЧЕ 6
КОНЕЦ
+
// Затем добавляем смещение статуса внутри триады
ВЫБОР
КОГДА ПометкаУдаления ТОГДА 1
КОГДА Проведен ТОГДА 0
ИНАЧЕ 2
КОНЕЦ КАК ИндексКартинки
Такой математический подход позволяет легко управлять огромными коллекциями картинок, просто складывая базовый индекс группы и относительный индекс состояния.
Вместо создания собственных файлов .png, мы можем воспользоваться встроенными ресурсами платформы. Это гарантирует, что иконки будут выглядеть нативно в любой версии программы.
Рассмотрим полезные объекты из Библиотеки картинок:
БиблиотекаКартинок.СостояниеДокумента — содержит стандартную триаду (проведен, удален, записан).БиблиотекаКартинок.КоллекцияПиктограммСостоянийДокументов — расширенный набор для журналов.Чтобы использовать их, просто укажите название в свойстве КартинкиСтрок элемента формы. Преимущество системных картинок в том, что они корректно масштабируются системой при изменении DPI монитора пользователя. Для формирования собственных наборов можно использовать коллекцию графических ресурсов и иконок платформы 1С.
Если вы работаете не с динамическим списком, а с обычной таблицей значений на форме, расчет можно выполнить в цикле при заполнении данных. Разберем небольшой пример кода на сервере:
&НаСервере
Процедура ЗаполнитьСтатусыНаСервере()
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
// Допустим, в ТЧ есть колонка Ссылка на документ
Если СтрокаТЧ.ДокументОснование.ПометкаУдаления Тогда
СтрокаТЧ.ИндексСтатуса = 1;
ИначеЕсли СтрокаТЧ.ДокументОснование.Проведен Тогда
СтрокаТЧ.ИндексСтатуса = 0;
Иначе
СтрокаТЧ.ИндексСтатуса = 2;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Рассмотрим ситуацию, когда вы не хотите добавлять числовую колонку в запрос или данные. В этом случае можно воспользоваться механизмом Условного оформления формы. Посмотрим на алгоритм действий:
Объект.Товары.Проведен Равно Истина.Важное замечание: Метод с индексами и свойством КартинкиСтрок работает значительно быстрее на больших объемах данных, так как платформе не нужно проверять правила оформления для каждой ячейки отдельно — она просто берет готовое число и отображает соответствующий фрагмент спрайта.
Таким образом, мы изучили универсальный механизм визуализации статусов. Используя расчет индексов в запросах и коллекции-спрайты, вы сможете создавать профессиональные и интуитивно понятные интерфейсы в своих решениях на платформе 1С.