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