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

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

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

Базовая настройка параметров в Конструкторе СКД

Первым шагом при создании отчета является определение структуры данных. В конструкторе запроса или непосредственно в схеме компоновки вы можете объявить Параметры. Это переменные, значения которых будут подставляться в запрос при его выполнении. Например, это может быть период отчета или конкретный контрагент.

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

После объявления параметра его нужно использовать в тексте запроса. В редакторе запроса параметр обозначается знаком & (амперсанд). Синтаксис выглядит следующим образом:

ВЫБРАТЬ

Номенклатура.Ссылка КАК Ссылка,

Номенклатура.Наименование КАК Наименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

Номенклатура.Родитель = &Родитель

Здесь &Родитель — это ссылка на параметр, который мы объявили ранее. При выполнении запроса платформа автоматически заменит этот маркер на значение, переданное из формы или модуля.

💡

Используйте понятные имена для параметров, например, «ПериодОтчета» вместо «Парам1». Это упростит отладку и поддержку кода в будущем.

Связь параметров с полями формы отчета

Само по себе объявление параметра в схеме не создает интерфейса для пользователя. Чтобы человек мог ввести данные, параметр нужно вывести на форму отчета. Это делается через панель «Параметры» в режиме Конфигуратора или через свойства формы в режиме Предприятия.

В свойствах формы найдите группу «Параметры». Здесь отображаются все параметры, определенные в используемой схеме компоновки. Вы можете перетащить нужный параметр на форму, создав соответствующее поле ввода. Важно настроить видимость и обязательность заполнения.

  • 📌 Убедитесь, что имя поля на форме совпадает с именем параметра в СКД.
  • 📌 Используйте предопределенные виды полей для дат и списков для улучшения UX.
  • 📌 Настройте tooltip (подсказку) для сложных параметров, чтобы пользователь понимал, что вводить.

Если параметр не отображается на форме, проверьте, включена ли опция «Включать в состав параметров» в настройках схемы компоновки. Иногда разработчики забывают экспортировать параметр из внутреннего набора данных в общий список.

📊 Какой способ ввода периода вы используете чаще?
Стандартный период (Месяц/Квартал)
Две даты (С.. По..)
Одна дата (На..)
Пользовательский интервал

Программная передача значений в модуле объекта

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

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

ПараметрыКомпоновкиДанных.Период.Значение = ТекущаяДата();

ПараметрыКомпоновкиДанных.Организация.Значение = ПараметрыСеанса.ОсновнаяОрганизация;

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

Также стоит учитывать типы данных. Попытка записать строку в параметр типа «Число» вызовет ошибку выполнения. Используйте явное преобразование типов, если источник данных не гарантирует соответствие.

☑️ Алгоритм программной установки параметров

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

Использование выражений и вычисляемых полей

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

Выражения объявляются в схеме компоновки и могут ссылаться на другие параметры. Например, можно создать параметр «ДатаНачала», а второй параметр «ДатаКонца» вычислять как «ДатаНачала + 30 дней». Это избавляет пользователя от ручного ввода второй даты.

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

⚠️ Внимание: Избегайте использования функций преобразования типов (например, Формат() или Строка()) непосредственно в условии ГДЕ запроса. Это приводит к полному сканированию таблиц вместо поиска по индексу.

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

Как работает оптимизация запросов с параметрами?

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

Работа с неопределенными значениями и отборами

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

В языке запросов 1С существует специальная конструкция для обработки таких случаев. Если параметр не заполнен, он принимает значение NULL (или Неопределено в терминах 1С). Простое сравнение Поле = &Параметр вернет ложь, если параметр пуст. Чтобы сделать параметр необязательным, используют конструкцию ИСТИНА:

ГДЕ

(&ПараметрКонтрагент ЕСТЬ NULL ИЛИ Номенклатура.Контрагент = &ПараметрКонтрагент)

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

Сценарий Значение параметра Результат в запросе Рекомендация
Параметр обязателен Не заполнен Ошибка или пустая выборка Установить свойство «Обязательное» на форме
Параметр необязателен Не заполнен (NULL) Выборка всех записей Использовать конструкцию ЕСТЬ NULL
Множественный выбор Список значений Попадание в список Использовать В (&Параметр)
Период Границы интервала Диапазон дат Использовать МЕЖДУ

При работе со списками значений (мультивыбор) тип параметра должен быть «СписокЗначений» или совместимый массив. В запросе это позволяет использовать оператор В, что значительно упрощает фильтрацию по нескольким элементам одновременно.

💡

Правильная обработка неуказанных параметров через конструкцию «ЕСТЬ NULL» делает отчет универсальным и удобным для пользователя, избавляя от необходимости заполнять все поля.

Отладка и анализ сформированных запросов

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

В режиме предприятия, при открытом отчете, можно включить отладку запросов. Для этого в меню «Все функции» или через панель администрирования включается протоколирование. Более простой способ — использовать консоль запросов или встроенную обработку «Технология сервиса».

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

⚠️ Внимание: Интерфейс и расположение настроек отладки могут отличаться в разных версиях платформы 1С (8.2, 8.3, 8.3.20+). Всегда сверяйтесь с актуальной документацией для вашей конкретной конфигурации, так как детали реализации могут меняться.

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

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

Как передать в СКД параметр, которого нет в схеме компоновки?

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

Почему параметр типа «Дата» принимает неверное значение?

Чаще всего проблема кроется в часовых поясах или формате строки при присваивании. Убедитесь, что вы присваиваете объекту типа Дата, а не строку. Если значение приходит из внешнего источника в виде строки, используйте функцию Дата() или ПолучитьДатуНачалаДня() для корректного преобразования.

Можно ли скрыть параметр от пользователя, но использовать в запросе?

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

Как организовать зависимые параметры (каскадные списки)?

Для этого используется механизм «Зависимости параметров» в схеме компоновки или программная обработка события ПриИзменении на форме. При изменении первого параметра (например, «ВидНоменклатуры») нужно программно очищать и формировать новый список выбора для второго параметра («Номенклатура»), фильтруя его по первому.