Разработка сложных аналитических отчетов в системе 1С:Предприятие часто требует гибкости в фильтрации данных. Стандартные механизмы отборов, основанные на одиночных значениях или диапазонах, не всегда покрывают потребности пользователей, которым необходимо выбрать произвольный список позиций для анализа. Именно в таких сценариях на помощь приходит механизм Таблицы значений, используемой в качестве параметра компоновки данных.

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

В данной статье мы подробно разберем процесс настройки параметра типа ТаблицаЗначений в схеме компоновки данных, рассмотрим нюансы обработки таких параметров на стороне сервера и клиентского приложения, а также затронем вопросы оптимизации производительности при работе с большими объемами передаваемых данных. Особое внимание будет уделено типизации колонок и правилам преобразования типов при формировании запроса.

Концепция табличного параметра в СКД

Параметр типа Таблица значений представляет собой структуру данных, состоящую из строк и колонок, где каждая колонка имеет строго определенный тип данных. В отличие от списка значений, который является плоским перечнем, таблица позволяет передавать структурированную информацию, например, связку "Номенклатура" и "Склад" одновременно. Это делает её незаменимой при построении отчетов с многомерной фильтрацией.

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

⚠️ Внимание: При изменении структуры таблицы значений в коде (добавление новой колонки) необходимо обязательно обновлять описание параметра в схеме компоновки данных, иначе отчет перестанет формироваться корректно.

Использование табличных параметров позволяет реализовать логику, аналогичную временным таблицам в SQL, но на уровне прикладного интерфейса 1С. Пользователь заполняет таблицу в форме отчета, а система передает этот набор данных внутрь запроса СКД для дальнейшей обработки и соединения с основными регистрами.

📊 Как вы чаще всего используете табличные параметры?
Для выборки по списку номенклатуры
Для передачи плановых показателей
Для фильтрации по нескольким организациям
Не использую, предпочитаю обычные отборы

Настройка параметра в схеме компоновки данных

Процесс настройки начинается в редакторе схемы компоновки данных. В окне параметров необходимо создать новый элемент и выбрать тип ТаблицаЗначений. Ключевым этапом здесь является описание структуры таблицы, которое выполняется через кнопку "Ещё" -> "Изменить состав полей". Здесь разработчик задает имена колонок и их типы данных, например, Ссылка типа СправочникСсылка.Номенклатура или Число типа Число.

Особое внимание следует уделить свойствам полей таблицы. Для каждой колонки можно задать допустимые значения, использование предопределенных элементов или ограничить ввод только существующими объектами базы данных. Это обеспечивает целостность данных еще на этапе ввода пользователем. Типизация должна быть максимально точной, чтобы избежать неявных преобразований, которые могут замедлить выполнение запроса.

  • 📂 Имя параметра должно быть понятным и отражать суть передаваемых данных, например, СписокНоменклатуры.
  • 🏷️ Заголовки колонок таблицы настраиваются отдельно для удобства восприятия пользователем в форме отчета.
  • 🔒 Можно запретить пользователю добавлять или удалять строки, если структура данных должна быть жестко фиксированной.

После описания структуры параметр становится доступен для использования в запросах схемы компоновки. В тексте запроса он будет выступать как виртуальная таблица, к которой можно обращаться по имени параметра. Это позволяет строить сложные условия соединения (JOIN) или использовать конструкцию В.. для фильтрации основных наборов данных.

💡

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

Использование в запросе и условия отбора

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

Другой распространенный сценарий — это соединение (JOIN) основной таблицы с параметром. Это необходимо, когда вместе с отбором нужно передать дополнительные атрибуты. Например, если пользователь хочет увидеть плановые значения рядом с фактическими, он может загрузить в табличный параметр таблицу с планом, а затем соединить её с фактическими данными по ключу номенклатуры. Левое соединение в данном случае гарантирует, что все строки из параметра будут учтены в отчете.

ВЫБРАТЬ

Факт.Номенклатура,

Факт.Количество КАК ФактКоличество,

План.ПлановоеКоличество

ИЗ

РегистрНакопления.Продажи.Обороты(,,,) КАК Факт

ЛЕВОЕ СОЕДИНЕНИЕ Параметр.ПлановыеПоказатели КАК План

ПО Факт.Номенклатура = План.Номенклатура

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

☑️ Проверка настройки запроса

Выполнено: 0 / 4

Программная передача данных из кода 1С

