Как вывести параметры и отборы на форму внешнего отчета в 1С?

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

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

Способ 1: Использование пользовательских настроек (для управляемых форм)

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

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

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

Способ 2: Программная связь реквизитов формы с параметрами СКД

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

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


Процедура УстановитьПараметрыНаСервере()
    // Установка параметров Начало и Конец периода
    КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачДата);
    КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонДата);
    
    // Установка параметра Учреждение
    Если ЗначениеЗаполнено(УчреждениеНаФорме) Тогда
        КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Учреждение", УчреждениеНаФорме);
    КонецЕсли;
КонецПроцедуры

Важно помнить, что если вы используете Управляемое приложение, работа с компоновщиком должна происходить в контексте &НаСервере. Если же у вас Обычное приложение, код выполняется непосредственно в модуле формы.

Способ 3: Работа с типом СтандартныйПериод

В 1С очень удобно использовать тип данных СтандартныйПериод. Он позволяет пользователю выбирать не просто две даты, а интервалы (например, «Текущий месяц», «Прошлый квартал»). Посмотрим, как связать такой реквизит с СКД.

Сначала в самой схеме СКД создайте один параметр ПериодОтчета с типом СтандартныйПериод. Для стандартных параметров НачалоПериода и КонецПериода в поле Выражение укажите:

  1. Для начала: &ПериодОтчета.ДатаНачала
  2. Для конца: &ПериодОтчета.ДатаОкончания

Теперь на форме отчета достаточно иметь один реквизит типа СтандартныйПериод. Проанализируем код его установки:


ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ПериодОтчета");
Если ПараметрСКД <> Неопределено Тогда
    ПараметрСКД.Значение = ПериодСФормы; // ПериодСФормы имеет тип СтандартныйПериод
    ПараметрСКД.Использование = Истина;
КонецЕсли;

Анализ ошибки «Значение не является значением объектного типа (Использование)»

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

  1. Неверное имя: В методе Найти("Имя") указано имя, которого нет в параметрах СКД. Проверьте вкладку «Параметры» в схеме компоновки.
  2. Ограничение доступности: Если у параметра в СКД стоит галочка «Ограничение доступности», он может не попадать в коллекцию Настройки.ПараметрыДанных в определенных режимах работы.

Чтобы избежать падения системы, всегда делайте проверку на существование объекта, как показано в примере выше (Если Параметр <> Неопределено Тогда).

Программная работа с отборами (секция ГДЕ)

Если поле (например, Учреждение) не является параметром (не начинается с символа & в запросе), а добавлено через механизм {ГДЕ...}, то обращаться к нему нужно не через ПараметрыДанных, а через коллекцию Отбор. Рассмотрим, как программно добавить отбор по учреждению, если пользователь выбрал его на форме:


// Очистим старые отборы по этому полю, чтобы они не дублировались
ИмяПоля = "Учреждение";
Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
    Если Строка(ЭлементОтбора.ЛевоеЗначение) = ИмяПоля Тогда
        КомпоновщикНастроек.Настройки.Отбор.Элементы.Удалить(ЭлементОтбора);
    КонецЕсли;
КонецЦикла;

// Добавляем новый отбор
НовыйОтбор = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.ПравоеЗначение = УчреждениеСФормы;
НовыйОтбор.Использование = ЗначениеЗаполнено(УчреждениеСФормы);

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

Таким образом, мы рассмотрели основные способы выноса фильтров на форму. Выбор метода зависит от сложности интерфейса: для простых отчетов достаточно «Быстрых настроек», а для сложных интерактивных форм потребуется программная установка значений через КомпоновщикНастроек.

← На главную