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