Часто возникает задача сформировать отчет программно, например, по расписанию или из другой обработки, без участия пользователя в заполнении формы. В этом случае разработчик должен самостоятельно создать объект ТаблицаЗначений, заполнить его данными и передать в параметры компоновки. Это делается через объект ПараметрыКомпоновкиДанных.

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

  • 🖥️ Используйте метод Параметры.Установить() для передачи значения параметра перед выполнением отчета.
  • 🔄 При программном вызове убедитесь, что режим совместимости позволяет работу с новыми типами данных СКД.
  • ⚡ Заполнение большой таблицы значений лучше выполнять в цикле с предварительным отключением обновления экрана для ускорения работы.

Пример кода демонстрирует типовой сценарий подготовки данных. Сначала создается пустая таблица, затем ей добавляются колонки, после чего в цикле добавляются строки.

⚠️ Внимание: Если вы передаете табличный параметр в фоновом задании, убедитесь, что объект таблицы значений корректно сериализуется и не содержит ссылок на объекты, недоступные в фоновом режиме.

Пример кода создания параметра

ТабЗнач = Новый ТаблицаЗначений;

ТабЗнач.Колонки.Добавить("Номенклатура", ОписаниеТипов.СоздатьТип("СправочникСсылка.Номенклатура"));

НоваяСтрока = ТабЗнач.Добавить();

НоваяСтрока.Номенклатура = СсылкаНаНоменклатуру;

ПараметрыКомпоновки = Новый ПараметрыКомпоновкиДанных;

ПараметрыКомпоновки.Установить("СписокНоменклатуры", ТабЗнач);

Отображение и ввод данных в форме отчета

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

Для удобства пользователя рекомендуется настроить автоматический подбор значений в колонках таблицы. Это реализуется через настройку "Использовать быструю выборку" или задание списка допустимых значений в описании типа колонки. Также полезно настроить отборы внутри самой таблицы параметров, чтобы пользователь не мог ввести некорректные данные, например, выбрать номенклатуру, которая уже есть в списке.

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

💡

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

Оптимизация и производительность

Работа с табличными параметрами может существенно влиять на производительность отчета, особенно если передаваемый список содержит тысячи строк. Механизм СКД преобразует таблицу значений во временный набор данных, который затем участвует в выполнении основного запроса к базе данных. При большом объеме данных это может привести к замедлению работы СУБД.

Для оптимизации следует избегать передачи избыточных данных. Если для работы отчета нужна только ссылка на объект, не передавайте дополнительные реквизиты в таблице параметра. Также эффективно использование индексации: если таблица значений участвует в соединении по ключевому полю, убедитесь, что это поле типизировано корректно, чтобы движок 1С мог построить оптимальный план выполнения запроса.

Сценарий использования Рекомендация по оптимизации Потенциальный риск
Фильтрация по списку (В) Передавать только ключевые поля (Ссылка/Код) Замедление при списке > 5000 элементов
Соединение (JOIN) Убедиться в совпадении типов соединяемых полей Некорректный план запроса СУБД
План-фактный анализ Использовать временные таблицы на стороне сервера Перерасход оперативной памяти
Многоколоночный фильтр Создавать составной индекс в запросе (если возможно) Сложность отладки запроса

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

⚠️ Внимание: Интерфейс и возможности работы с параметрами могут различаться в разных версиях платформы 1С и в веб-клиенте по сравнению с толстым клиентом. Всегда тестируйте отчет в том режиме, в котором он будет использоваться конечными пользователями.

Часто задаваемые вопросы (FAQ)

Можно ли сделать колонку в табличном параметре необязательной для заполнения?

Да, это возможно. В описании состава полей параметра для конкретной колонки можно не устанавливать флаг "Только заполнение". Однако в запросе необходимо предусмотреть обработку пустых значений (NULL), используя функцию ЕСТЬNULL(), чтобы отчет не выдавал ошибку при выполнении.

Почему отчет не видит данные, переданные в табличном параметре программно?

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

Как очистить табличный параметр в форме отчета кнопкой?

Стандартными средствами СКД кнопки "Очистить" для табличного параметра нет. Для реализации такой функции потребуется расширение конфигурации или внешняя обработка, которая получит доступ к форме отчета и программно очистит соответствующий элемент формы, являющийся таблицей значений.

Можно ли использовать табличный параметр для записи данных обратно в базу?

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

Влияет ли количество строк в табличном параметре на лицензирование 1С?

Нет, использование табличных параметров является стандартным функционалом платформы и не требует дополнительных лицензий. Однако чрезмерное использование больших таблиц может влиять на производительность сервера, что косвенно требует более мощного оборудования для поддержания скорости работы пользователей.