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