Передача параметров в отчеты 1С:Предприятие 8.3 — одна из самых востребованных задач среди разработчиков и аналитиков. Без этого невозможно создать гибкие отчеты, которые адаптируются под нужды пользователей: фильтрация по периодам, выбор организаций, динамические группировки. Однако даже опытные специалисты иногда сталкиваются с нюансами: параметры не передаются, отчет выдает пустые данные или игнорирует введенные значения.
В этой статье разберем три основных способа передачи параметров — от ручного ввода через форму до программного управления из кода. Особое внимание уделим типичным ошибкам (например, когда параметр передается, но не применяется в запросе) и покажем рабочие примеры для управляемых форм и обычных форм. Также вы узнаете, как передавать массивы значений, ссылки на справочники и даже динамические параметры, которые формируются на лету.
Материал будет полезен как начинающим разработчикам, так и тем, кто хочет систематизировать знания. Все примеры тестировались на актуальных релизах платформы 1С:Предприятие 8.3.22 и 8.3.23, но основные принципы работают и в более ранних версиях.
1. Передача параметров через форму отчета
Самый простой и наглядный способ — когда пользователь вводит параметры непосредственно в форме отчета. Этот метод подходит для большинства типовых задач, например, когда нужно фильтровать данные по периоду или организации.
Чтобы добавить параметр в форму отчета:
- Откройте отчет в режиме
Конфигуратор → Отчеты. - Перейдите на вкладку
Форма(для управляемых форм) илиФормы → ОсновнаяФорма(для обычных форм). - Добавьте новый реквизит формы с типом данных, соответствующим параметру (например,
Датадля периода илиСправочникСсылка.Организациидля выбора организации). - Настройте элемент управления (поле ввода, выпадающий список) и свяжите его с реквизитом.
Пример для управляемой формы:
&НаКлиенте
Процедура ПериодНачалоПриИзменении(Элемент)
Если ЗначениеЗаполнено(ПериодНачало) И ЗначениеЗаполнено(ПериодОкончание) Тогда
КнопкаСформировать.Доступность = Истина;
Иначе
КнопкаСформировать.Доступность = Ложь;
КонецЕсли;
КонецПроцедуры
Важно: если параметр должен быть обязательным, добавьте проверку перед формированием отчета. Например, так:
&НаКлиенте
Процедура КнопкаСформироватьНажатие(Кнопка)
Если НЕ ЗначениеЗаполнено(Организация) Тогда
ПоказатьПредупреждение("Не выбрана организация!");
Возврат;
КонецЕсли;
СформироватьОтчет();
КонецПроцедуры
Указан обязательный период
Выбрана организация (если требуется)
Параметры соответствуют типам данных в отчете
Форма не содержит ошибок валидации-->
2. Программная передача параметров из модуля
Когда параметры формируются автоматически (например, текущая дата или организация по умолчанию), удобнее передавать их программно. Это также полезно при интеграции отчетов с другими подсистемами 1С.
Основные методы:
- 📌 Через параметры функции
ПолучитьОтчет()— если отчет вызывается из другого модуля. - 🔄 Через свойство
Параметрыобъекта отчета — если отчет формируется в текущем модуле. - 🔗 Через
СтруктураПараметров— для передачи нескольких значений одновременно.
Пример программной передачи параметров в отчет ПродажиПоКонтрагентам:
Процедура СформироватьОтчетПоКонтрагенту(Контрагент)
Отчет = Отчеты.ПродажиПоКонтрагентам.Создать();
Параметры = Новый Структура();
Параметры.Вставить("Контрагент", Контрагент);
Параметры.Вставить("ДатаНачала", НачалоМесяца(ТекущаяДата()));
Параметры.Вставить("ДатаОкончания", КонецМесяца(ТекущаяДата()));
Отчет.Параметры = Параметры;
Отчет.Скомпоновать();
Отчет.Показать();
КонецПроцедуры
Обратите внимание: если параметр — это ссылка на справочник, передавайте именно ссылку, а не строку с наименованием. Например:
Параметры.Вставить("Организация", Справочники.Организации.НайтиПоНаименованию("ООО Ромашка"));
Если отчет используется в нескольких местах, вынесите логику формирования параметров в отдельную функцию. Это упростит поддержку кода.
3. Передача параметров через компоновщик настроек
Компоновщик настроек позволяет гибко управлять параметрами отчета, включая динамические значения и пользовательские настройки. Этот метод особенно удобен для сложных отчетов с большим количеством фильтров.
Чтобы добавить параметр в компоновщик:
- Откройте схему компоновки данных отчета (
Отчет → Схема компоновки данных). - Перейдите на вкладку
Параметры. - Добавьте новый параметр, укажите его имя, тип и значение по умолчанию.
- В запросе отчета используйте параметр через конструкцию
ГДЕ [Поле] = &Параметр.
Пример настройки параметра в схеме компоновки:
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
ДатаНачала |
Дата |
НачалоМесяца(ТекущаяДата()) |
Начальная дата периода отчета |
Организация |
СправочникСсылка.Организации |
Справочники.Организации.ПустаяСсылка() |
Фильтр по организации |
ТолькоАктивные |
Булево |
Истина |
Флаг для фильтрации активных записей |
В запросе компоновщика параметр используется так:
ВЫБРАТЬ
Продажи.Дата КАК Дата,
Продажи.Сумма КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Продажи
ГДЕ
Продажи.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
И Продажи.Организация = &Организация
Как передать массив значений в компоновщик?
Для передачи массива (например, списка организаций) используйте тип Массив в параметрах компоновщика.
В запросе применяйте конструкцию ГДЕ Поле В (&МассивПараметров).
Пример передачи из кода:
Параметры.Вставить("СписокОрганизаций", Новый Массив(Орг1, Орг2));4. Динамические параметры: формирование на лету
Иногда параметры отчета нужно формировать динамически — например, на основе текущего пользователя, прав доступа или данных из других систем. В таких случаях используется комбинация программного кода и компоновщика.
Пример: передача в отчет только тех организаций, которые доступны текущему пользователю:
Процедура СформироватьОтчетСДинамическимиПараметрами()
Отчет = Отчеты.Продажи.Создать();
// Получаем организации, доступные пользователю
ДоступныеОрганизации = ПолучитьДоступныеОрганизации(ТекущийПользователь());
// Передаем как параметр
Параметры = Новый Структура();
Параметры.Вставить("Организации", ДоступныеОрганизации);
Отчет.Параметры = Параметры;
Отчет.СкомпоноватьРезультат();
КонецПроцедуры
В схеме компоновки параметр Организации должен иметь тип Массив, а в запросе использоваться с оператором В:
ГДЕ Продажи.Организация В (&Организации)
Динамические параметры позволяют гибко адаптировать отчеты под права пользователей или бизнес-логику, но требуют дополнительной обработки ошибок (например, если массив пуст).
5. Типичные ошибки и их решения
Даже опытные разработчики сталкиваются с проблемами при передаче параметров. Разберем самые распространенные:
- ❌ Параметр не передается в отчет — проверьте, что имя параметра в коде совпадает с именем в схеме компоновки (регистр важен!).
- ❌ Отчет игнорирует параметр — убедитесь, что параметр используется в запросе компоновщика (например,
ГДЕ Поле = &Параметр). - ❌ Ошибка типов данных — если параметр имеет тип
СправочникСсылка, а передаете строку, возникнет исключение. ИспользуйтеСправочники.Имя.НайтиПоНаименованию(). - ❌ Пустой результат отчета — проверьте, что передаваемые значения существуют в базе (например, организация не помечена на удаление).
Пример ошибки и ее исправления:
⚠️ Внимание: Если вы передаете параметр типаДатакак строку (например,"01.01.2026"), компоновщик не сможет его корректно обработать. Всегда используйте функциюДата():Параметры.Вставить("ДатаНачала", Дата(2026, 1, 1));
Еще одна частая проблема — несоответствие имен параметров в коде и схеме компоновки. Например, в коде передаете Параметры.Вставить("ДатаС", ...), а в компоновщике параметр называется ДатаНачала. В этом случае параметр просто игнорируется.
ИмяПараметраДатаНачала = "ДатаНачала";
Затем применяйте эту константу и в коде, и в компоновщике.-->
6. Передача параметров в внешние отчеты
Если отчет подключен как внешний (файл .erf), передача параметров имеет нюансы. В этом случае нельзя напрямую обращаться к реквизитам формы — нужно использовать ПараметрыВыполнения.
Пример для внешнего отчета:
Процедура ЗагрузитьВнешнийОтчет()
ПутьКФайлу = "C:\Отчеты\Продажи.erf";
ВнешнийОтчет = ВнешниеОтчеты.Создать(ПутьКФайлу);
Параметры = Новый Структура();
Параметры.Вставить("Период", ТекущаяДата());
ВнешнийОтчет.ПараметрыВыполнения = Параметры;
ВнешнийОтчет.Выполнить();
КонецПроцедуры
Важно: во внешнем отчете параметры должны быть объявлены в модуле объекта с атрибутом &Параметры:
&Параметры
Процедура Сформировать(Период) Экспорт
// Логика формирования отчета
КонецПроцедуры
⚠️ Внимание: При работе с внешними отчетами убедитесь, что версия платформы 1С, на которой создан отчет, совместима с текущей версией базы. В противном случае могут возникать ошибки при передаче параметров.
7. Оптимизация: как ускорить работу отчетов с параметрами
Передача параметров может замедлять формирование отчетов, особенно если используются сложные фильтры или большие массивы данных. Вот несколько способов оптимизации:
- ⚡ Индексируйте поля, по которым идет фильтрация (например,
ДатаилиОрганизация). - ⚡ Используйте серверные процедуры для предварительной обработки данных.
- ⚡ Ограничивайте период по умолчанию (например, текущий месяц вместо всего года).
- ⚡ Кэшируйте часто используемые параметры (например, список организаций пользователя).
Пример оптимизированного запроса с параметрами:
ВЫБРАТЬ ПЕРВЫЕ 1000
Продажи.Дата КАК Дата,
Продажи.Сумма КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Продажи
ГДЕ
Продажи.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
И Продажи.Организация = &Организация
УПОРЯДОЧИТЬ ПО
Дата
ИТОГИ
СУММА(Сумма)
ПО
Дата
Критическая ошибка: если в отчете используется параметр типа "Массив" без ограничения размера, это может привести к переполнению памяти при передаче больших данных (например, списка из 10 000 элементов). Всегда ограничивайте размер массивов или используйте постраничную обработку.
FAQ: Частые вопросы по передаче параметров в 1С
Как передать параметр в отчет, если он вызывается из обработки?
Используйте метод Отчет.Параметры = ВашаСтруктураПараметров. Пример:
Отчет = Отчеты.ВашОтчет.Создать();
Параметры = Новый Структура("Период, Организация", ТекущаяДата(), ТекущаяОрганизация());
Отчет.Параметры = Параметры;
Можно ли передать в отчет параметр типа "ТаблицаЗначений"?
Да, но только если схема компоновки поддерживает этот тип. В запросе используйте конструкцию В (&Таблица), где &Таблица — параметр типа ТаблицаЗначений. Пример передачи:
Таблица = Новый ТаблицаЗначений();
Таблица.Колонки.Добавить("Код");
Таблица.Добавить();
Таблица[0].Код = 123;
Параметры.Вставить("ФильтрКоды", Таблица);
Почему отчет не видит передаваемый параметр?
Проверьте:
- Совпадают ли имена параметров в коде и схеме компоновки (с учетом регистра).
- Передается ли параметр до вызова
Скомпоновать(). - Соответствует ли тип передаваемого значения типу параметра в схеме.
Как передать параметр в отчет на СКД (система компоновки данных)?
В СКД параметры передаются через коллекцию ПараметрыКомпоновкиДанных. Пример:
Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройкиПоУмолчанию();
Настройки.ПараметрыДанных.УстановитьПараметр("ДатаНачала", НачалоМесяца(ТекущаяДата()));
Отчет.Скомпоновать(Настройки);
Можно ли передать параметр в отчет через URL (например, для веб-клиента)?
Да, в веб-клиенте 1С параметры можно передавать через строку запроса. Пример URL:
http://server/1c/base?report=Sales¶m1=2026-01-01
В коде отчета параметры читаются из ПараметрыСеанса или ГлобальныйКонтекст.