При разработке отчетов на базе Системы компоновки данных (СКД) и программного создания СКД часто возникает задача ограничить выборку данных из регистров накопления только определенными типами документов. Поскольку поле Регистратор имеет составной тип данных, стандартный отбор не всегда интуитивно понятен. В этой статье мы разберем несколько проверенных способов решения этой задачи: от простого условия в запросе до продвинутой настройки параметров и вычисляемых полей. Для ознакомления со сложными сценариями формирования отчетов подойдут примеры программной работы с СКД.
Это самый быстрый и производительный метод, работу которого можно проверить в управляемой консоли запросов — для этого отлично подойдёт универсальная консоль запросов и компоновки данных. Оператор ССЫЛКА позволяет на уровне СУБД проверить тип документа, что работает значительно быстрее функции ТИПЗНАЧЕНИЯ. Рассмотрим ситуацию, когда нам нужны только документы "Списание товаров" и "Оприходование товаров".
Проанализируем пример кода в тексте запроса набора данных:
ВЫБРАТЬ
ПартииТоваров.Период,
ПартииТоваров.Регистратор,
ПартииТоваров.Номенклатура,
ПартииТоваров.Количество
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваров
ГДЕ
(ПартииТоваров.Регистратор ССЫЛКА Документ.СписаниеТоваров
ИЛИ ПартииТоваров.Регистратор ССЫЛКА Документ.ОприходованиеТоваров)
Этот метод жестко ограничивает данные, существенно ускоряя процесс отладки данных. Если же вы хотите предоставить пользователю выбор типа документа, перейдем к следующему способу.
Рассмотрим ситуацию, когда пользователю нужно выбирать: видеть только списания, только оприходования или оба типа сразу. Для этого создадим числовой параметр &ТипДокументов и пропишем логику в запросе.
Разберем, как реализовать условие с помощью конструкции ВЫБОР:
ГДЕ ВЫБОР
КОГДА &ТипДокументов В (0, 1) И Регистратор ССЫЛКА Документ.СписаниеТоваров ТОГДА ИСТИНА
КОГДА &ТипДокументов В (0, 2) И Регистратор ССЫЛКА Документ.ОприходованиеТоваров ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
Для корректной работы этого механизма выполним следующие шаги в конструкторе СКД:
ТипДокументов укажем тип данных "Число".Если вы хотите, чтобы пользователь мог использовать стандартный механизм отборов СКД, но при этом видел названия типов документов, можно вынести тип регистратора в отдельное поле запроса. Посмотрим, как это выглядит:
ВЫБРАТЬ
ПартииТоваров.Регистратор,
ТИПЗНАЧЕНИЯ(ПартииТоваров.Регистратор) КАК ТипДокумента,
ПартииТоваров.Количество
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваров
Теперь в схеме компоновки появится поле ТипДокумента. Пользователь сможет просто добавить его в отбор и выбрать нужное значение из списка типов.
Если изменять запрос нежелательно (например, используется типовой отчет), мы можем воспользоваться механизмом вычисляемых полей непосредственно в СКД. Выясним, как это настроить:
ТипРегистратора.ТипЗначения(Регистратор).После этого поле станет доступным для группировок и отборов в настройках отчета.
Мало кто знает, что СКД позволяет фильтровать по типу даже без программирования. Разберем алгоритм действий в режиме "1С:Предприятие":
Регистратор.Часто при использовании параметров в условиях ГДЕ возникает ошибка: "глобальные элементы отбора обязательно должны использовать поля параметров данных...". Рассмотрим причины и способы исправления:
Эта ошибка чаще всего возникает, когда параметр добавлен в пользовательские настройки, но при этом в схеме компоновки на него наложено ограничение или он конфликтует с глобальными отборами. Чтобы исправить это, проанализируем настройки:
Проанализируем ситуацию с точки зрения нагрузки на базу данных. Когда мы используем Регистратор ССЫЛКА Документ.Имя, платформа 1С генерирует оптимальный SQL-запрос, проверяя внутренний идентификатор типа в таблице движений. При использовании ТИПЗНАЧЕНИЯ(Регистратор) системе может потребоваться дополнительное время на получение метаданных для каждой строки.
Рекомендация: Для высоконагруженных отчетов с миллионами записей всегда отдавайте предпочтение оператору ССЫЛКА в тексте запроса.