Мы сталкиваемся с распространенной проблемой в 1С:ЗУП 3.1 при использовании Универсального отчета: параметры времени, которые мы устанавливаем в заголовке отчета (например, 2020, 2021 или 2022 годы), отображаются в параметрах отчета (выделенных красным) как неизменный 2019 год. Это происходит, когда мы строим отчет на основе непериодических регистров сведений. Разберем, почему возникает такая ситуация и как ее можно решить.
Как известно, УниверсальныйОтчет в 1С:ЗУП 3.1 — это мощный инструмент для гибкого формирования отчетов по различным объектам системы, включая справочники, документы, регистры сведений и регистры накопления. Однако, несмотря на его универсальность, при работе с непериодическими регистрами сведений возникают сложности с передачей параметров времени.
Разберем ключевые моменты:
Таким образом, проблема кроется в несовершенстве механизма передачи временных параметров для непериодических регистров в стандартной реализации Универсального отчета, что приводит к игнорированию выбранного периода и подстановке значения по умолчанию.
Один из пользователей форума подтвердил, что смог решить проблему, отредактировав отчет в Блокноте. Это возможно, поскольку УниверсальныйОтчет, как и большинство отчетов 1С, основан на СистемеКомпоновкиДанных (СКД). Определение СКД хранится в XML-формате, и ручная правка означает непосредственное изменение этого XML-файла.
Давайте рассмотрим шаги, которые мы можем предпринять для такой правки:
.erf или .xml). Если это встроенный отчет конфигурации, вам потребуется доступ к конфигуратору, чтобы выгрузить схему компоновки данных. Обычно это можно сделать через контекстное меню отчета в конфигураторе: Схема компоновки данных -> Выгрузить схему компоновки данных.<parameters>. Убедимся, что параметры, отвечающие за период (обычно НачалоПериода и КонецПериода), корректно определены. Проверьте их тип данных (DataType должен быть Дата) и свойство Use (должно быть Always или InReport). Если эти параметры отсутствуют или некорректно определены, мы можем добавить или исправить их. Например:
<parameter name="НачалоПериода">
<value xsi:type="xs:dateTime">2023-01-01T00:00:00</value>
<use>Always</use>
<choiceParameterLinks/>
<title xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Начало периода</v8:content>
</v8:item>
</title>
<dataPath xsi:type="xs:string">НачалоПериода</dataPath>
<titleLocation>Auto</titleLocation>
<extendedEdit>DontUse</extendedEdit>
</parameter>
<parameter name="КонецПериода">
<value xsi:type="xs:dateTime">2023-12-31T23:59:59</value>
<use>Always</use>
<choiceParameterLinks/>
<title xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Конец периода</v8:content>
</v8:item>
</title>
<dataPath xsi:type="xs:string">КонецПериода</dataPath>
<titleLocation>Auto</titleLocation>
<extendedEdit>DontUse</extendedEdit>
</parameter>
Важно, чтобы <value> не содержал жестко закодированного 2019 года, а был либо пустым, либо содержал динамическое значение по умолчанию, либо вовсе не присутствовал, полагаясь на передачу из внешнего источника.
<dataSets> и найдем внутри него <dataSetQuery>. Здесь находится текст запроса, который выбирает данные из регистра. Важно убедиться, что условия отбора по периоду включены в запрос явно. Даже если регистр непериодический, но содержит поле даты (например, ДатаСобытия), мы должны использовать его для фильтрации. Пример:
<query>
ВЫБРАТЬ
РегистрСведенийНаш.Поле1,
РегистрСведенийНаш.ДатаСобытия,
...
ИЗ
РегистрСведений.НашНепериодическийРегистр КАК РегистрСведенийНаш
ГДЕ
РегистрСведенийНаш.ДатаСобытия МЕЖДУ &НачалоПериода И &КонецПериода
</query>
Если в запросе нет условий МЕЖДУ &НачалоПериода И &КонецПериода или аналогичных, это может быть причиной игнорирования периода. Мы должны добавить эти условия.
<reportParameters> и <settings> в XML, чтобы убедиться, что НачалоПериода и КонецПериода корректно сопоставлены с элементами пользовательских настроек.Схема компоновки данных -> Загрузить схему компоновки данных) или откройте отредактированный внешний отчет/обработку в режиме 1С:Предприятия.Этот метод требует осторожности и базовых знаний XML и СКД, так как любая синтаксическая ошибка может привести к неработоспособности отчета. Однако, как видим, он может быть эффективным быстрым решением.
Для более надежного и управляемого решения, особенно если Универсальный отчет не справляется со специфическими требованиями или требует регулярных доработок, мы рекомендуем разработать собственный отчет с использованием Системы Компоновки Данных (СКД).
Создание собственного отчета на СКД предоставляет нам полный контроль над запросами, параметрами и логикой формирования данных. Рассмотрим основные шаги:
НачалоПериода и КонецПериода и используем их для фильтрации данных по полю даты в регистре. Например, если в нашем непериодическом регистре есть поле ДатаСобытия, запрос будет выглядеть так:
ВЫБРАТЬ
РегистрСведенийНаш.Поле1,
РегистрСведенийНаш.ДатаСобытия,
РегистрСведенийНаш.Измерение2,
РегистрСведенийНаш.Ресурс1
ИЗ
РегистрСведений.НашНепериодическийРегистр КАК РегистрСведенийНаш
ГДЕ
РегистрСведенийНаш.ДатаСобытия МЕЖДУ &НачалоПериода И &КонецПериода
НачалоПериода и КонецПериода. Обязательно устанавливаем для них тип «Дата» и определяем их свойства использования (например, «Включать в пользовательские настройки» и «Редактировать»). Мы можем также задать значения по умолчанию, которые будут подставляться, если пользователь их не укажет.Этот подход более трудоемкий, но он обеспечивает максимальную гибкость, надежность и предсказуемость в работе отчета.
Проблема с некорректным отображением года (фиксированный 2019) в параметрах времени Универсального отчета 1С:ЗУП 3.1 при работе с непериодическими регистрами является известной "особенностью" или ограничением типового механизма. Вероятно, это связано с тем, что Универсальный отчет по умолчанию работает с таблицами и не всегда учитывает специфическую логику обработки временных данных для непериодических объектов в части передачи параметров.
Мы предлагаем следующие рекомендации:
Таким образом, мы можем либо адаптировать существующий Универсальный отчет, либо создать новый, более подходящий для наших специфических нужд, гарантируя, что параметры времени будут обрабатываться так, как мы ожидаем.