В процессе разработки в среде 1С:Предприятие часто возникает задача визуального выделения важных данных. Рассмотрим ситуацию, когда в конфигурации «Управление производственным предприятием 1.3» (УПП) необходимо раскрасить строки в списке документов, ориентируясь на значение конкретного реквизита — например, КоличествоПалет. Особое условие задачи заключается в том, что раскраска должна включаться и выключаться по нажатию специальной кнопки на форме.
Поскольку УПП 1.3 является «долгожителем» на рынке программного обеспечения, в ней могут встречаться как Обычные формы (характерные для классического интерфейса), так и Управляемые формы (используемые в новых подсистемах). Мы разберем подходы для обоих вариантов, проанализируем их производительность и выберем оптимальные методы реализации.
Для обычных форм основным элементом управления списком является ТабличноеПоле, связанное с типом ДокументСписок. Существует два основных события, позволяющих управлять оформлением строк: ПриВыводеСтроки и ПриПолученииДанных. Разберем их подробнее.
Метод 1: Использование события ПриВыводеСтроки
Это самый простой способ. Событие вызывается платформой в момент отрисовки каждой конкретной строки на экране. Рассмотрим пример кода, который проверяет условие и устанавливает цвет фона.
Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Проверяем, включен ли режим раскраски кнопкой
Если Не РаскрашиватьСписок Тогда
Возврат;
КонецЕсли;
// Проверяем условие по реквизиту КоличествоПалет
Если ДанныеСтроки.КоличествоПалет > 0 Тогда
ОформлениеСтроки.ЦветФона = Новый Цвет(255, 230, 230); // Светло-красный
КонецЕсли;
КонецПроцедуры
Важно помнить, что этот метод работает хорошо только в том случае, если реквизит КоличествоПалет уже присутствует в колонках списка. Если его там нет, обращение к ДанныеСтроки.КоличествоПалет может вызвать неявное обращение к базе данных для каждой строки, что критически замедлит прокрутку списка.
Метод 2: Оптимальное использование события ПриПолученииДанных
Проанализируем ситуацию, когда данных много или реквизиты нужно получать дополнительным запросом. Событие ПриПолученииДанных вызывается один раз для всей видимой области строк (пакета данных). Это позволяет минимизировать количество обращений к серверу.
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
Если Не РаскрашиватьСписок Тогда
Возврат;
КонецЕсли;
// Собираем ссылки на документы, которые сейчас видны в списке
СоответствиеСтрок = Новый Соответствие;
МассивСсылок = Новый Массив;
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
МассивСсылок.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);
СоответствиеСтрок.Вставить(ОформлениеСтроки.ДанныеСтроки.Ссылка, ОформлениеСтроки);
КонецЦикла;
// Выполняем один запрос для получения данных по всем видимым строкам
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ Ссылка, КоличествоПалет ИЗ Документ.РеализацияТоваровУслуг ГДЕ Ссылка В (&МассивСсылок)";
Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.КоличествоПалет > 0 Тогда
Оформление = СоответствиеСтрок.Получить(Выборка.Ссылка);
Оформление.ЦветФона = Новый Цвет(200, 255, 200); // Светло-зеленый
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В управляемом интерфейсе подход радикально меняется. Здесь мы не управляем каждой строкой в цикле «вручную». Вместо этого мы описываем правила оформления, а платформа сама применяет их на клиенте. Этот механизм называется Условное оформление.
Выясним, как настроить программное управление раскраской через кнопку в управляемой форме. Нам потребуется реквизит формы (например, ФлагРаскраски типа Булево), который будет связан с кнопкой.
Разберем шаги настройки в процедуре ПриСозданииНаСервере:
КоличествоПалет > 0 И ФлагРаскраски = Истина.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создаем элемент оформления
Элемент = УсловноеОформление.Элементы.Добавить();
// Устанавливаем цвет
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ЦветФонаВыделения);
// Указываем, какие поля красить (или всю строку)
ПолеОформления = Элемент.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Список");
// Условие 1: Реквизит больше нуля
ЭлементУсловия = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.КоличествоПалет");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементУсловия.ПравоеЗначение = 0;
// Условие 2: Кнопка нажата (связь с реквизитом формы)
ЭлементУсловия = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ФлагРаскраски");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловия.ПравоеЗначение = Истина;
КонецПроцедуры
Чтобы пользователь мог включать и выключать раскраску, необходимо добавить кнопку на командную панель формы. Рассмотрим логику её работы.
Для обычных форм:
Создадим переменную в начале модуля формы: Перем РаскрашиватьСписок;. В обработчике кнопки будем менять её значение и принудительно обновлять форму.
Процедура ДействиеКнопкиРаскрасить(Кнопка)
РаскрашиватьСписок = Не РаскрашиватьСписок; // Инвертируем значение
ЭлементыФормы.Список.Обновить(); // Перерисовываем список
КонецПроцедуры
Для управляемых форм:
Здесь всё еще проще. Кнопка должна быть связана с командой, которая меняет значение реквизита ФлагРаскраски. Поскольку условное оформление уже содержит привязку к этому реквизиту, платформа автоматически обновит цвета в списке, как только значение изменится.
&НаКлиенте
Процедура КомандаРаскрасить(Команда)
ФлагРаскраски = Не ФлагРаскраски;
// В управляемых формах список обновится автоматически при изменении реквизита
КонецПроцедуры
Проанализировав оба подхода, подведем итоги для успешной реализации задачи:
ПриПолученииДанных, если в списке отображается большое количество документов. Это спасет интерфейс от «фризов» при скроллинге.ПриВыводеСтроки, убедитесь, что колонка с проверяемым реквизитом (КоличествоПалет) добавлена в список, иначе система будет делать тысячи лишних запросов к базе.УсловноеОформление.WebЦвета или ЦветаСтиля для подбора гармоничной палитры.Таким образом, мы рассмотрели комплексное решение задачи: от выбора события в зависимости от типа формы до реализации пользовательского интерфейса с кнопкой-переключателем. Эти методы позволят сделать работу пользователя с документами в УПП 1.3 более эффективной и наглядной.