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