При разработке интерфейсов на платформе 1С:Предприятие 8 часто возникает задача: вывести в списке справочника количество связанных элементов из другой таблицы. Типичный пример — список организаций, в котором должна быть колонка с количеством транспортных средств, числящихся за каждой компанией. Однако начинающие разработчики часто сталкиваются с тем, что вместо ожидаемого нуля в пустых строках отображается пустота. Проанализируем, почему так происходит и как это исправить.
Рассмотрим ситуацию: мы создаем динамический список с произвольным запросом. В запросе мы используем ЛЕВОЕ СОЕДИНЕНИЕ основной таблицы (например, Справочник.Организации) с подчиненной таблицей или вложенным запросом, где подсчитано количество записей. Мы логично используем функцию ЕСТЬNULL(Количество, 0), ожидая увидеть заветный «0» для тех организаций, у которых нет транспорта. Однако в пользовательском режиме ячейка остается пустой.
Разберем причину этого явления. Динамический список — это не просто результат выполнения запроса к СУБД. Он работает на механизмах Системы компоновки данных (СКД). Платформа 1С оптимизирует отображение данных, и по умолчанию нулевые значения числовых типов часто интерпретируются как «отсутствие значения» и скрываются для визуальной чистоты интерфейса. Кроме того, имеет значение тип данных, который возвращает запрос.
Как показывает практика и обсуждение на форуме, наиболее частое решение кроется не в тексте запроса, а в свойствах самой колонки на форме. Платформа может иметь значение «0» в данных, но не отображать его визуально.
Выполним следующие шаги для настройки:
КоличествоТС).0. В строке формата это будет выглядеть как ЧН=0.После этого платформа будет принудительно выводить «0», даже если она считает это значение «пустым». Это решение помогло автору вопроса, и именно с него стоит начинать проверку.
Иногда проблема кроется в том, как именно подсчитывается количество в левом соединении. Проанализируем ситуацию, когда мы соединяем таблицы напрямую. Если мы используем агрегатную функцию КОЛИЧЕСТВО(), важно понимать разницу в её аргументах.
Рассмотрим два варианта использования функции:
КОЛИЧЕСТВО(*) — подсчитывает абсолютно все строки, попавшие в выборку после соединения.КОЛИЧЕСТВО(Транспорт.Ссылка) — подсчитывает только те строки, где поле Ссылка не является NULL.Если для организации нет ни одного транспортного средства, то при левом соединении в полях таблицы транспорта будет NULL. Функция КОЛИЧЕСТВО(Транспорт.Ссылка) в этом случае сама вернет число 0. Однако, если мы сначала делаем вложенный запрос, а потом соединяем его с основной таблицей, нам обязательно нужна функция ЕСТЬNULL.
Посмотрим на пример правильного вложенного запроса для динамического списка:
ВЫБРАТЬ
Организации.Ссылка КАК Ссылка,
ЕСТЬNULL(ВТ_Количество.КолВо, 0) КАК КоличествоТС
ИЗ
Справочник.Организации КАК Организации
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ
Транспорт.Организация КАК Организация,
КОЛИЧЕСТВО(Транспорт.Ссылка) КАК КолВо
ИЗ
Справочник.ТранспортныеСредства КАК Транспорт
СГРУППИРОВАТЬ ПО
Транспорт.Организация
) КАК ВТ_Количество
ПО Организации.Ссылка = ВТ_Количество.Организация
Обратите внимание: функция ЕСТЬNULL должна применяться во внешнем запросе к результату соединения, а не внутри вложенного запроса.
Если программные методы в запросе и форматная строка не дают результата (например, из-за особенностей конфигурации или использования сложных типов данных), мы можем применить Условное оформление формы. Это мощный инструмент визуализации, который работает на уровне отображения данных пользователю.
Разберем по шагам, как настроить условное оформление для динамического списка:
0.КоличествоТС Равно 0 (или КоличествоТС Не Заполнено, в зависимости от того, что реально возвращает запрос).КоличествоТС.Этот метод гарантированно «подменит» пустоту на нужный нам символ в интерфейсе, не меняя логику вычислений в базе данных.
Выясним причину, почему в модуле формы (в обычном запросе) результат выглядит корректно, а в списке — нет. Когда мы выполняем Запрос.Выполнить().Выгрузить(), мы получаем таблицу значений, где типы данных строго определены. Динамический список же управляется механизмом СКД, который накладывает свои правила:
NULL как пустую строку.Основная таблица, платформа пытается оптимизировать запрос. Иногда добавление сложных соединений с использованием ЕСТЬNULL в произвольном запросе конфликтует с внутренними механизмами оптимизации списка.Проанализировав ситуацию, можно сделать вывод: для решения проблемы с «невидимыми» нулями в 90% случаев достаточно установить свойство Формат (ЧН=0) в свойствах элемента формы. В остальных случаях стоит проверить правильность расстановки функций ЕСТЬNULL во вложенных запросах и убедиться, что агрегатные функции вызываются по конкретным полям, а не по всей звездочке (*).