Как программно изменить оформление строк в списках 1С: разбор процедуры ПриВыводеСтроки

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

В процессе разработки на платформе 1С:Предприятие (особенно в конфигурациях на «обычных формах», таких как «Альфа-Авто», «УПП» или «УТ 10.3») часто возникает задача визуального выделения данных. Это помогает пользователю быстрее ориентироваться в списках: видеть забронированные товары, помеченные на удаление позиции или специфические статусы заказов. В данной статье мы подробно разберем, как работает механизм оформления строк, проанализируем конкретный программный код и выясним, как избежать типичных ошибок производительности.

Суть механизма ПриВыводеСтроки

Событие ПриВыводеСтроки — это основной инструмент разработчика для динамического управления внешним видом табличного поля. Рассмотрим ситуацию: у нас есть список автомобилей, и нам нужно «зачеркнуть» строки с определенным брендом, подсветить серым цветом заказанные авто и добавить иконки в ячейки.

Важно понимать, что это событие вызывается системой каждый раз, когда строка отрисовывается на экране. Если пользователь прокручивает список, 1С заново выполняет этот код для каждой видимой строки. Именно поэтому код внутри этой процедуры должен быть максимально оптимизированным.

Разбор программного кода по шагам

Проанализируем фрагмент кода, представленный в вопросе, и разберем, что делает каждая его часть.


Процедура АвтооборотПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // 1. Работа с зачеркиванием и иконками бренда
    Если ДанныеСтроки.Бренд="-" Тогда
        ОформлениеСтроки.Шрифт = новый Шрифт(ОформлениеСтроки.Шрифт,,,,,,истина);    
        ОформлениеСтроки.Ячейки.ДнейНаСкладе.ОтображатьКартинку = истина;
        ОформлениеСтроки.Ячейки.ДнейНаСкладе.Картинка = БиблиотекаКартинок.Минус;
    ИначеЕсли ДанныеСтроки.Бренд="+" Тогда
        ОформлениеСтроки.Ячейки.ДнейНаСкладе.ОтображатьКартинку = истина;
        ОформлениеСтроки.Ячейки.ДнейНаСкладе.Картинка = БиблиотекаКартинок.Плюс;
    КонецЕсли; 

    // 2. Подсветка фона для заказов
    Если ЗначениеЗаполнено(ДанныеСтроки.ЗаказНаАвтомобиль) Тогда
        ОформлениеСтроки.ЦветФона = WebЦвета.СветлоСерый;
    КонецЕсли; 

    // 3. Индикация наличия данных об автомобиле
    Если ЗначениеЗаполнено(ДанныеСтроки.Автомобиль) Тогда
        ОформлениеСтроки.Ячейки.VIN.ОтображатьКартинку = истина;
        ОформлениеСтроки.Ячейки.VIN.Картинка = БиблиотекаКартинок.Автомобили;
    КонецЕсли;
КонецПроцедуры

Разберем детально каждый блок этого решения:

1. Управление шрифтом и свойство «Зачеркнутый»

В первой части кода мы видим условие: Если ДанныеСтроки.Бренд="-" Тогда. Здесь происходит интересная манипуляция со шрифтом:

ОформлениеСтроки.Шрифт = новый Шрифт(ОформлениеСтроки.Шрифт,,,,,,истина);

Конструктор объекта Шрифт в 1С позволяет изменять параметры существующего шрифта. Проанализируем параметры:

  1. ОформлениеСтроки.Шрифт — берем текущий шрифт строки за основу.
  2. Далее следуют пропущенные параметры (размер, жирность, наклон и т.д.).
  3. Седьмой параметр (значение истина) отвечает за свойство Зачеркивание.

Таким образом, если значение бренда равно «минус», вся строка визуально перечеркивается. Это очень эффективный способ показать неактивность позиции, не скрывая её из списка совсем.

2. Отображение картинок в ячейках

Для вывода пиктограмм используются свойства ОтображатьКартинку и Картинка конкретной ячейки. Обратите внимание на важный нюанс: если вы просто укажете картинку, но не установите ОтображатьКартинку = истина, пользователь ничего не увидит. В данном примере используются стандартные картинки из БиблиотекаКартинок, такие как Минус, Плюс и Автомобили.

