Как вывести пустые значения или символы-заполнители для сотрудников без данных в отчете СКД

Программист 1С v8.3 (Управляемые формы) Управленческий учет
← На главную

В процессе разработки отчетов на системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда строка группировки исчезает из отчета, если в базе данных отсутствуют записи за конкретный период. Например, если сотрудник уволился или просто не имел начислений в октябре, он не попадет в октябрьскую колонку, даже если по остальным сотрудникам подразделения данные есть. Рассмотрим, как заставить СКД выводить такие "пустые" строки и заполнять их нужными нам символами, например, крестиком «х».

Почему обычные функции ЕСТЬNULL и ВЫБОР не работают?

Проанализируем ситуацию, описанную в теме. Автор пытается использовать ЕСТЬNULL или ВЫБОР КОГДА... непосредственно в запросе к одной таблице (регистру сведений). Однако эти функции работают только тогда, когда запись уже есть в выборке, но её поле содержит NULL. В нашем же случае записи за октябрь по конкретному сотруднику в таблице физически не существует. Следовательно, запросу просто не к чему применить условие или замену. Чтобы решить задачу, нам нужно сначала "создать" эту строку в результате компоновки.

Способ 1. Использование функции «Тип дополнения» в настройках СКД

Это самый правильный и "элегантный" способ в рамках идеологии СКД, не требующий сложного переписывания запросов. Система сама может сгенерировать недостающие периоды.

  1. Откроем схему компоновки данных и перейдем на вкладку Настройки.
  2. Выберем группировку по полю, которое отвечает за периоды (например, ПериодМесяц).
  3. В нижней части экрана найдем вкладку Параметры выбора/Группировки (или свойства выбранного поля группировки).
  4. Установим свойство Тип дополнения в значение Период.
  5. Укажем Начало периода и Конец периода (обычно это параметры отчета &НачалоПериода и &КонецПериода).

После этих манипуляций СКД автоматически добавит в результат строки для всех периодов в указанном диапазоне, даже если данных в исходной выборке не было. В появившихся пустых ячейках будет значение NULL, которое мы сможем обработать позже.

Способ 2. Модификация запроса: создание «сетки» через Декартово произведение

Если нам нужно более жестко контролировать вывод строк (например, выводить всех сотрудников справочника, независимо от наличия движений), применим метод создания виртуальной "сетки". Разберем по шагам:

Сначала подготовим таблицу всех возможных комбинаций сотрудников и периодов, а затем соединим её с реальными данными левым соединением.


ВЫБРАТЬ РАЗЛИЧНЫЕ
    Сотрудники.Ссылка КАК Сотрудник,
    Месяцы.Период КАК Период
ПОМЕСТИТЬ ВТ_Сетка
ИЗ
    Справочник.Сотрудники КАК Сотрудники
        СОЕДИНЕНИЕ (ВЫБРАТЬ НАЧАЛОПЕРИОДА(&НачалоПериода, МЕСЯЦ) КАК Период 
                   ОБЪЕДИНИТЬ ВЫБРАТЬ НАЧАЛОПЕРИОДА(&КонецПериода, МЕСЯЦ)) КАК Месяцы
ГДЕ
    Сотрудники.Подразделение = &Подразделение;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Сетка.Сотрудник,
    Сетка.Период,
    ЕСТЬNULL(Данные.Премия, 0) КАК Премия,
    ВЫБОР 
        КОГДА Данные.БылаИнвентаризация ЕСТЬ NULL ТОГДА "х" 
        ИНАЧЕ "v" 
    КОНЕЦ КАК Инвентаризация
ИЗ
    ВТ_Сетка КАК Сетка
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений._КЕ_ПремиальныйФонд КАК Данные
        ПО Сетка.Сотрудник = Данные.ФизическоеЛицо
        И Сетка.Период = НАЧАЛОПЕРИОДА(Данные.Период, МЕСЯЦ)

В данном примере мы сначала формируем все пары "Сотрудник - Месяц", а уже потом "накладываем" на них суммы премий и флаги инвентаризации. Теперь, даже если по Петрову в октябре не было записей, в таблице ВТ_Сетка такая строка будет, и после левого соединения мы получим NULL, который легко превратить в "х".

Способ 3. Связи наборов данных

Рассмотрим вариант, когда у нас есть два набора данных внутри СКД. Это позволяет разделить логику получения списка объектов и логику получения их показателей.

  1. НаборДанных1 (Запрос): Выбирает только список сотрудников, которые должны быть в отчете (из справочника или через ВЫБРАТЬ РАЗЛИЧНЫЕ из регистра без привязки к месяцу).
  2. НаборДанных2 (Запрос): Ваш исходный запрос из сообщения автора, который выбирает цифры из регистра.
  3. На вкладке Связи наборов данных укажем связь от Набора 1 к Набору 2 по полю ФизическоеЛицо.

Важно помнить: чтобы вывелись пустые периоды, Набор 1 также должен генерировать строки для каждого месяца. Иначе мы получим сотрудника в отчете, но колонки пустых месяцев по нему все равно не "отрисуются".

Оформление результата: выводим «х» вместо пустоты

Когда мы добились появления пустой строки одним из методов выше, нам нужно визуально заменить пустоту на символ «х». Для этого лучше всего использовать Условное оформление в настройках СКД.

Выясним причину, почему это лучше делать через оформление, а не в запросе: это сохраняет тип данных поля (число остается числом для итогов), но меняет его текстовое представление.

  1. Переходим на закладку Условное оформление.
  2. Добавляем новое правило.
  3. В параметре Текст пишем наше значение: х.
  4. В условии указываем: БылаИнвентаризация Не заполнено (или Значение равно Ложь, если это булево поле и мы вывели его через ЕСТЬNULL).
  5. В области выбора указываем только те поля, где должен стоять крестик.

Резюме: Чтобы вывести значения в ячейку, где их "не должно быть", необходимо принудительно дополнить выборку данными. Самый быстрый способ — настройка Тип дополнения для периода в группировке СКД. Самый гибкий — ЛЕВОЕ СОЕДИНЕНИЕ предварительно подготовленной таблицы всех возможных комбинаций аналитики с таблицей фактических данных.

← На главную