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