Как правильно передать и настроить параметры в отчете на СКД: от кода до визуальных настроек

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

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

Разбор типичной проблемы: почему отчет пустой?

Рассмотрим ситуацию: разработчик создает отчет по регистру накопления, добавляет в запрос условие ГДЕ КассаОстаткиИОбороты.Валюта = &Валюта и пытается программно заполнить этот параметр в модуле объекта. Несмотря на то, что код выполняется, отчет выводит только шапку.

Проанализируем причины такого поведения. Чаще всего проблема кроется в одном из трех факторов:

  1. Отсутствие флага использования: Система 1С не считает параметр установленным, если у него не взведено свойство Использование в значение Истина.
  2. Несоответствие типов: В параметр передается не ссылка на справочник, а строка или объект другого типа.
  3. Конфликт настроек: Программные настройки в КомпоновщикНастроек.Настройки перекрываются ПользовательскимиНастройками, которые имеют приоритет при формировании отчета на управляемых формах.

Способ 1: Программная установка параметра в модуле объекта

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

Рассмотрим пример кода, который гарантированно установит значение параметра:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Получаем доступ к параметрам данных через компоновщик настроек
    ЭлементПараметраДанных = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Валюта"); 
    
    Если ЭлементПараметраДанных <> Неопределено Тогда
        // Устанавливаем само значение (предполагаем, что Валюта — это реквизит формы или объекта)
        ЭлементПараметраДанных.Значение = Валюта;
        
        // КРИТИЧЕСКИ ВАЖНО: включаем флаг использования
        ЭлементПараметраДанных.Использование = Истина;
    КонецЕсли;

КонецПроцедуры

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

Способ 2: Использование параметров виртуальных таблиц (Оптимизация)

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

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


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

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

Способ 3: Настройка "Быстрого доступа" без написания кода

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

Выполним следующие шаги в схеме компоновки данных:

  1. Перейдем на закладку Настройки.
  2. Выберем вложенную закладку Параметры (внизу).
  3. Найдем параметр Валюта.
  4. Нажмем на кнопку Свойства элемента пользовательских настроек (значок с синей шестеренкой или карандашом).
  5. Установим флажок Включать в пользовательские настройки.
  6. В поле Режим редактирования выберем Быстрый доступ.

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

Дополнительные советы для продвинутой работы

Проанализируем еще несколько сценариев, которые часто встречаются в реальной практике:

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

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


ГДЕ
    {КассаОстаткиИОбороты.Валюта = &Валюта}

Если параметр &Валюта не будет отмечен флагом использования, СКД просто проигнорирует это условие и выведет все данные.

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

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

← На главную