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