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