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