Как в СКД передать значение Неопределено в параметр и почему пропадают поля в отчете

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

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

Реализация логики Да/Нет/Все через расширение языка запросов СКД

Рассмотрим наиболее элегантный и правильный с точки зрения платформы 1С способ решения задачи. Вместо того чтобы пытаться «засунуть» значение Неопределено в булевский параметр, мы воспользуемся механизмом расширения языка запросов СКД. Этот метод позволяет сделать условие в блоке ГДЕ необязательным.

Проанализируем ситуацию: если пользователь хочет видеть все записи, условие по наличию счета-фактуры просто не должно попадать в итоговый SQL-запрос. Для этого в тексте запроса мы используем фигурные скобки:


ВЫБРАТЬ
    ПриобретениеТоваровУслуг.Ссылка КАК Основание,
    СчетФактураПолученный.Ссылка КАК СчетФактура
ИЗ
    Документ.ПриобретениеТоваровУслуг КАК ПриобретениеТоваровУслуг
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный КАК СчетФактураПолученный
    ПО ПриобретениеТоваровУслуг.Ссылка = СчетФактураПолученный.ДокументОснование
{ГДЕ
    (НЕ СчетФактураПолученный.Ссылка ЕСТЬ NULL) КАК НаличиеСчетаФактуры}

В данном примере мы объявили виртуальное поле НаличиеСчетаФактуры. Рассмотрим, как это работает в настройках СКД:

  1. На вкладке Параметры у параметра НаличиеСчетаФактуры установите тип Булево.
  2. В пользовательских настройках пользователь увидит флажок использования параметра.
  3. Если флажок снят — СКД полностью вырезает условие из запроса, что соответствует значению Все.
  4. Если флажок установлен — СКД применяет фильтр в зависимости от выбранного значения (Истина или Ложь).

Использование списка доступных значений (Триггерный метод)

Иногда требуется, чтобы пользователь выбирал значение из выпадающего списка (например: «Есть СФ», «Нет СФ», «Не важно»), не используя флажок активности параметра. В этом случае мы можем изменить тип параметра на Число или Строка и вручную ограничить список выбора.

Разберем вариант с типом Число (длина 1):

  1. Переходим на вкладку Параметры.
  2. Для параметра НаличиеСчетаФактуры указываем список доступных значений:
    • 0 — значение «Отсутствует»;
    • 1 — значение «В наличии»;
    • 2 — значение «Все документы».
  3. В тексте запроса прописываем логику обработки этих чисел:

ГДЕ
    ВЫБОР
        КОГДА &НаличиеСчетаФактуры = 2 ТОГДА ИСТИНА
        КОГДА &НаличиеСчетаФактуры = 1 ТОГДА НЕ СчетФактураПолученный.Ссылка ЕСТЬ NULL
        ИНАЧЕ СчетФактураПолученный.Ссылка ЕСТЬ NULL
    КОНЕЦ

Такой подход исключает путаницу с типами данных и позволяет пользователю интуитивно понятно управлять фильтрацией. Вы также можете использовать тип Строка, прописав в доступных значениях строковые литералы, что сделает настройку еще более наглядной в конфигураторе.

Почему в отчете СКД пропадают выбранные поля

Выясним причину другой распространенной проблемы, когда поле (например, Контрагент) присутствует в запросе, но не отображается в результате. Проанализируем типичные ошибки настройки.

1. Оптимизация компоновщика. СКД — это интеллектуальный механизм. Если поле Контрагент выбрано в запросе, но не добавлено в список Выбранные поля в настройках варианта отчета, и при этом оно не участвует в группировках или условном оформлении, СКД просто исключит его из исполнения запроса для экономии ресурсов. Проверьте, добавлено ли поле в финальные настройки отчета.

2. Роли полей в наборе данных. Посмотрим на вкладку Набор данных. Если у поля Контрагент в колонке Роль автоматически проставилось значение «Имя измерения», СКД будет ожидать, что данные группируются именно по этому полю. Если в настройках отчета вы группируете данные по другому полю, а контрагента пытаетесь вывести как детальную запись, может возникнуть конфликт отображения. Попробуйте очистить роль поля или настроить ее вручную.

3. Использование временных таблиц. Если вы используете пакет запросов, как в примере ниже:


ВЫБРАТЬ
    Приобретение.Контрагент КАК Контрагент,
    Приобретение.Ссылка КАК Основание
ПОМЕСТИТЬ ВтДанные
ИЗ
    Документ.ПриобретениеТоваровУслуг КАК Приобретение;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВтДанные.Контрагент КАК Контрагент,
    ВтДанные.Основание КАК ДокументОснование
ИЗ
    ВтДанные КАК ВтДанные

Проверьте, включен ли флаг Автозаполнение в схеме компоновки. Если он выключен, вам необходимо вручную добавить поля на вкладке Наборы данных. Также убедитесь, что псевдонимы полей во всех частях пакета запросов совпадают и не перекрываются системными именами.

4. Функциональные опции. Проанализируем влияние метаданных. Если в конфигурации поле Контрагент связано с функциональной опцией, которая в данный момент выключена, СКД автоматически скроет это поле из отчета, даже если оно есть в запросе. Это системное поведение платформы 1С для обеспечения прав доступа и логики интерфейса.

Рекомендации по отладке

Для решения сложных проблем с выводом данных рекомендуем использовать Консоль системы компоновки данных. Она позволяет увидеть не только итоговый SQL-запрос, который отправляется к СУБД, но и промежуточную таблицу, которую формирует СКД после обработки всех ролей и параметров. Если в консоли запросов поле Контрагент заполняется, а в отчете СКД — нет, значит, причина кроется именно в настройках размещения полей или ролях набора данных.

Всегда проверяйте настройку Обязательное на вкладке полей набора данных. Если поле помечено как обязательное, оно будет включаться в запрос всегда, независимо от настроек пользователя, что иногда помогает «принудительно» вывести данные для диагностики.

← На главную