Почему в отборе СКД отображается не вся номенклатура и как это исправить

Программист IT и автоматизация бизнеса
← На главную

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

Проанализируем ситуацию

Представим стандартный запрос внешнего отчета, в котором данные собираются из нескольких табличных частей документа ПоступлениеТоваровУслуг. Обычно это таблицы Товары и Услуги, объединяемые с помощью оператора ОБЪЕДИНИТЬ ВСЕ. На первый взгляд, запрос выглядит корректно, однако при попытке установить отбор по полю Номенклатура система ведет себя странно: она предлагает выбрать только элементы определенного вида.

Посмотрим на пример структуры такого запроса:


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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ПТУ_Товары.Номенклатура,
    ПТУ_Товары.Количество
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПТУ_Товары

Выясним причину такого поведения платформы. В 1С:Предприятие 8 свойства поля (включая его тип и параметры выбора) определяются на основе метаданных источника. В типовых конфигурациях для табличной части Услуги на уровне метаданных часто установлен жесткий отбор: Отбор.Услуга = Истина. Когда СКД анализирует запрос с объединением, она берет описание поля из первого запроса в объединении. Если первым идет запрос к таблице услуг, все поле целиком помечается системой как «имеющее параметры выбора для услуг».

Решение 1: Добавление «эталонного» запроса в объединение

Это метод, к которому пришел автор темы после длительного поиска. Суть заключается в том, чтобы «обмануть» механизм определения метаданных, подставив в начало объединения таблицу, у которой нет предустановленных фильтров в метаданных. В данном случае — сам справочник Номенклатура.

Разберем, как это реализовать. Нам нужно добавить в начало объединения фиктивную выборку, которая определит тип поля для всей последующей цепочки UNION ALL:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ ВТ_Типизация
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    ЛОЖЬ // Мы не хотим выбирать реальные данные, нам нужна только структура

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ПТУ_Услуги.Номенклатура
ИЗ
    Документ.ПоступлениеТоваровУслуг.Услуги КАК ПТУ_Услуги
// ... и так далее

Важный момент: использование ГДЕ ЛОЖЬ позволяет системе прочитать метаданные поля, не выполняя реального сканирования справочника, что сохраняет производительность отчета.

Решение 2: Явное приведение типа в запросе

Если мы не хотим изменять структуру объединения, мы можем попробовать использовать функцию ВЫРАЗИТЬ. Это заставляет компоновщик рассматривать поле как общую ссылку на справочник, отрывая его от контекста конкретной табличной части документа.

Проанализируем пример изменения кода:


ВЫБРАТЬ
    ВЫРАЗИТЬ(ПТУ_Услуги.Номенклатура КАК Справочник.Номенклатура) КАК НаименованиеНоменклатуры,
    ПТУ_Услуги.Количество КАК Колво
ПОМЕСТИТЬ ВТ_Данные
// ... далее остальной запрос

Хотя этот метод помогает в ряде случаев «обобщить» тип данных, он не всегда эффективно сбрасывает параметры выбора (Choice Parameters), так как платформа все равно видит связь с исходным объектом метаданных.

Решение 3: Настройка параметров выбора в схеме СКД

Рассмотрим более «цивилизованный» способ управления списком выбора без изменения SQL-запроса. Перейдем на вкладку Наборы данных в конструкторе схемы компоновки.

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

Решение 4: Работа с кэшем метаданных

Как отметил один из участников обсуждения, иногда проблема кроется не в самом коде, а в кэшировании настроек формы выбора. Если вы уже запускали отчет и форма «запомнила» параметры выбора, она может продолжать открываться с фильтром даже после исправления запроса.

Выполним следующие шаги для диагностики:

Резюме

Ситуация с ограничением списка номенклатуры в СКД — это классический пример того, как платформа 1С пытается автоматизировать работу программиста, основываясь на метаданных, но иногда делает это избыточно. Наиболее надежным способом решения остается либо изменение порядка таблиц в UNION ALL (чтобы первой была таблица без фильтров), либо явное добавление «чистой» выборки из справочника в начало объединения. Это гарантирует, что поле НаименованиеНоменклатуры получит максимально широкий тип без ограничений, заложенных в табличных частях документов.

← На главную