Как убрать лишний параметр «Период» в СКД при выборе виртуальной таблицы остатков

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке отчетов на Системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда после написания запроса к виртуальной таблице (например, Остатки или ОстаткиИОбороты) в списке параметров внезапно появляется стандартный параметр &Период. Это происходит даже в тех случаях, когда в самом тексте запроса уже определен и передан другой параметр. В результате пользователь видит в шапке отчета лишнее поле ввода, которое может путать или приводить к некорректным результатам. В этой статье мы подробно разберем, почему это происходит и какими способами можно элегантно решить данную проблему.

Почему СКД самовольно добавляет параметр &Период?

Для начала проанализируем внутренние механизмы СКД. По умолчанию в схеме компоновки данных включен флаг «Автозаполнение». Эта функция призвана облегчить жизнь разработчику: система сканирует текст запроса, находит виртуальные таблицы и автоматически создает для них параметры, доступные для настройки. Для таблицы Остатки таким обязательным параметром является &Период.

Когда мы пишем запрос и вручную передаем значение в первый параметр виртуальной таблицы, например:


РегистрБухгалтерии.Хозрасчетный.Остатки(
    ДОБАВИТЬКДАТЕ(&НачалоПериода, СЕКУНДА, -1),
    Счет В ИЕРАРХИИ (&СписокСчетов),
    ,
) КАК ХозрасчетныйОстатки

Система компоновки всё равно «видит», что это виртуальная таблица остатков, и считает своим долгом добавить стандартный параметр &Период в общий список, так как он заложен в метаданных самой таблицы. Ситуация осложняется в механизмах типа «Произвольные отчеты», где программный код может игнорировать флаги видимости и выводить в интерфейс всё, что найдено в схеме.

Решение №1: Использование фигурных скобок (Расширение языка запросов)

Рассмотрим наиболее профессиональный и гибкий метод — использование расширений языка запросов СКД. Фигурные скобки {} позволяют явно указать системе компоновки, как именно нужно управлять параметрами виртуальной таблицы.

Если мы хотим, чтобы СКД использовала наш параметр и не создавала дублей, мы можем обернуть параметр в фигурные скобки. Давайте изменим наш запрос следующим образом:


РегистрБухгалтерии.Хозрасчетный.Остатки(
    {&НачалоПериода},
    Счет В ИЕРАРХИИ (Значение(ПланСчетов.Хозрасчетный.РасчетыСПокупателямиИЗаказчиками)),
    ,
) КАК ХозрасчетныйОстатки

Что это дает? Поместив параметр в фигурные скобки внутри конструктора виртуальной таблицы, мы «связываем» внутренний механизм периода таблицы с конкретным параметром &НачалоПериода. В этом случае СКД понимает, что за управление временем отвечает именно этот объект, и перестает генерировать автоматический параметр &Период.

Решение №2: Настройка на закладке «Компоновка данных» в конструкторе запроса

Малоизвестный, но эффективный способ — использование специализированной вкладки в конструкторе запроса. Рассмотрим пошагово, как это сделать:

  1. Откроем конструктор запроса в наборе данных СКД.
  2. Перейдем на самую последнюю закладку — «Компоновка данных».
  3. В этой закладке найдем подпункт «Параметры виртуальных таблиц».
  4. Выберем нашу таблицу Остатки.
  5. В поле «Период» выберем из выпадающего списка или впишем вручную наш параметр &НачалоПериода.

После этих действий конструктор сам добавит необходимые инструкции в текст запроса (те самые фигурные скобки), и конфликт параметров будет исчерпан. Система будет четко знать, что &НачалоПериода — это и есть дата получения остатков.

Решение №3: Отключение автозаполнения

Если ваш запрос сложный и СКД ведет себя непредсказуемо, мы можем полностью взять управление в свои руки, сняв флаг «Автозаполнение» (находится под текстом запроса в наборе данных).

Проанализируем последствия: после снятия этого флага СКД перестанет автоматически выводить поля в выборку и создавать параметры. Вам придется:

Этот метод радикален, но он гарантирует, что в отчете не появится ни одного «лишнего» элемента, который вы не добавили бы сами.

Важный нюанс: Тип данных «Граница» вместо вычитания секунды

В исходном вопросе автор использовал конструкцию ДОБАВИТЬКДАТЕ(&НачалоПериода, СЕКУНДА, -1). С точки зрения производительности и корректности работы с остатками в 1С, это не самый оптимальный подход. Рассмотрим, почему лучше использовать объект Граница.

Когда мы передаем просто дату, система может не включить обороты последней секунды этой даты (в зависимости от того, как настроен регистр). Чтобы получить остатки включая все движения на указанный момент времени, правильно использовать объект Граница с видом ВидГраницы.Включая.

В СКД это реализуется без изменения текста запроса, прямо на закладке «Параметры». Выясним, как это настроить:

  1. Оставим в запросе чистый параметр &НачалоПериода без всяких ДОБАВИТЬКДАТЕ.
  2. На закладке «Параметры» в колонке «Выражение» для этого параметра напишем:

НОВЫЙ Граница(&НачалоПериода, ВидГраницы.Включая)

Это позволит получать остатки максимально точно, а сам текст запроса останется чистым и понятным. Кроме того, это исключит ошибки, связанные с часовыми поясами или спецификой СУБД при расчете даты внутри запроса.

Как скрыть ненужный параметр из интерфейса?

Если по каким-то причинам параметр &Период всё же остался в списке, но вы не хотите его удалять (например, он используется в других частях схемы), мы можем просто скрыть его от пользователя. Рассмотрим способы управления видимостью:

Флаг «Ограничение доступности»: На закладке «Параметры» установите галочку в колонке «Ограничение доступности». Это скроет параметр из настроек отчета, но он останется доступным для использования в выражениях внутри системы.

Однако помните, что в некоторых самописных подсистемах или старых версиях БСП (Библиотеки стандартных подсистем) программный вывод параметров может игнорировать этот флаг. В таких случаях единственным надежным решением остается Решение №1 (фигурные скобки).

Итоги

Мы проанализировали проблему возникновения загадочного параметра &Период и нашли несколько способов борьбы с ним. Подведем итог нашим действиям:

  1. Используйте фигурные скобки {&НашПараметр} в настройках виртуальных таблиц для явного указания связи.
  2. Пользуйтесь закладкой «Компоновка данных» в конструкторе запроса для автоматической простановки этих скобок.
  3. Для получения точных остатков используйте выражение НОВЫЙ Граница(...) на вкладке параметров вместо арифметических операций с датами в тексте запроса.
  4. Не забывайте про флаг «Автозаполнение» — иногда его отключение является кратчайшим путем к чистому и понятному отчету.

Следуя этим правилам, вы сделаете свои отчеты более профессиональными, а интерфейс — понятным для конечного пользователя.

← На главную