Почему нулевые обороты не выводятся из регистра накопления и как отобразить ноль в табличной части 1С?

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

При разработке отчетов и обработок в платформе «1С:Предприятие 8» разработчики часто сталкиваются с ситуацией, когда записи с нулевыми результатами не попадают в выборку запроса или отображаются в табличной части на форме как пустые ячейки вместо цифры 0. Рассмотрим подробно причины возникновения этой проблемы и разберем практические способы её решения.

Причины отсутствия данных с нулевым оборотом в запросе

Проанализируем работу виртуальной таблицы ОстаткиИОбороты регистра накопления. Когда запрос обращается к этой таблице и выбирает только ресурс оборота (например, ДепозитОборот), платформа рассчитывает результирующее значение по формуле «Приход минус Расход».

Если за выбранный период по объекту были одинаковые суммы прихода и расхода, конечный оборот равен нулю. При определенном составе выбираемых полей механизм виртуальных таблиц оптимизирует запрос и может не включать такие строки в результат, если в выборке отсутствуют явные поля оборотов по направлениям движений.

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


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	РегистрНакопленияДепозитОстаткиИОбороты.Водитель.Фамилия КАК ВодительФамилия,
|	РегистрНакопленияДепозитОстаткиИОбороты.ДепозитОборот КАК ДепозитОборот,
|	РегистрНакопленияДепозитОстаткиИОбороты.ДепозитПриход КАК ДепозитПриход,
|	РегистрНакопленияДепозитОстаткиИОбороты.ДепозитРасход КАК ДепозитРасход
|ИЗ
|	РегистрНакопления.РегистрНакопленияДепозит.ОстаткиИОбороты КАК РегистрНакопленияДепозитОстаткиИОбороты";

Результат = Запрос.Выполнить().Выбрать();

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

Получение всех объектов (включая тех, по кому не было движений)

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

  1. Основным источником запроса выбирается справочник-владелец (например, Справочник.Водители).
  2. К справочнику подключается виртуальная таблица регистра через ЛЕВОЕ СОЕДИНЕНИЕ.
  3. Для обработки пустых значений NULL применяется функция ЕСТЬNULL.

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	Водители.Наименование КАК Водитель,
|	ЕСТЬNULL(Депозиты.ДепозитОборот, 0) КАК ДепозитОборот
|ИЗ
|	Справочник.Водители КАК Водители
|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РегистрНакопленияДепозит.ОстаткиИОбороты КАК Депозиты
|	ПО Водители.Ссылка = Депозиты.Водитель";

Настройка отображения числового нуля на управляемой форме

Выясним причину, почему даже при наличии значения 0 в результате запроса ячейка в табличной части на форме выглядит пустой. По умолчанию платформа 1С для числовых полей с нулевым значением применяет представление в виде пустой строки, чтобы не загромождать интерфейс лишними нулями.

Изменение формата в самом ресурсе регистра накопления в метаданных не всегда передается элементам формы отчета или обработки. Чтобы включить отображение нуля в управляемой форме, выполним следующие шаги:

  1. Откроем форму отчета или обработки в дизайнере конфигуратора.
  2. Перейдем к дереву элементов формы и выделим нужную колонку таблицы (например, Депозит).
  3. В панели свойств найдем параметр Формат (или Format).
  4. В конструкторе форматной строки в поле Представление нуля установим значение 0 (в результате сформируется строка формата ЧН=0).

Если элемент формы создается или настраивается программно, установить данный параметр можно в коде формы:


&НаСервере
Процедура НастроитьОтображениеНаФорме()
	Элементы.ТабличнаяЧастьДепозитВодителейДепозит.Формат = "ЧН=0";
КонецПроцедуры

Архитектурные особенности проектирования регистров накопления

Проанализируем важный нюанс проектирования структуры регистра накопления. Размещение ссылок на документы (например, документы прихода или расхода) в качестве Измерений регистра является типовой ошибкой.

Каждое новое измерение создает дополнительный разрез учета в таблицах итогов. Если поместить документы в измерения:

Для фиксации документа-основания в платформе 1С предусмотрено системное поле Регистратор, а для дополнительной аналитики следует использовать Реквизиты регистра накопления.

← На главную