Как реализовать запуск отчета на СКД из формы документа и меню отчетов с гибкими параметрами?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

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

Способ 1. Программный вызов отчета из формы документа

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


&НаКлиенте
Процедура ОтчетПоДокументу(Команда)
    
    // Формируем структуру параметров для открытия формы отчета
    ПараметрыОтчета = Новый Структура;
    
    // 1. Указываем, что отчет должен сформироваться сразу при открытии
    ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Истина);
    
    // 2. Передаем отбор по конкретному документу. 
    // Имя поля "Док" должно совпадать с именем доступного поля в схеме СКД
    СтруктураОтбора = Новый Структура("Док", Объект.Ссылка);
    ПараметрыОтчета.Вставить("Отбор", СтруктураОтбора);
    
    // 3. Если в отчете создано несколько вариантов, можно указать нужный
    ПараметрыОтчета.Вставить("КлючВарианта", "Основной");
    
    // Открываем форму отчета с подготовленными параметрами
    ОткрытьФорму("Отчет.НашУниверсальныйОтчет.Форма", ПараметрыОтчета);
        
КонецПроцедуры

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

Способ 2. Решение проблемы обязательных параметров в запросе СКД

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

Использование фигурных скобок {} позволяет превратить обычное условие в «элемент расширения». Если параметр внутри скобок не будет заполнен пользователем, СКД просто проигнорирует это условие при генерации итогового SQL-запроса к базе данных. Разберем, как это выглядит в конструкторе запроса:


ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.Количество,
    Продажи.Сумма
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода
    {ГДЕ
    (Продажи.Контрагент = &Контрагент),
    (Продажи.Регистратор = &Док)}

В этом примере параметры &НачалоПериода и &КонецПериода остаются обязательными (они находятся вне скобок), а &Контрагент и &Док — опциональными. Если мы вызываем отчет из формы документа, заполнится &Док. Если из меню — пользователь выберет &Контрагент, и отчет отработает корректно в обоих случаях.

Способ 3. Настройка параметров виртуальных таблиц

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


ВЫБРАТЬ
    Партии.Номенклатура,
    Партии.СтоимостьОборот
ИЗ
    РегистрНакопления.ПартииТоваровОрганизаций.Обороты(
        {&НачалоПериода}, 
        {&КонецПериода}, 
        Авто, 
        {Организация = &Организация, Регистратор = &Док}) КАК Партии

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

Способ 4. Управление видимостью и доступностью через варианты

Чтобы интерфейс отчета не перегружал пользователя лишними полями, мы можем создать два варианта настроек внутри одной схемы СКД:

  1. Вариант "Общий": Включает в пользовательские настройки выбор периода и организации. Используется при открытии из панели отчетов.
  2. Вариант "По документу": Включает только группировки по номенклатуре, а отбор по регистратору скрыт или заблокирован. Этот вариант мы вызываем программно через КлючВарианта.

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

Рекомендации по оптимизации

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

Таким образом, комбинируя программное управление формой через структуру ПараметрыОтчета и использование расширения языка запросов СКД {}, мы получаем мощный и универсальный инструмент, удобный как для рядовых пользователей, так и для оперативной работы из документов.

← На главную