В процессе разработки на платформе 1С:Предприятие (особенно в конфигурациях на «обычных формах», таких как «Альфа-Авто», «УПП» или «УТ 10.3») часто возникает задача визуального выделения данных. Это помогает пользователю быстрее ориентироваться в списках: видеть забронированные товары, помеченные на удаление позиции или специфические статусы заказов. В данной статье мы подробно разберем, как работает механизм оформления строк, проанализируем конкретный программный код и выясним, как избежать типичных ошибок производительности.
Событие ПриВыводеСтроки — это основной инструмент разработчика для динамического управления внешним видом табличного поля. Рассмотрим ситуацию: у нас есть список автомобилей, и нам нужно «зачеркнуть» строки с определенным брендом, подсветить серым цветом заказанные авто и добавить иконки в ячейки.
Важно понимать, что это событие вызывается системой каждый раз, когда строка отрисовывается на экране. Если пользователь прокручивает список, 1С заново выполняет этот код для каждой видимой строки. Именно поэтому код внутри этой процедуры должен быть максимально оптимизированным.
Проанализируем фрагмент кода, представленный в вопросе, и разберем, что делает каждая его часть.
Процедура АвтооборотПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// 1. Работа с зачеркиванием и иконками бренда
Если ДанныеСтроки.Бренд="-" Тогда
ОформлениеСтроки.Шрифт = новый Шрифт(ОформлениеСтроки.Шрифт,,,,,,истина);
ОформлениеСтроки.Ячейки.ДнейНаСкладе.ОтображатьКартинку = истина;
ОформлениеСтроки.Ячейки.ДнейНаСкладе.Картинка = БиблиотекаКартинок.Минус;
ИначеЕсли ДанныеСтроки.Бренд="+" Тогда
ОформлениеСтроки.Ячейки.ДнейНаСкладе.ОтображатьКартинку = истина;
ОформлениеСтроки.Ячейки.ДнейНаСкладе.Картинка = БиблиотекаКартинок.Плюс;
КонецЕсли;
// 2. Подсветка фона для заказов
Если ЗначениеЗаполнено(ДанныеСтроки.ЗаказНаАвтомобиль) Тогда
ОформлениеСтроки.ЦветФона = WebЦвета.СветлоСерый;
КонецЕсли;
// 3. Индикация наличия данных об автомобиле
Если ЗначениеЗаполнено(ДанныеСтроки.Автомобиль) Тогда
ОформлениеСтроки.Ячейки.VIN.ОтображатьКартинку = истина;
ОформлениеСтроки.Ячейки.VIN.Картинка = БиблиотекаКартинок.Автомобили;
КонецЕсли;
КонецПроцедуры
Разберем детально каждый блок этого решения:
В первой части кода мы видим условие: Если ДанныеСтроки.Бренд="-" Тогда. Здесь происходит интересная манипуляция со шрифтом:
ОформлениеСтроки.Шрифт = новый Шрифт(ОформлениеСтроки.Шрифт,,,,,,истина);
Конструктор объекта Шрифт в 1С позволяет изменять параметры существующего шрифта. Проанализируем параметры:
ОформлениеСтроки.Шрифт — берем текущий шрифт строки за основу.истина) отвечает за свойство Зачеркивание.Таким образом, если значение бренда равно «минус», вся строка визуально перечеркивается. Это очень эффективный способ показать неактивность позиции, не скрывая её из списка совсем.
Для вывода пиктограмм используются свойства ОтображатьКартинку и Картинка конкретной ячейки. Обратите внимание на важный нюанс: если вы просто укажете картинку, но не установите ОтображатьКартинку = истина, пользователь ничего не увидит. В данном примере используются стандартные картинки из БиблиотекаКартинок, такие как Минус, Плюс и Автомобили.
Условие ЗначениеЗаполнено(ДанныеСтроки.ЗаказНаАвтомобиль) проверяет, привязан ли к данной строке (автомобилю) какой-либо заказ. Если да, то свойство ОформлениеСтроки.ЦветФона меняется на WebЦвета.СветлоСерый. Это стандартная практика в отраслевых решениях для автобизнеса, чтобы менеджер сразу видел «занятые» позиции в стоке.
Рассмотрим ситуацию глубже. В текущем виде код содержит две серьезные проблемы, которые могут привести к сбоям в работе системы.
Проблема №1: Создание объектов в цикле отрисовки
Инструкция новый Шрифт(...) выполняется для каждой строки при каждом движении мыши по списку. Это порождает тысячи временных объектов в памяти. На слабом железе или при больших списках интерфейс начнет «подтормаживать».
Как правильно: Рекомендуется создать нужный шрифт заранее (например, в процедуре ПриОткрытии формы) и сохранить его в переменную модуля формы. Тогда в процедуре оформления вы будете просто назначать готовую ссылку на объект, что в десятки раз быстрее.
Проблема №2: Отсутствие очистки оформления
В 1С объекты оформления строк могут повторно использоваться системой для разных данных. Если в коде есть условие «Если что-то, то покрасить в серый», но нет условия Иначе («сбросить цвет в авто»), то при динамическом обновлении списка картинки и цвета могут «перепрыгнуть» на соседние строки или остаться там, где их уже быть не должно.
Давайте перепишем данный фрагмент, сделав его более надежным и производительным. Предположим, что шрифт мы подготовили заранее в переменной ШрифтЗачеркнутый.
Процедура АвтооборотПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Сброс оформления (защита от "залипания")
ОформлениеСтроки.ЦветФона = ЦветаСтиля.ЦветФонаФормы; // или Авто
ОформлениеСтроки.Шрифт = ШрифтыСтиля.ШрифтТекста;
// Оформление по бренду
Если ДанныеСтроки.Бренд = "-" Тогда
ОформлениеСтроки.Шрифт = ШрифтЗачеркнутый; // Используем заранее созданный объект
ОформлениеСтроки.Ячейки.ДнейНаСкладе.ОтображатьКартинку = Истина;
ОформлениеСтроки.Ячейки.ДнейНаСкладе.Картинка = БиблиотекаКартинок.Минус;
ИначеЕсли ДанныеСтроки.Бренд = "+" Тогда
ОформлениеСтроки.Ячейки.ДнейНаСкладе.ОтображатьКартинку = Истина;
ОформлениеСтроки.Ячейки.ДнейНаСкладе.Картинка = БиблиотекаКартинок.Плюс;
Иначе
ОформлениеСтроки.Ячейки.ДнейНаСкладе.ОтображатьКартинку = Ложь;
КонецЕсли;
// Оформление заказа
Если ЗначениеЗаполнено(ДанныеСтроки.ЗаказНаАвтомобиль) Тогда
ОформлениеСтроки.ЦветФона = WebЦвета.СветлоСерый;
КонецЕсли;
// Оформление VIN
ЯчейкаVIN = ОформлениеСтроки.Ячейки.VIN;
Если ЗначениеЗаполнено(ДанныеСтроки.Автомобиль) Тогда
ЯчейкаVIN.ОтображатьКартинку = Истина;
ЯчейкаVIN.Картинка = БиблиотекаКартинок.Автомобили;
Иначе
ЯчейкаVIN.ОтображатьКартинку = Ложь;
КонецЕсли;
КонецПроцедуры
Проанализировав ситуацию, мы выяснили:
ПриВыводеСтроки работает с объектом ОформлениеСтроки, который предоставляет доступ к визуальным свойствам ячеек.Шрифт с передачей Истина в качестве седьмого параметра (учитывая исходный шрифт).БиблиотекаКартинок позволяет быстро добавить визуальные индикаторы без загрузки внешних файлов.Иначе и избегать создания новых объектов внутри событий отрисовки.Эти принципы помогут вам создавать отзывчивые и информативные интерфейсы в приложениях на базе 1С, обеспечивая комфортную работу пользователей с большими объемами данных.