3. Цветовое выделение строк

Условие ЗначениеЗаполнено(ДанныеСтроки.ЗаказНаАвтомобиль) проверяет, привязан ли к данной строке (автомобилю) какой-либо заказ. Если да, то свойство ОформлениеСтроки.ЦветФона меняется на WebЦвета.СветлоСерый. Это стандартная практика в отраслевых решениях для автобизнеса, чтобы менеджер сразу видел «занятые» позиции в стоке.

Критическая проблема: Оптимизация и «залипание» стилей

Рассмотрим ситуацию глубже. В текущем виде код содержит две серьезные проблемы, которые могут привести к сбоям в работе системы.

Проблема №1: Создание объектов в цикле отрисовки

Инструкция новый Шрифт(...) выполняется для каждой строки при каждом движении мыши по списку. Это порождает тысячи временных объектов в памяти. На слабом железе или при больших списках интерфейс начнет «подтормаживать».

Как правильно: Рекомендуется создать нужный шрифт заранее (например, в процедуре ПриОткрытии формы) и сохранить его в переменную модуля формы. Тогда в процедуре оформления вы будете просто назначать готовую ссылку на объект, что в десятки раз быстрее.

Проблема №2: Отсутствие очистки оформления

В 1С объекты оформления строк могут повторно использоваться системой для разных данных. Если в коде есть условие «Если что-то, то покрасить в серый», но нет условия Иначе («сбросить цвет в авто»), то при динамическом обновлении списка картинки и цвета могут «перепрыгнуть» на соседние строки или остаться там, где их уже быть не должно.

Улучшенная версия кода

Давайте перепишем данный фрагмент, сделав его более надежным и производительным. Предположим, что шрифт мы подготовили заранее в переменной ШрифтЗачеркнутый.


Процедура АвтооборотПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    // Сброс оформления (защита от "залипания")
    ОформлениеСтроки.ЦветФона = ЦветаСтиля.ЦветФонаФормы; // или Авто
    ОформлениеСтроки.Шрифт = ШрифтыСтиля.ШрифтТекста;
    
    // Оформление по бренду
    Если ДанныеСтроки.Бренд = "-" Тогда
        ОформлениеСтроки.Шрифт = ШрифтЗачеркнутый; // Используем заранее созданный объект
        ОформлениеСтроки.Ячейки.ДнейНаСкладе.ОтображатьКартинку = Истина;
        ОформлениеСтроки.Ячейки.ДнейНаСкладе.Картинка = БиблиотекаКартинок.Минус;
    ИначеЕсли ДанныеСтроки.Бренд = "+" Тогда
        ОформлениеСтроки.Ячейки.ДнейНаСкладе.ОтображатьКартинку = Истина;
        ОформлениеСтроки.Ячейки.ДнейНаСкладе.Картинка = БиблиотекаКартинок.Плюс;
    Иначе
        ОформлениеСтроки.Ячейки.ДнейНаСкладе.ОтображатьКартинку = Ложь;
    КонецЕсли;

    // Оформление заказа
    Если ЗначениеЗаполнено(ДанныеСтроки.ЗаказНаАвтомобиль) Тогда
        ОформлениеСтроки.ЦветФона = WebЦвета.СветлоСерый;
    КонецЕсли;

    // Оформление VIN
    ЯчейкаVIN = ОформлениеСтроки.Ячейки.VIN;
    Если ЗначениеЗаполнено(ДанныеСтроки.Автомобиль) Тогда
        ЯчейкаVIN.ОтображатьКартинку = Истина;
        ЯчейкаVIN.Картинка = БиблиотекаКартинок.Автомобили;
    Иначе
        ЯчейкаVIN.ОтображатьКартинку = Ложь;
    КонецЕсли;

КонецПроцедуры

Подведем итоги

Проанализировав ситуацию, мы выяснили:

Эти принципы помогут вам создавать отзывчивые и информативные интерфейсы в приложениях на базе 1С, обеспечивая комфортную работу пользователей с большими объемами данных.

← На главную