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