Почему я не могу установить отбор по полю в СКД, хотя оно есть в запросе?

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

Работа с Системой Компоновки Данных (СКД) в 1С часто преподносит сюрпризы, особенно когда дело касается настройки отборов. Знакомая ситуация: вы написали запрос, добавили нужное поле в выборку, видите его в списке полей компоновки, но когда переходите на вкладку «Настройки» -> «Отбор», этого поля там попросту нет. Или же в наборе данных вы видите галочку «Не доступно как условие», которую невозможно снять.

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

Причина 1: Ручное редактирование расширения языка запросов

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

Рассмотрим механизм работы СКД. Когда мы пишем запрос, система анализирует его текст. Если вы добавляете поля в секцию ВЫБРАТЬ с помощью конструкции расширения языка (в фигурных скобках), но не указываете, как накладывать условия на эти поля, система может исключить их из списка доступных отборов.

Если вы пишете запрос руками, конструкция должна выглядеть следующим образом, чтобы поле стало доступным для отбора:


ВЫБРАТЬ
    Товары.Ссылка КАК Товар
{ВЫБРАТЬ
    Товары.Артикул,
    Товары.Код}
ИЗ
    Справочник.Номенклатура КАК Товары
{ГДЕ
    Товары.Ссылка.*,
    Товары.Артикул,
    Товары.Код}

Обратите внимание на секцию {ГДЕ ...}. Именно здесь мы сообщаем компоновщику, какие поля могут участвовать в отборах, накладываемых пользователем или настройками отчета. Если поле добавлено только в {ВЫБРАТЬ ...}, но отсутствует в {ГДЕ ...}, отбор по нему может не работать.

Решение: Самый надежный способ избежать синтаксических ошибок — использовать Конструктор запроса. В конструкторе перейдите на закладку «Компоновка данных». Там есть вкладки «Поля» (для секции ВЫБРАТЬ) и «Условия» (для секции ГДЕ). Добавление полей через этот интерфейс гарантирует, что 1С сформирует правильный синтаксис с фигурными скобками.

Причина 2: Ограничения виртуальных таблиц (Галочка "Не доступно как условие")

Если вы видите в наборе данных на поле галочку «Не доступно как условие» (серая, неактивная), это часто связано с использованием ресурсов виртуальных таблиц.

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

Технически невозможно наложить параметр виртуальной таблицы на ресурс. Запрос вида:


ВЫБРАТЬ ... ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки( , КоличествоОстаток > 0)

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

Решение:

  1. Если вам нужно отфильтровать результат (например, не выводить нулевые остатки), делайте это не в параметрах виртуальной таблицы, а в секции ГДЕ основного запроса или, что правильнее для СКД, — в настройках отчета на вкладке «Отбор».
  2. Если поле заблокировано для отбора, убедитесь, что вы не пытаетесь использовать его внутри фигурных скобок, относящихся к параметрам виртуальной таблицы.

Причина 3: Поля неограниченной длины

СКД и СУБД (например, MS SQL) имеют ограничения на использование полей типа Строка неограниченной длины (Memo-поля, текстовые описания, комментарии) в условиях фильтрации.

Если поле в базе данных имеет тип «Строка неограниченной длины», платформа автоматически устанавливает ему признак «Не доступно как условие», так как индексирование и сравнение таких полей крайне неэффективно.

Решение: Необходимо в запросе ограничить длину строки с помощью функции ПОДСТРОКА. Рассмотрим пример:


ВЫБРАТЬ
    ПОДСТРОКА(Документ.Комментарий, 1, 1000) КАК КомментарийДляОтбора
ИЗ
    Документ.РеализацияТоваровУслуг КАК Документ

После использования функции ПОДСТРОКА поле получает фиксированный тип (например, Строка(1000)) и становится доступным для отбора в настройках СКД.

Причина 4: Влияние Функциональных опций

Иногда проблема кроется не в коде запроса, а в настройках конфигурации. Механизм Функциональных опций позволяет скрывать элементы интерфейса и реквизиты объектов, если определенная функциональность отключена в базе.

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

Пример: Вы пытаетесь сделать отбор по полю Организация, но в базе отключена опция «Вести учет по нескольким организациям». В этом случае поле может быть скрыто.

Решение: Проверьте, к каким функциональным опциям привязан реквизит в дереве метаданных, и включены ли эти опции в режиме Предприятия.

Причина 5: Права доступа (RLS)

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

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

Как гарантированно добавить поле в отборы через Конфигуратор?

Подведем итог и составим алгоритм действий, если поле упорно не появляется в отборах:

  1. Откройте схему компоновки данных.
  2. Перейдите на вкладку Наборы данных.
  3. Найдите нужное поле в списке полей.
  4. Проверьте колонку Ограничение доступности. Убедитесь, что галочка «Условие» снята. Если она стоит и неактивна — см. пункты про виртуальные таблицы и строки неограниченной длины выше.
  5. Если вы используете расширение языка запросов, откройте Конструктор запроса -> вкладка Компоновка данных -> вкладка Условия. Убедитесь, что ваше поле добавлено в список.
  6. На вкладке Настройки в конфигураторе, в нижнем окне, перейдите на вкладку Отбор. Попробуйте найти поле в левом списке доступных полей. Если поле вложенное (например, Номенклатура.ВидНоменклатуры), раскройте «плюсик» у родительского поля.

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

← На главную