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

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

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

Анализ проблемы и механика работы виртуальных таблиц

Рассмотрим, почему запрос к виртуальным таблицам регистра накопления не возвращает строки по агрегатам, у которых пробег равен нулю:

  1. Механизм расчета итогов виртуальных таблиц: Виртуальные таблицы (Остатки, Обороты, ОстаткиИОбороты) платформы 1С на уровне СУБД формируют запросы с агрегатными функциями и автоматической фильтрацией пустых итогов. Если по агрегату есть только движение с ресурсом, равным 0, либо движений за указанный период не было вовсе, виртуальная таблица не возвращает эту строку. Физическая таблица движений строку с нулем содержит, а виртуальная таблица итогов — отсекает.
  2. Поведение ЛЕВОГО СОЕДИНЕНИЯ в СКД: При соединении среза последних регистра сведений (список установленных шин) с виртуальной таблицей оборотов для запасных шин формируются значения NULL по всем полям правой таблицы, включая поле Регистратор.
  3. Особенности группировок СКД: Когда в структуре отчета СКД мы настраиваем группировку по полю правой таблицы (в данном случае по регистратору), компоновщик макета СКД оптимизирует запрос. Если для элемента нет записей в таблице движений, поле регистратора принимает значение NULL, и при стандартных настройках компоновщик может исключить пустые ветки из дерева группировок.

Способ 1. Обработка значений NULL в тексте запроса

Если требуется сохранить единый запрос, разберем, как правильно составить текст запроса с заменой пустых значений регистратора и числовых ресурсов с помощью функции ЕСТЬNULL.

Посмотрим на пример запроса:


ВЫБРАТЬ
	АгрегатыСрез.ТС КАК ТС,
	АгрегатыСрез.ТС.ГосударственныйНомер КАК ГосНомер,
	АгрегатыСрез.СерияНоменклатуры КАК СерияНоменклатуры,
	АгрегатыСрез.СерияНоменклатуры.Модель КАК Модель,
	АгрегатыСрез.СерияНоменклатуры.Модель.НормаПробега КАК НормаПробега,
	ЕСТЬNULL(ИзносПробегОбороты.ПробегОборот, 0) КАК ПробегЗаПериод,
	ЕСТЬNULL(ИзносПробегОбороты.ИзносОборот, 0) КАК ИзносЗаПериод,
	ЕСТЬNULL(ИзносПробегОстатки.ПробегОстаток, 0) КАК ПробегВсего,
	ЕСТЬNULL(ИзносПробегОстатки.ИзносОстаток, 0) КАК ИзносВсего,
	ВЫБОР
		КОГДА АгрегатыСрез.ТС.ДатаВыбытия <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
			ТОГДА ИСТИНА
		ИНАЧЕ ЛОЖЬ
	КОНЕЦ КАК ТСВыбыло,
	ВЫБОР
		КОГДА АгрегатыСрез.СерияНоменклатуры.Модель.НормаПробега > 0
			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ИзносПробегОстатки.ПробегОстаток, 0) / АгрегатыСрез.СерияНоменклатуры.Модель.НормаПробега * 100 КАК ЧИСЛО(15, 2))
		ИНАЧЕ 0
	КОНЕЦ КАК ПроцентИспользования,
	АгрегатыСрез.СостояниеАгрегата КАК СостояниеАгрегата,
	ЕСТЬNULL(ИзносПробегОбороты.Регистратор, "Без пробега") КАК Регистратор
ИЗ
	РегистрСведений.ДПАТ_АгрегатыТС.СрезПоследних(&Период, ) КАК АгрегатыСрез
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ИзносПробегШин.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК ИзносПробегОбороты
		ПО АгрегатыСрез.СерияНоменклатуры = ИзносПробегОбороты.СерияНоменклатуры
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ИзносПробегШин.Остатки(&Период, ) КАК ИзносПробегОстатки
		ПО АгрегатыСрез.СерияНоменклатуры = ИзносПробегОстатки.СерияНоменклатуры
ГДЕ
	АгрегатыСрез.СерияНоменклатуры.Модель.ТипАгрегата.ТипАгрегата = ЗНАЧЕНИЕ(Перечисление.ДПАТ_ТипыАгрегатов.Шина)

Обратим внимание на ключевую конструкцию ЕСТЬNULL(ИзносПробегОбороты.Регистратор, "Без пробега"): теперь для запасных агрегатов поле регистратора не является пустым значением NULL, а содержит конкретную строку. Это позволяет СКД успешно сформировать ветку группировки для шин без движений.

Способ 2. Использование нескольких наборов данных и механизма связей СКД

Наиболее архитектурно правильный подход в системе компоновки данных — разделение источников на два независимых набора данных. Разберем по шагам, как это реализовать:

  1. Создаем Набор данных 1 (Запрос): Получаем полный перечень агрегатов и транспортных средств из регистра сведений или справочника. Этот набор будет базовым.
  2. Создаем Набор данных 2 (Запрос): Обращаемся к регистру накопления (таблице остатков или оборотов с периодичностью Регистратор), получая поля Регистратор, ПробегОборот, ИзносОборот и остатки.
  3. Настраиваем связи наборов данных: Переходим на вкладку Связи наборов данных и добавляем связь:
    • Источник связи: НаборДанных1
    • Приемник связи: НаборДанных2
    • Условие связи: СерияНоменклатуры = СерияНоменклатуры
    • Параметры: передаем параметры периода при необходимости.

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

Способ 3. Настройка ролей полей в схеме компоновки данных

Если используется виртуальная таблица ОстаткиИОбороты, важно правильно сконфигурировать роли полей на вкладке Наборы данных:

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

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

Рекомендации по проектированию движений в регистрах

Проанализируем стандарты разработки 1С относительно нулевых движений:

  1. Не формировать пустые движения: Запись строк с нулевыми значениями ресурсов в регистры накопления является неоптимальной практикой. Такие строки увеличивают размер физических таблиц и замедляют пересчет итогов, не влияя на агрегированные показатели.
  2. Разделять состояние и количественный учет: Местоположение шины (на ТС или в запасе) является состоянием и должно фиксироваться в регистре сведений. Количественные показатели (пробег, износ) должны фиксироваться в регистре накопления только при наличии фактического изменения показателей.
← На главную