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