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