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