В современной платформе 1С:Предприятие 8 механизм Системы Компоновки Данных (СКД) является фундаментом для построения гибких и мощных отчетов. Одной из самых востребованных и одновременно сложных задач для разработчиков является организация фильтрации данных на основе произвольных списков. Часто возникает ситуация, когда пользователю необходимо отобрать записи не по одному значению, а по целому набору реквизитов или справочников, сформированному динамически.
Решением этой задачи служит использование Таблицы Значений в качестве типа данных для параметров схемы компоновки. Это позволяет передавать в отчет сложные структуры, содержащие несколько колонок и строк, которые затем могут быть использованы в запросе как полноценный временный набор данных. Такой подход открывает двери для реализации аналитики любой глубины, где критерии отбора формируются программно или через интерфейс пользователя.
В этой статье мы детально разберем процесс настройки схемы, создания параметров и написания запроса, который корректно обрабатывает переданную таблицу. Вы узнаете о нюансах типов данных, способах соединения таблиц и типичных ошибках, возникающих при работе со сложными параметрами в среде 1С.
Концепция параметров в Системе Компоновки Данных
Параметры в СКД — это переменные, значения которых подставляются в текст запроса перед его выполнением. Стандартные типы, такие как Число, Строка или Дата, знакомы каждому разработчику. Однако, когда речь заходит о передаче списка объектов со структурой, стандартные типы становятся недостаточными. Здесь на сцену выходит тип Таблица Значений.
Использование таблицы в качестве параметра позволяет реализовать логику "список в списке". Например, если вам нужно отфильтровать продажи не просто по конкретному магазину, а по комбинации "Магазин + Группа товаров", обычная строка или список значений не справятся. Вам нужна структура, где каждая строка параметра содержит оба этих реквизита.
Важно понимать, что при выполнении запроса система подставляет содержимое этой таблицы в специальный синтаксический блок. Это не просто массив строк, а виртуальная таблица, к которой можно обращаться по имени параметра. Для платформы 1С это означает, что вы можете делать JOIN или использовать оператор В с составными условиями, опираясь на колонки переданной таблицы.
⚠️ Внимание: Тип данных параметра должен строго соответствовать структуре, которую вы планируете передавать. Если в коде вы формируете таблицу с колонкой "Сумма" типа Число, а в схеме параметр настроен как Строка, выполнение отчета завершится ошибкой типов.
При разработке сложных отчетов всегда проверяйте имена колонок в Таблице Значений на наличие пробелов и спецсимволов. Лучше использовать имена латиницей или в формате "Колонка1", чтобы избежать проблем с парсингом запроса.
Настройка схемы компоновки данных
Первым шагом для реализации функционала является правильная настройка самой схемы отчета. В конструкторе СКД необходимо перейти на вкладку "Параметры" и создать новую переменную. Ключевым моментом здесь является выбор типа. В списке доступных типов следует найти и выбрать Таблица значений.
После выбора типа становится активным конструктор структуры таблицы. Здесь вы должны явно описать колонки, которые будут присутствовать в передаваемом наборе данных. Например, если вы фильтруете номенклатуру, вам могут понадобиться колонки "Номенклатура" (тип СправочникСсылка.Номенклатура) и "Характеристика" (тип СправочникСсылка.ХарактеристикиНоменклатуры).
Каждой колонке можно задать синоним, который будет отображаться в пользовательском интерфейсе при настройке отчета, но во внутреннем запросе важно использовать именно имя колонки, указанное в структуре. Не забудьте установить признак "Ведущая" для тех колонок, которые являются ключевыми для связи с основными данными отчета.
☑️ Настройка параметра Таблица Значений
Особое внимание стоит уделить настройке видимости параметра. Если таблица значений формируется скрыто в коде модуля отчета, параметр можно сделать недоступным для пользователя. Если же пользователь должен сам заполнять этот список через форму настройки, необходимо включить опцию отображения и, при необходимости, задать форму ввода.
Формирование данных в коде модуля
После настройки схемы необходимо реализовать логику заполнения параметра перед выводом отчета. Это делается в модуле объекта отчета, обычно в обработчике события ПриКомпоновкеРезультата или в методе, формирующем настройки. Вам потребуется создать объект типа ТаблицаЗначений программно.
Сначала создается сама таблица и добавляются колонки с теми же именами и типами, что и в схеме компоновки. Затем данные заполняются циклом или выбираются из другого запроса. Критически важно, чтобы порядок и типы колонок совпадали один в один с описанием в СКД.
ПараметрыКомпоновки = Новые ПараметрыКомпоновкиДанных;
ТаблицаПараметр = Новый ТаблицаЗначений;
ТаблицаПараметр.Колонки.Добавить("Номенклатура", ТипЗнч(СправочникСсылка.Номенклатура));
ТаблицаПараметр.Колонки.Добавить("Склад", ТипЗнч(СправочникСсылка.Склады));
// Заполнение данными
Строка = ТаблицаПараметр.Добавить();
Строка.Номенклатура = СсылкаНаТовар;
Строка.Склад = СсылкаНаСклад;
ПараметрыКомпоновки.ЗначенияПараметров.Установить(
ПараметрыКомпоновки.ЗначенияПараметров.Параметр("МояТаблица"),
ТаблицаПараметр
);
НастройкиКомпоновки.ПараметрыДанных = ПараметрыКомпоновки;
Если вы передаете пустую таблицу, убедитесь, что она инициализирована, даже если в ней нет строк. Пустая таблица значений с правильной структурой — это валидный параметр, который просто не даст ни одной строки в результате выборки при использовании внутреннего соединения.
Что делать, если типы не совпадают?
Если при выполнении возникает ошибка приведения типа, проверьте, не используется ли в схеме тип "Произвольный". Для Таблицы Значений лучше явно указывать конкретные типы колонок, а не использовать универсальные типы, если это возможно.
Написание запроса с использованием параметра
Самая интересная часть работы происходит в тексте запроса на вкладке "Запрос" конструктора СКД. Здесь параметр-таблица выступает в роли обычного источника данных. Вы можете выбрать его в списке доступных таблиц, и он будет отображаться под тем именем, которое вы дали параметру.
Для фильтрации основных данных по значениям из параметра чаще всего используется оператор В или соединение LEFT JOIN / INNER JOIN. Если вам нужно отобрать записи, где комбинация полей совпадает с комбинацией в параметре, удобно использовать составное условие.
Рассмотрим пример, где мы выбираем регистр накопления и соединяем его с нашей таблицей параметров. Это позволяет получить только те движения, которые соответствуют переданному списку номенклатуры и складов.
| Элемент запроса | Описание действия | Пример синтаксиса |
|---|---|---|
| Выборка | Выбор полей из основной таблицы | ВЫБРАТЬ Регистр.Номенклатура |
| Соединение | Связь с параметром по ключу | ЛЕВОЕ СОЕДИНЕНИЕ &МояТаблица КАК Параметры |
| Условие | Сравнение колонок | ГДЕ Регистр.Номенклатура = Параметры.Номенклатура |
При использовании соединения обратите внимание на тип соединения. ВНУТРЕННЕЕ СОЕДИНЕНИЕ оставит только те записи основного набора, которые есть в параметре. ЛЕВОЕ СОЕДИНЕНИЕ оставит все записи основного набора, а из параметра подтянутся данные там, где есть совпадение, или NULL там, где совпадения нет.
Использование JOIN с таблицей-параметром часто производительнее, чем оператор "В" с составными условиями, особенно на больших объемах данных, так как оптимизатор запросов 1С может построить более эффективный план выполнения.
Работа со списками и множественными колонками
Одной из главных причин использования Таблицы Значений является возможность фильтрации по нескольким измерениям одновременно. Представьте задачу: показать остатки только по тем товарам, которые есть в конкретном прайс-листе поставщика, где важны и артикул, и бренд.
В этом случае в структуру параметра включаются обе колонки. В запросе условие будет выглядеть как проверка вхождения кортежа значений. Однако, в языке запросов 1С нет прямого синтаксиса для проверки вхождения кортежа в таблицу значений через оператор В так, как это делается в SQL. Поэтому надежнее всего использовать соединение.
- 🔍 Используйте
ВНУТРЕННЕЕ СОЕДИНЕНИЕ, если нужно строго отфильтровать данные по списку. - 📊 Используйте
ЛЕВОЕ СОЕДИНЕНИЕ, если нужно пометить данные флагом присутствия в списке, но не удалять остальные. - ⚙️ Убедитесь, что на соединяемых полях в основных таблицах есть индексы для ускорения работы.
Также стоит помнить о возможности передачи иерархических списков. Если в таблицу значений попадает элемент справочника, а в запросе участвует его родитель, соединение не сработает автоматически. Вам потребуется либо передавать в таблицу все уровни иерархии, либо использовать функцию ЭтоГруппа() и специальные условия в тексте запроса.
⚠️ Внимание: При передаче больших таблиц значений (тысячи строк) производительность отчета может снизиться. В таких случаях рассмотрите возможность записи временной таблицы в регистр сведений или использования временных таблиц СУБД, если архитектура решения это позволяет.
Отладка и обработка ошибок
Разработка отчетов со сложными параметрами редко обходится без отладки. Самая распространенная ошибка — несоответствие структуры. Если вы добавили колонку в код, но забыли в схему (или наоборот), система выдаст сообщение о том, что поле не найдено или тип не приведен.
Для диагностики используйте журнал регистрации и окно отладки запросов. В конструкторе СКД есть кнопка "Отладка запроса", которая позволяет увидеть итоговый текст запроса после подстановки параметров. Это invaluable инструмент для понимания того, как именно ваша таблица значений встраивается в SQL-код.
Если отчет выполняется долго, проанализируйте план выполнения. Часто проблема кроется в отсутствии индексов по полям, участвующим в соединении с таблицей параметров. Также проверьте, не происходит ли неявное приведение типов, которое может отключить использование индексов.
Помните, что интерфейс платформы 1С и возможности СКД могут обновляться с выходом новых релизов. Всегда сверяйте синтаксис функций и доступные типы данных с официальной документацией к вашей версии платформы, особенно если вы работаете с облачными сервисами или новыми конфигурациями.
Часто задаваемые вопросы (FAQ)
Можно ли передать в параметр СКД таблицу, созданную запросом?
Да, конечно. Вы можете выполнить запрос, выгрузить его результат в объект ТаблицаЗначений и передать эту таблицу в параметр. Главное, чтобы структура результата запроса совпадала со структурой параметра в схеме компоновки.
Что делать, если нужно передать пустой список?
Создайте таблицу значений с нужной структурой, но не добавляйте в нее ни одной строки. Передача такой пустой таблицы допустима. При использовании ВНУТРЕННЕГО СОЕДИНЕНИЯ результат отчета будет пустым, что является логичным поведением.
Можно ли использовать Таблицу Значений для записей в результат?
Таблица значений как параметр используется преимущественно для входных данных (фильтрации). Для формирования результата (вывода данных) обычно используются виртуальные таблицы или основные таблицы базы данных. Однако, теоретически можно вывести и сам параметр, если добавить его в набор данных как источник.
Как передать таблицу значений из внешней обработки?
При запуске внешней обработки или отчета программно, вы формируете объект ПараметрыКомпоновкиДанных, устанавливаете значение параметра в нужную ТаблицуЗначений и передаете этот объект в метод СкомпоноватьРезультат.