В процессе разработки на платформе 1С:Предприятие в режиме обычных форм (ОФ) часто возникает задача визуального выделения строк списка. Наиболее распространенный способ — использование события ПриПолученииДанных. Однако разработчики нередко сталкиваются с ситуацией, когда оформление работает «через раз», отображается некорректно у разных пользователей или ведет себя непредсказуемо при прокрутке списка. Давайте разберем, почему это происходит и как устранить проблему.
Основная проблема, с которой сталкиваются разработчики — это наличие необработанных исключений внутри процедуры оформления. Когда код раскраски обернут в глобальную конструкцию Попытка...Исключение, любые ошибки, возникающие при выполнении кода, «глотаются» платформой. В результате выполнение логики оформления прерывается, и строки остаются неокрашенными или получают оформление по умолчанию.
Рассмотрим пример кода, который часто становится источником ошибок:
Попытка
Если СтрокаМаржи.МаржаМеньше60 Тогда
Стр.ЦветФона = WebЦвета.Розовый;
КонецЕсли;
Исключение
// Ошибка подавлена, причина не ясна
КонецПопытки;
Как показывает практика, скрытая ошибка в подобном блоке часто связана с обращением к элементам формы (колонками), которые могут отсутствовать в настройках конкретного пользователя. Если пользователь настроил свой список, скрыв определенные колонки, а программный код пытается обратиться к ним или проверить их состояние, возникает исключение.
Чтобы стабилизировать работу оформления и избавиться от «лотереи» при прокрутке списка, выполним следующие действия:
Попытка...Исключение, охватывающей всю процедуру ПриПолученииДанных. Это позволит платформе выдать реальное описание ошибки при возникновении проблем.Вместо того чтобы скрывать ошибки, настройте код так, чтобы он был устойчив к отсутствию определенных данных или колонок. Проанализируем правильный подход:
// Правильная реализация раскраски в ПриПолученииДанных
Для Каждого Стр Из ОформленияСтрок Цикл
// Проверяем данные, которые мы получили
ДанныеСтроки = Стр.ДанныеСтроки;
// Выполняем проверку условий без глобальной попытки
Если ДанныеСтроки.МаржаМеньше60 Тогда
Стр.ЦветФона = WebЦвета.Розовый;
КонецЕсли;
// Если нужно обращение к колонке, убедитесь, что она есть
// Например, через проверку состава элементов формы или наличие поля в данных
КонецЦикла;
Важно помнить, что ПриПолученииДанных работает не с отдельными строками, а с «пакетами» данных, отображаемых в текущем окне. Если в одном из пакетов данных встречается значение, приводящее к ошибке (например, обращение к несуществующей колонке), обработка этого пакета может быть нарушена. Это объясняет, почему у одних пользователей список красится корректно (они настроили отображение колонок согласно логике кода), а у других — нет.
В качестве профилактики рекомендуем:
УсловноеОформление. Оно работает на уровне платформы, не требует программного вмешательства в ПриПолученииДанных и исключает подобные ошибки доступа в принципе.ЦветФона или другим свойствам ОформленияСтрок.Применяя эти методы, вы сможете добиться стабильного отображения списков и избавиться от скрытых ошибок, возникающих из-за разницы в настройках интерфейса пользователей.