При разработке в среде 1С:Предприятие 8.3, особенно при работе с типовыми конфигурациями, такими как Управление торговлей 11, ERP или Комплексная автоматизация, часто возникает необходимость программно вызвать отчет и передать в него определенные параметры (например, дату или период). Несмотря на кажущуюся простоту функции ОткрытьФорму, работа с Системой компоновки данных (СКД) имеет множество нюансов, связанных с тем, как параметры хранятся в настройках и как они отображаются пользователю.
В этой статье мы подробно разберем, как правильно передавать значения периода в отчеты, использующие СКД, рассмотрим различные способы реализации и проанализируем типичные ошибки, с которыми сталкиваются разработчики.
Прежде чем писать код, важно понять, что в управляемом приложении параметры отчета могут передаваться несколькими способами. Основной механизм взаимодействия с формой отчета строится на заполнении структуры ПараметрыФормы. В зависимости от того, как спроектирован отчет, нам может потребоваться передать данные в:
НачалоПериода и КонецПериода).Отбор, которые накладывают дополнительные фильтры на результат запроса.Разберем наиболее эффективные способы решения задачи.
Для типовых отчетов (таких как «Ведомость по товарам на складах» или «Ведомость по товарам организаций»), которые используют общую форму отчета из БСП (Библиотеки стандартных подсистем), наиболее правильным методом является передача параметров через коллекцию ПользовательскиеНастройки. Это гарантирует, что установленные вами даты не только применятся к запросу, но и корректно отобразятся в полях ввода на форме отчета.
Проанализируем пример кода, который позволяет подготовить параметры для открытия:
// Определяем даты периода
ДатаОстатков = ТекущаяДата();
НачалоПериода = НачалоДня(ДатаОстатков);
КонецПериода = КонецДня(ДатаОстатков);
// Создаем объект СтандартныйПериод, если в отчете используется один параметр типа Период
ВыбранныйПериод = Новый СтандартныйПериод();
ВыбранныйПериод.ДатаНачала = НачалоПериода;
ВыбранныйПериод.ДатаОкончания = КонецПериода;
// Формируем параметры открытия формы
ПараметрыФормы = Новый Структура;
ПользовательскиеНастройки = Новый Структура;
// В типовых отчетах часто параметры называются "Период", "НачалоПериода" или "КонецПериода"
// Мы можем передать их напрямую, если знаем их имена в пользовательских настройках
ПользовательскиеНастройки.Вставить("Период", ВыбранныйПериод);
ПараметрыФормы.Вставить("ПользовательскиеНастройки", ПользовательскиеНастройки);
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ОткрытьФорму("Отчет.ВедомостьПоТоварамНаСкладах.Форма", ПараметрыФормы);
Обратите внимание на параметр СформироватьПриОткрытии. Установив его в значение Истина, мы избавляем пользователя от необходимости нажимать кнопку «Сформировать» вручную — отчет отобразит данные сразу после открытия.
Одной из частых ошибок, как видно из обсуждений, является попытка передать даты начала и окончания по отдельности в параметр, который ожидает тип СтандартныйПериод. Если в настройках СКД параметр Период имеет соответствующий тип, система не сможет обработать простую дату и выдаст ошибку или просто проигнорирует значение.
Рассмотрим ситуацию, когда нам нужно программно заполнить именно сложный объект периода:
ПараметрыФормы = Новый Структура;
ОтборСтруктура = Новый Структура;
// Создаем и заполняем объект типа СтандартныйПериод
ПериодОтчета = Новый СтандартныйПериод;
ПериодОтчета.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод;
ПериодОтчета.ДатаНачала = НачалоМесяца(ТекущаяДата());
ПериодОтчета.ДатаОкончания = КонецМесяца(ТекущаяДата());
// Передаем объект целиком в структуру отбора или параметров
ОтборСтруктура.Вставить("Период", ПериодОтчета);
ПараметрыФормы.Вставить("Отбор", ОтборСтруктура);
ОткрытьФорму("Отчет.ВедомостьПоТоварамОрганизаций.Форма", ПараметрыФормы);
Важно помнить: если вы используете Отбор, убедитесь, что в самом отчете поле «Период» доступно для фильтрации. Если же это параметр данных, его следует передавать через ключ Параметры.
Бывают случаи, когда необходимо открыть отчет и жестко ограничить возможность изменения периода пользователем. В этом случае мы используем ФиксированныеНастройки. Эти настройки накладываются «поверх» пользовательских и не могут быть изменены в интерфейсе без правки программного кода.
Проанализируем, как это реализовать:
ОтчетИмя = "ВедомостьПоТоварамНаСкладах";
ФормаОтчета = ПолучитьФорму("Отчет." + ОтчетИмя + ".Форма");
// Получаем текущую схему и настройки
Схема = Отчеты[ОтчетИмя].ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;
// Находим параметр "Период" и устанавливаем значение
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если ПараметрПериод <> Неопределено Тогда
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоДня(Объект.Дата), КонецДня(Объект.Дата));
ПараметрПериод.Использование = Истина;
КонецЕсли;
// Устанавливаем фиксированные настройки в форму
ФормаОтчета.Отчет.КомпоновщикНастроек.ЗагрузитьФиксированныеНастройки(Настройки);
ФормаОтчета.Открыть();
Этот метод более трудозатратный, так как требует предварительного получения формы объекта, но он дает максимальный контроль над поведением отчета.
Выясним причины, по которым отчет может открываться некорректно или выдавать ошибки при попытке изменить период вручную после программного открытия:
Дата, а вы передаете СтандартныйПериод (или наоборот), возникнет ошибка при попытке формирования. Всегда проверяйте тип параметра в Конфигураторе.Элементы[1]) — плохая практика. Состав настроек может измениться при обновлении конфигурации или изменении варианта отчета пользователем. Всегда используйте поиск по имени параметра.Период, а в другом — пара параметров НачалоПериода и КонецПериода. Проанализируйте закладку «Параметры» в СКД конкретного отчета перед написанием кода.КлючВарианта в параметрах формы. Это поможет системе правильно сопоставить передаваемые параметры с выбранным вариантом отчета.Резюмируя: для большинства задач в современных конфигурациях достаточно использовать структуру ПараметрыФормы с вложенной структурой ПользовательскиеНастройки. Это наиболее «мягкий» способ, который сохраняет интерактивность отчета и корректно заполняет данные в интерфейсе.